RedShift - Почему вы не должны сжимать столбец sortykey? - PullRequest
0 голосов
/ 01 мая 2020

Я знаю, что эксперты могут предложить это, даже если я приму это как лучшую практику (Прочитайте это из AWS Блог), в Github есть очень глубокая справка по этому поводу, но все же я Я запутался с этим термином. It'll affect the range-restricted scan и не в состоянии понять эту концепцию.

Может кто-нибудь привести пример, поясняющий, почему мы не должны использовать сжатие в столбце ключа сортировки?

1 Ответ

0 голосов
/ 02 мая 2020

Таким образом, реальность состоит в том, что простые исполняемые ответы часто бывают не идеальными, а лучшим эмпирическим правилом. Вы говорите, что прочитали документы, поэтому я не буду go в деталях. Предположение, лежащее в основе этой рекомендации, заключается в том, что ключ сортировки также является общим предложением where во многих запросах. Это важно для понимания рекомендации, но в целом это правда. У меня много запросов с «где date_col> getdate () - интервал« 1 год »», из которого вы решаете сделать ключ сортировки таблицы «date_col» - очень типично.

Теперь при запуске этого типа запроса узел-лидер Redshift проверит условие where по метаданным блока для столбца date_col. Какие бы блоки не имели желаемых дат внутри них, эти блоки "совпадают". Теперь вы будете смотреть на данные и для других столбцов. Чтобы получить необходимые блоки для этих столбцов, Redshift использует другую часть метаданных для столбца date_col, а именно диапазон номеров строк, которые находятся в каждом соответствующем блоке. Эти диапазоны номеров строк используются для поиска блоков для других столбцов на основе метаданных для этих столбцов. Я надеюсь, что это имеет смысл - найдите блоки, которые соответствуют предложению where, затем найдите блоки в других столбцах. Все это не для чтения блоков, которые не нужны для запроса.

Теперь для примера - если у вас есть таблица с 2 столбцами: 1) столбец ключа сортировки представляет собой INT, и 2) большой varchar , Оба сжаты. Теперь первый столбец (INT) находится в порядке сортировки и будет сильно сжат. Допустим, этот столбец умещается в 1 блок. Другой столбец (большой varchar) занимает 10 блоков. Мы выполняем наш запрос с предложением where в столбце INT, он соответствует 1 блоку, но не номера строк, необходимые в другом столбце, приводят к получению всех 10 блоков. Нет экономии на пропускной способности чтения диска. Но если столбец INT не сжат, он займет больше блоков - скажем, 8 блоков. Тот же запрос будет соответствовать только одному из 8 блоков столбца INT, а перекрестная ссылка номера строки на столбец varchar может совпадать только с 3 из 10 блоков для этого столбца. Теперь мы сократили данные, считанные с диска.

Надеюсь, это имеет смысл. Вы можете видеть, что за этой рекомендацией стоит ряд предположений, которые чаще всего бывают верными. Без этих предположений трудно понять, почему они так говорят. А именно, что ваш ключ сортировки является вашим общим условием where, что сжатие столбца sortkey будет намного лучше, чем в других столбцах, и что данные, хранящиеся в sortkey, меньше, чем данные в других столбцах. И несколько других, но менее центральных.

Помогло ли это?

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