Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #52, МАРТ 2005 г.

Сделаем это по-быстрому

Заратустра

Спецвыпуск: Хакер, номер #052, стр. 052-040-5


Что выбрать?

Ниже аргументы в пользу того или иного способа. Выбирай сам в зависимости от ситуации.

Достоинства JOIN:

- Если запрос содержит условие WHERE, встроенный оптимизатор БД будет оптимизировать запрос в целом, в то время как в случае использования подзапросов запросы будут оптимизироваться отдельно.

- Некоторые БД более эффективно работают с JOINs, нежели с подзапросами (например, Oracle).

- После JOIN’а информация окажется в общем "списке", что нельзя сказать про подзапросы.

Достоинства SUBQUERIES:

- Подзапросы допускают более свободные условия.

- Подзапросы могут содержать GROUP BY, HAVING, что намного сложнее реализовать в JOIN’ах.

- Подзапросы могут использоваться при UPDATE, что невозможно при использовании JOIN’ов.

- В последнее время оптимизация подзапросов самими БД (их встроенным оптимизатором) заметно улучшилась.

Основное преимущество JOIN’ов в том, что не надо указывать БД то, каким именно способом производить операцию. А основное преимущество подзапросов в том, что цикл подзапроса может иметь несколько итераций (повторений), что, в свою очередь, может существенно увеличить производительность.

Заключение

В этой статье показаны самые распространенные способы увеличения производительности SQL-запросов. Тем не менее, чтобы оптимизировать запросы, есть еще очень много разных уловок и трюков. Оптимизация запросов больше похожа на искусство, чем на науку. У каждой базы данных свои встроенные оптимизаторы, которые могут помочь в этом нелегком деле, но всю работу за тебя никто не сделает. Как говорил старенький преподаватель по физике: "Чтобы решать задачи, их нужно решать".

Не рекомендуется использовать ORDER BY в связке с такими операциями, как DISTINCT или GROUP BY, потому что данные операторы могут создавать побочные эффекты для сортировки. Как следствие, ты можешь получить неправильно отсортированный набор данных, который может оказаться критическим в некоторых ситуациях. Такое следствие не относится к оптимизации, но забывать о нем не стоит.

Прежде чем повышать производительность сети и наращивать аппаратные средства сервера, попробуй сделать оптимизацию.

У любой SQL-операции есть "коэффициент полезности". Чем выше коэффициент, тем "полезней" операция: запрос выполняется быстрее.

В отличие от компиляторов, не все БД умеют упрощать выражения типа x=1+1-1-1 до x=0. Следовательно, они тратят драгоценное время на выполнение пустых операций. Оптимизируй их заранее.

При использовании функции SUM() можно добиться большей производительности с помощью SUM(x + y), а не SUM(x) + SUM(y).

Но если функции SUM() требуются для вычитания, используй противоположное: SUM(x) – SUM(y). SUM(x – y) работает медленнее.

У каждой БД есть свои встроенные оптимизаторы, но они далеки от совершенства. Поэтому оптимизируй заранее.

Назад на стр. 052-040-4  Содержание