optimize_and_compare_chain
<, <=, >, >=, = и их сочетания. Например, (a < b) AND (b < c) AND (c < 5) будет преобразовано в (a < b) AND (b < c) AND (c < 5) AND indexHint(b < 5) AND indexHint(a < 5). Производные сравнения оборачиваются в indexHint: они участвуют в анализе индексов (первичный ключ, ключ партиционирования, индексы пропуска данных) и сокращают набор данных для чтения, но не требуют затрат на обработку каждой строки и не влияют на PREWHERE. Сравнение, выведенное через выражения разных таблиц, остаётся исполнимым ((t1.a < t2.b) AND (t2.b < 5) выводит обычное t1.a < 5): это единственное условие, которое можно передать ниже JOIN, где оно фильтрует входные данные JOIN, недоступные исходной цепочке. Производные сравнения, противоречащие существующему условию, также добавляются как обычные условия, поэтому AND сворачивается в false.
optimize_and_compare_chain_max_hash_work
optimize_and_compare_chain на этапе анализа запроса, измеряемый количеством узлов дерева запроса, хешируемых функцией getTreeHash (это основная стоимость данной оптимизации). Как только при применении этой оптимизации запрос хеширует больше узлов, чем задано этим значением, она перестаёт применяться для оставшейся части запроса. Это ограничивает время анализа для запросов с очень большим числом или очень длинными цепочками сравнений, объединённых AND, где иначе эта оптимизация может занимать основное время анализа, не давая никакого эффекта свёртки. Преждевременная остановка всегда безопасна: она лишь означает отказ от оптимизации и никогда не меняет результаты. Установите 0, чтобы отключить бюджет (без ограничений).