Производительность БД SQL и повторные запросы через короткие промежутки времени - PullRequest
2 голосов
/ 22 февраля 2011

Если запрос постоянно отправляется в базу данных через короткие промежутки времени, скажем, каждые 5 секунд, может ли количество созданных чтений вызвать проблемы с точки зрения производительности или доступности? Если база данных Oracle, есть ли какие-нибудь хитрости, которые можно использовать, чтобы избежать снижения производительности? Если запросы поступают из приложения, есть ли способ уменьшить влияние за счет разработки программного обеспечения?

Ответы [ 3 ]

3 голосов
/ 22 февраля 2011

Если ваш запрос не является слишком интенсивным или ужасно написанным, он не вызовет каких-либо заметных проблем, запускаемых раз в несколько секунд. Это не очень часто для запросов, которые обычно измеряются в миллисекундах.

Возможно, вы все же захотите оптимизировать его, просто потому, что есть лучшие способы сделать это. В Oracle и ADO.NET вы можете использовать OracleDependency для команды, которая впервые выполнила запрос, а затем подписаться на ее событие OnChange, которое будет вызываться автоматически всякий раз, когда базовые данные приводят к изменению результатов запроса.

2 голосов
/ 22 февраля 2011

В соответствии с предложением Самуила, Oracle предоставляет в JDBC средства для уведомления об изменении базы данных , чтобы ваше приложение могло подписываться на изменения в базовых данных, а не повторять запрос каждые несколько секунд. Если данные изменяются реже, чем вы выполняете запрос, это может существенно повысить производительность.

Другой вариант - использовать Oracle TimesTen в качестве кэша в памяти данных на машинах среднего уровня. Это уменьшит количество обращений к сети и будет проходить через очень оптимизированный путь поиска.

Наконец, я хотел бы взглянуть на использование кэша результатов запроса , чтобы Oracle кэшировал результаты.

2 голосов
/ 22 февраля 2011

Это зависит от запроса. Я предполагаю, что причина, по которой вы хотите выполнять его периодически, заключается в том, что возвращаемые данные будут часто меняться. Если это так, то кэширование на уровне приложения, очевидно, не вариант.

В прошлом этот запрос был "большим" с точки зрения количества возвращаемых строк, объединенных таблиц, агрегированных / вычисленных данных? Если это так, это может быть проблемой, если:

  1. Вы запрашиваете быстрее, чем требуется для выполнения запроса. Если вы вызываете его раз в секунду, но для его запуска требуется 2 секунды, это станет проблемой.

  2. Если запрос касается большого количества данных, и у вас есть много других запросов, обращающихся к тем же таблицам, вы можете столкнуться с проблемами повышения блокировки.

Как и в большинстве вопросов о производительности, единственным реальным ответом является тестирование. В этом случае тест с реалистичными данными в БД и запускает этот запрос одновременно с другой нагрузкой, ожидаемой в системе.

...