По моему опыту, реальная проблема связана не столько с общей производительностью запросов, которую я считаю хорошей во всех основных базах данных, которые я пробовал, чем с тем, как пишутся запросы.
Я потерял счет, сколько раз я видел огромные запросы отчетов с огромным количеством объединений и встроенных агрегатов подзапросов повсюду.
Вне головы, типичные шаги, чтобы сделать эти вещи быстрее:
Используйте оконные функции там, где они доступны и применимы (т. Е. Оператор over ()
). Абсолютно бессмысленно многократно повторять данные.
Используйте общие табличные выражения (with
запросы), где они доступны и применимы (т.е. наборы, которые, как вы знаете, будут достаточно малы).
Используйте временные таблицы для больших промежуточных результатов и создайте для них индексы (и проанализируйте их) перед их использованием.
Работайте с небольшими наборами результатов, фильтруя строки раньше, когда это возможно: select id, aggregate from (aggregate on id) where id in (?) group by id
можно сделать намного быстрее, переписав его как select id, aggregate from (aggregate on id where id in (?)) group by id
.
Используйте union/except/intersect all
вместо union/except/intersect
, где это применимо. Это устраняет бессмысленную сортировку наборов результатов.
В качестве бонуса все первые три шага делают запросы отчета более удобочитаемыми и, следовательно, более легкими в обслуживании.