Что является эффективной альтернативой LIMIT? - PullRequest
0 голосов
/ 11 февраля 2019

Мой вопрос в основном таков: как я могу указать моей базе данных выполнить сканирование seq и STOP после первого совпадения с моим условием WHERE?

Если я хочу найти первое событие определенного типа, ямог бы написать следующий запрос:

select *
from installs
where country = 'China' 
order by install_date
limit 1

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

Я, конечно, мог бы фильтровать по определенным датам, но давайте предположим, что я не знаю, какой период фильтровать, - как я могу оптимизировать этот тип запроса в Amazon Redshift(что-то в предложении where может быть)?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Общая стратегия Redshift - много сканировать, но распараллеливать.Любой случай, который включает получение единственного ряда, не будет идеальным.Тем не менее, вы можете сделать четыре вещи:

1.Снизить сканирование до точки

Если страна всегда будет фильтроваться по полю, сначала установите в качестве ключа сортировки для таблицы составной ключ сортировки по стране.

2.Избавьтесь от необходимости сортировки

Более эффективный способ сделать ORDER BY x LIMIT 1 часто МАКС.

Затем попробуйте

SELECT *
FROM installs
WHERE pk = (
  SELECT MAX(pk)  -- or install_date, if install date is unique
  FROM installs
  WHERE country = 'China'
)

3.Адаптируйте выбранные столбцы между ориентированными на строки и столбчатыми

При запросе столбчатой ​​базы данных, такой как Redshift, для выбора * несет затраты для каждого столбца.Попробуйте выбрать только нужные вам столбцы.

4.Добавьте больше узлов, чтобы каждый узел меньше сканировал

(убедитесь, что для данных не задан стиль распространения всех)

0 голосов
/ 11 февраля 2019

Если вы удалите ORDER BY, то он может работать эффективно.

Требование сортировки результатов означает, что необходимо изучить все строки, где находится страна Китай, что неэффективно для возврата одного элемента..

Предложение where country = 'China' действует, если SORTKEY = country, поскольку оно может пропускать любые блоки хранения, которые не содержат желаемого значения.Это будет очень эффективно, если найдется очень мало подходящих строк.

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

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