из or_log_all_proc, or_proc, or_log, Patient
blockquote>Ваш SELECT не содержит критериев объединения , поэтому он будет генерировать продукт из все записи из трех из этих таблиц и набор результатов любой таблицы фильтруются предложениями LIKE. Это корень вашей проблемы с производительностью.
Решение довольно простое. Правильно объединяйте таблицы, используя соответствующие ключевые столбцы.
Кстати, это преимущество использования синтаксиса соединения ANSI 92. Делая тип объединения явным, мы должны написать CROSS JOIN, если мы действительно хотим сгенерировать продукт, и не позволяет нам сделать это случайно.
Ожидать, что LIKE '% any%' будет быстрым, также бесполезно
blockquote>До определенного момента. Скорее всего, это полное сканирование таблицы, но это индексированный столбец, тогда мы можем получить полное быстрое сканирование. Даже если это просто FTS, это не обязательно катастрофично, особенно если стол маленький или нарро. Как с большинством задач настройки, это действительно зависит от деталей.
При разработке RESTful API следует проявлять осторожность при объединении GET и POST, как если бы они были одним и тем же. Эту ошибку легко допустить с помощью Django представлений на основе функций и диспетчера по умолчанию CherryPy , хотя обе структуры теперь позволяют решить эту проблему ( представления на основе классов и MethodDispatcher соответственно).
HTTP-команды очень важны в REST, и если вы не будете очень осторожны с этим, вы в конечном итоге попадают в антипаттерн REST .
Некоторые структуры, которые понимают это правильно, - это web.py , Flask и Bottle ]. В сочетании с библиотекой mimerender (полное раскрытие: я написал это), они позволяют писать удобные веб-службы RESTful:
import web
import json
from mimerender import mimerender
render_xml = lambda message: '<message>%s</message>'%message
render_json = lambda **args: json.dumps(args)
render_html = lambda message: '<html><body>%s</body></html>'%message
render_txt = lambda message: message
urls = (
'/(.*)', 'greet'
)
app = web.application(urls, globals())
class greet:
@mimerender(
default = 'html',
html = render_html,
xml = render_xml,
json = render_json,
txt = render_txt
)
def GET(self, name):
if not name:
name = 'world'
return {'message': 'Hello, ' + name + '!'}
if __name__ == "__main__":
app.run()
Логика службы реализуется только один раз, и выбор правильного представления (заголовок Accept) + отправка в соответствующую функцию визуализации (или шаблон) выполняется аккуратно и прозрачно.
$ curl localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/html" localhost:8080/x
<html><body>Hello, x!</body></html>
$ curl -H "Accept: application/xml" localhost:8080/x
<message>Hello, x!</message>
$ curl -H "Accept: application/json" localhost:8080/x
{'message':'Hello, x!'}
$ curl -H "Accept: text/plain" localhost:8080/x
Hello, x!
Обновление (апрель 2012 г.) : добавлена информация о представлениях на основе классов Django, структурах CherryPy MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос.
s Фреймворки MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос. s Фреймворки MethodDispatcher и Flask и Bottle. Ни того, ни другого не существовало, когда был задан вопрос.Я не эксперт по миру Python, но я использовал django, который является превосходной веб-платформой и может использоваться для создания успокоительной платформы.
Мне действительно нравится CherryPy. Вот пример успокоительного веб-сервиса:
import cherrypy
from cherrypy import expose
class Converter:
@expose
def index(self):
return "Hello World!"
@expose
def fahr_to_celc(self, degrees):
temp = (float(degrees) - 32) * 5 / 9
return "%.01f" % temp
@expose
def celc_to_fahr(self, degrees):
temp = float(degrees) * 9 / 5 + 32
return "%.01f" % temp
cherrypy.quickstart(Converter())
Это подчеркивает что я действительно приблизительно как CherryPy; это - абсолютно рабочий пример, это очень понятно даже кому-то, кто не знает платформу. Если Вы выполняете этот код, то можно сразу видеть результаты в веб-браузере; например, посещение http://localhost:8080/celc_to_fahr?degrees=50 отобразится 122.0
в Вашем веб-браузере.
Посмотрите веб-Платформы Python Wiki.
Вам, вероятно, не нужны полные платформы стека, но остающийся список все еще довольно длинен.
Мы используем Django для УСПОКОИТЕЛЬНЫХ веб-сервисов.
Обратите внимание, что - из поля - у Django не было достаточно мелкомодульной аутентификации для наших потребностей. Мы использовали интерфейс Django-REST, который помог много. [Мы с тех пор прокрутили наше собственное, потому что мы сделали столько расширений, что это стало кошмаром обслуживания.]
У нас есть два вида URL: URL "HTML", которые реализуют ориентируемые на пользователя страницы HTML, и "json" URL, которые реализуют веб-сервисы, ориентировал обработку. Наши функции представления часто похожи на это.
def someUsefulThing( request, object_id ):
# do some processing
return { a dictionary with results }
def htmlView( request, object_id ):
d = someUsefulThing( request, object_id )
render_to_response( 'template.html', d, ... )
def jsonView( request, object_id ):
d = someUsefulThing( request, object_id )
data = serializers.serialize( 'json', d['object'], fields=EXPOSED_FIELDS )
response = HttpResponse( data, status=200, content_type='application/json' )
response['Location']= reverse( 'some.path.to.this.view', kwargs={...} )
return response
Причем точка - то, что полезная функциональность учтена из этих двух презентаций. Презентация JSON является обычно всего одним объектом, который требовали. Презентация HTML часто включает все виды средств для навигации и других контекстных подсказок, которые помогают людям быть продуктивными.
jsonView
функции все очень похожи, который может быть немного раздражающим. Но это - Python, поэтому сделайте их частью вызываемого класса или запишите декораторам, если это помогает.
Я настоятельно рекомендую TurboGears или Bottle:
TurboGears:
Bottle :