У нас есть таблица со 120M строками (более 2222 микроперегородок), которая имеет 2 важных столбца, record_id со значениями в формате prefix|<account_id>|<uuid>
(уникальный) и столбец account_id, который имеет значение <account_id>
.Обратите внимание, что префикс одинаков для всех записей.Затем, конечно, некоторые столбцы факта, но это не имеет значения.
Снежинка показывает идеальную кластеризацию для столбца record_id (автоматически выбирается SF, не указывается указанная нами кластеризация) с помощью функции clustering_information:
"total_partition_count" : 2222,
"total_constant_partition_count" : 2222,
"average_overlaps" : 24.0,
"average_depth" : 25.0,
Однако для столбца account_id кластеризация очень плохая
"total_constant_partition_count" : 0,
"average_overlaps" : 2221.0,
"average_depth" : 2222.0,
Существует около 130 различных идентификаторов учетных записей, что означает, что в среднем записи одного account_id должны содержать более 17 разделов.Даже если снежинка кластеризуется по records_id, начало этого столбца (prefix|<account_id>
) соответствует столбцу account_id.Таким образом, записи с одинаковым account_id должны заканчиваться в тех же разделах.Поэтому я не могу понять, почему для столбца account_id перекрытие микроперегородок составляет 100%.Это похоже на то, что снежинка использовала странную сортировку для столбца record_id и, таким образом, разбросала строки каждой учетной записи по всем разделам.Возможно ли это?
Это отрицательно сказывается на производительности, поскольку выполнение запроса с фильтром account_id приводит к проверке всех разделов.
Примечание. Этот вопрос также задавался на форуме снежинок https://support.snowflake.net/s/question/0D50Z00008vfglCSAQ/2-correlated-columns-have-very-different-clustering-information-one-has-perfect-the-other-has-terrible