Некоторые приложения полностью контролируют запросы, которые они выдают; запросы встроены в приложения. Другие приложения позволяют пользователям создавать запросы, заполняя поля формы. Каждый раз, когда вы позволяете пользователям создавать специальные запросы, вы рискуете, что запрос, который создаст пользователь, будет выглядеть следующим образом:
SELECT * FROM ExtremelyHugeTable
ORDER BY unIndexedColumn
В этом операторе нет предложения WHERE
. Это потребует полного сканирования таблицы. Что еще хуже, Дерби придется заказывать данные. Скорее всего, пользователь не хочет просматривать все 100 000 строк, и ему все равно, все ли строки в порядке.
Делайте все возможное, чтобы избежать сканирования таблиц и сортировки больших результатов (таких как сканирование таблиц).
Некоторые вещи, которые вы можете сделать, чтобы запретить такие неуправляемые запросы:
- Используйте проверку на стороне клиента, чтобы убедиться, что некоторые минимальные поля всегда заполнены. Удалите или запретите запросы, которые не могут использовать индексы и не поддаются оптимизации. Другими словами, принудительно используйте оптимизируемое предложение
WHERE
, убедившись, что столбцы, по которым строится индекс, включены в предложениеWHERE
запроса. Уменьшите или запретите использование предложенийDISTINCT
(которые часто требуют сортировки) в больших таблицах. - Для запросов с большими результатами не позволяйте базе данных выполнять упорядочение. Извлекайте данные порциями (предоставьте кнопку «Далее», чтобы пользователь мог получить следующую порцию, если это необходимо) и упорядочивайте данные в приложении.
- Не используйте
SELECT DISTINCT
для заполнения списков; вместо этого поддерживайте отдельную таблицу уникальных предметов.