Отмена использования индексов в больших пакетных операциях

Использование готовых процедур

Долгие операции сортировки

Недостатки использования выражения с ключевым словом HAVING

Выражение с ключевым словом HAVING оказывается очень полезным, но за все нужно платить. Использование выражения с ключевым словом HAVING загружает оптимизатор дополнительной работой, что выливается в дополнительные затраты времени. Если это возможно, то желательно переписать оператор SQL таким образом, чтобы выражения с ключевым словом HAVING в нем не было.

Долгие операции сортировки являются следствием использования выражений с ключевыми словами ORDER BY, GROUP BY и HAVING. При выполнении сортировки соответствующие подмножества данных сохраняются в оперативной памяти или на диске (когда оперативной памяти для этого не хватает). Сортировать данные приходится часто. Здесь главным моментом является то, что операции сортировки увеличивают время выполнения запроса.

Для часто используемых операторов SQL – в частности, для больших транзакций или сложных запросов – удобно создать и хранить готовые процедуры. Такие процедуры представляют собой просто набор операторов SQL, откомпилированных и сохраненных в базе данных в готовом виде.

При обработке любого оператора SQL база данных должна проверить его синтаксис и транслировать этот оператор в выполняемый формат, что обычно называют синтаксическим анализом оператора (parsing). После выполнения синтаксического анализа (один раз) оператор в выполняемой форме сохраняется в оперативной памяти, но не навсегда. Это значит, что при необходимости использовать занятую оператором память для других целей, база данных может этот оператор из памяти удалить. В случае же хранимой процедуры ее операторы в выполнимом формате оказываются доступными всегда и остаются таковыми до тех пор, пока процедура не будет удалена из базы данных подобно любому другому объекту.

При выполнении пользователем транзакций (INSERT, UPDATE или DELETE) происходят обращения как к таблице, так и ко всем ее индексам, которые должны быть в результате транзакций изменены. Это значит, что если пользователь изменяет данные таблицы EMPLOYEE и у этой таблицы имеется индекс, то автоматически изменяется и этот индекс. В рамках оператора транзакции тот факт, что при каждом изменении таблицы изменяется и ее индекс, не отражается.

Но при больших пакетных операциях изменение индексов может существенно затормозить скорость выполнения таких операций. Пакетные операции могут состоять из сотен, тысяч и даже миллионов операторов манипуляций данными или транзакций. Из-за таких объемов работы, пакетные операции обычно выполняются в то время, когда загрузка системы минимальна – чаше всего в ночные часы или выходные. Чтобы уменьшить время выполнения больших пакетных операций – а нередко это означает сокращение времени их выполнения, например, с 12 до 6 часов – рекомендуется на время работы пакета удалить все индексы используемых в пакете таблиц.

После удаления индексов изменения в таблицы будут внесены значительно быстрее и вся работа в целом займет меньше времени. После завершения работы индексы следует построить вновь. В результате построения новых индексов они будут пополнены информацией о добавленных или измененных записях. Хотя для построения индексов больших таблиц может понадобиться довольно много времени, в общем, этот метод все равно более выгоден.