Всё о GUC по порядку: enable_distinct_reordering и enable_group_by_reordering
Автор: Christophe Pettus, All Your GUCs in a Row: enable_distinct_reordering and enable_group_by_reordering
Два самых молодых члена семейства enable_* и естественная пара: оба позволяют планировщику переупорядочивать ключи многоключевой операции, чтобы удешевить сортировку, и оба включены по умолчанию, имеют контекст user и несут предостережение семейства enable_* из enable_async_append — диагностические зонды, а не производственные регулировочные ручки.
Идея, стоящая за обоими, одна и та же, и она хороша. Когда вы пишете GROUP BY a, b, c или SELECT DISTINCT a, b, c, порядок, в котором вы перечислили эти столбцы, не несёт семантического смысла, — группировка и поиск уникальных значений дают один и тот же результат независимо от того, какой ключ сравнивается первым. Но порядок имеет огромное значение для стоимости. Если операция выполняется путём сортировки, сравнение сначала дешёвого для сравнения столбца с высокой кардинальностью означает, что большинство сравнений завершаются на первом ключе и никогда не затрагивают остальные; начните с дорогого текстового столбца с учётом локали, и вы заплатите стоимость его сравнения для каждой строки. А если другая часть запроса — ORDER BY, индекс, уже выдающий строки в определённом порядке, — хочет получить данные, отсортированные определённым образом, согласование с этим порядком позволяет планировщику повторно использовать сортировку, которую он всё равно собирался выполнить, или полностью пропустить её с помощью incremental sort. Таким образом, планировщик, получив свободу переставлять ключи, порядок которых не влияет на корректность, иногда может найти значительно более дешёвую схему, чем та, которую вы написали.
Обе оптимизации имеют важное свойство безопасности, которое стоит чётко сформулировать: они всегда сохраняют указанный вами порядок как один из кандидатов, исходя из предположения, что вы можете знать что-то, чего не знает планировщик. Переупорядочение — это то, что планировщик может сделать, если найдёт более дешёвую перестановку, а не то, что он навязывает вам.
Продолжить чтение "Всё о GUC по порядку: enable_distinct_reordering и enable_group_by_reordering"

