Выберите из широкой таблицы в красном смещении с предложением где в любом столбце - PullRequest
0 голосов
/ 17 января 2019

У меня сверхширокая таблица с сотнями столбцов в красном смещении. Эта таблица больше похожа на матрицу. Одна строка на пользователя с 1 или 0 в каждом столбце в зависимости от определенных функций пользователя. Цель состоит в том, чтобы получить лучшее время ответа на выбранный SQL из этой таблицы. Мы ожидаем, что общее количество строк в таблице составит около 160 млн., А выбор вернет около 30 млн. Строк. Выбор обычно основан на одном из столбцов, равном 1.

таблица выглядит как user_id, col1, col2.....col100

например:

select * from table 1 where col10=1;

Затем с этим результирующим набором пользовательский интерфейс будет изображать пересекающихся пользователей между несколькими столбцами. В настоящее время производительность очень плохая. Какие параметры distkey или sortkey улучшат производительность запросов?

1 Ответ

0 голосов
/ 18 января 2019

Любой оператор SELECT, который возвращает 30 миллионов строк, будет всегда давать плохую производительность.

Учитывая, что оператор WHERE может находиться в любом из сотен логических столбцов, его нельзя оптимизировать с помощью SORTKEY. Однако основной причиной медленного ответа будет необходимость вернуть миллионы строк.

Redshift отлично подходит, если вы выполняете вычисления для миллионов (или даже миллиардов) строк, например:

SELECT COUNT(*) FROM table1 WHERE col10 = 1;

Это вернет одну строку.

Однако SELECT * вернет миллионы строк, каждая с сотнями столбцов, поэтому вы сталкиваетесь с задержкой в ​​сети от базы данных до вашего клиента. Это много данных вы пытаетесь отправить вниз.

Было бы полезно, если бы вы запросили только интересующий столбец, например:

SELECT user_id FROM table1 WHERE col10 = 1;

однако это все равно вернет много данных.

Итак, если вам действительно нужно, чтобы все эти строки вернулись, вам может понадобиться создать некую форму слоя кэширования для локального хранения этих данных.

...