Снежинка: 2 коррелированных столбца имеют очень разную информацию о кластеризации (один имеет идеальный, другой ужасный) - PullRequest
0 голосов
/ 02 марта 2019

У нас есть таблица со 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

1 Ответ

0 голосов
/ 06 марта 2019

В функциях отчетов о кластеризации в Snowflake, подобных описанным выше, есть ограничение, что для оценки глубины кластеризации учитываются только первые 6 символов varchar.Поэтому я бы не стал доверять отличным результатам, сообщенным для record_id, поскольку первые 6 символов могут быть идентичными из-за префикса, даже если последующие account_id являются случайными.

Лучшим решением было бы явное объявление кластеризации по account_id и активация авто-кластеризации по таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...