.
В далеком посте , который рассказывал про оптимизацию с помощью условий
WHEREвсё уже было сказано и вот второй раз наступил на грабли (пока еще нет, но мог бы 🔨).
.
Также недавно прошел курс по GreenPlum, конспект можно найти тут. В числе прочего была рассмотрена тема оптимизации, где отмечено:
Признаки неоптимального SQL-запроса:
- лишние сортировки
- distinct
- union вместо union all
- Условия join, содержащие неравенства или OR (тк будет использован Nested Loop )
- Неоптимальные фильтры по ключу партицирования (явное использование ключа без преобразований)
- Неоптимальные фильтры по полям, входящим в индексы:
-В Greenplum версии 6 индексы B-tree, построенные на значениях функции от значений полей, используются в запросах с фильтрами только при построении плана Postgres.
-При построении плана запроса GPORCA использование в фильтрах любых функций от полей, по которым построены индексы на таблицу, исключает использование индексов и приводит к неоптимальному выполнению запроса.
.
Тк много работаю с Clickhouse, я думал он не такой, он же быстрый🚀, но не тут-то было. В работе использую планировщик
explain у него есть ряд опций, например:-
estimate показывает сколько будет прочитано строк, засечек индекса и тдВ одном из запросов была такая конструкция:
WHERE datetime >= '2024-01-15' and datetime < toDate('2024-01-15') + INTERVAL '1 day'
.
Кажется, слишком много букв, переписал так:
WHERE toDate(datetime) = '2024-01-15'
И запрос начал выполняться чуть дольше, стоит отметить что таблица партицинирована по месяцам.
Вывод
explain estimate для первого случая rows = 24064519Для второго
rows = 312864901 (будет прочитана вся таблица 😱)Итог: используйте планировщик, много интересного он может рассказать - ClickHouse Explain
#optimization #clickhouse