таблице мы добавляем новые строки или изменяем старые, то они перестают участвовать в селектах, т.к. выходят из кластера?
В селектах будут участвовать, просто после апдейтов пропадёт гарантия отсортированности кортежей в таблице по заданному индексу. Заново прогонять CLUSTER надо, только если хотите заново отсортировать все кортежи. Но это очень дорогая операция + блокировка таблицы. Обычно есть смысл кластеризовать только справочники, которые почти никогда не меняются.
Если они участвуют, то получается что БД всё равно сканирует всю таблицу? В чём тогда профит?
Сканирует или нет - это от запроса зависит, от индексов, от статистики
Кейсы для профита от CLUSTER описаны прямо в документации для этой команды https://postgrespro.ru/docs/postgresql/16/sql-cluster Если в двух словах, можно уменьшить количество вычитываемых страниц с диска
В корреляции (с каким-то индексом), очевидно (ну и в том, что это аналог VACUUM FULL). Т.е. сортировка и выбор диапазонов по этому мультиключу работает быстрее.
Получается кластеризованные страницы находятся в чётко обозначенной области, и если мы берём id = 5, то после вычитывания данных из зоны кластера мы можем пропустить остальные кластеризованные страницы и перейти к проверке не кластеризованных сократив обращения к диску на ненужных кластеризованных страницах?
нет. если речь о seq scan, то нужно будет просканировать всю таблицу. никакой "зоны кластера" в таблице нет.
А норм идея наверное 😂
Обсуждают сегодня