2016-03-16 3 views
0
SELECT 
    a.id, 
    b.url as codingurl 
FROM fact_A a 
INNER JOIN dim_B b 
ON strpos(a.url,b.url)> 0 
  • Записи графа в Fact_A: 2 миллиона
  • отчеты графа в Dim_B: 1500
  • Время, затраченное на выполнение: 10 минут
  • Нет Узлов: 2

Может ли кто-нибудь помочь мне с пониманием того, почему вышеуказанный запрос занимает больше времени для выполнения?Redshift - Запрос проблемы производительности

Мы объявили ключ распределения в Fact_A для надлежащего распределения записей равномерно в обоих узлах, а также Ключ сортировки создается по URL-адресу в Fact_A.

Таблица Dim_B создана с использованием DISTRIBUTION ALL.

+0

Вы можете дать больше информации, в частности, какие узлы вы используете, сколько узлов в вашем кластере и схеме таблиц A и B –

+1

Что вы подразумеваете под термином «почему вышеупомянутый запрос занимает больше времени для выполнения»? Больше времени, чем что? Или вы просто говорите, что хотите быстрее? Помните, что нужно выполнить 3-миллиардные сравнения строк, а 'strpos' не является эффективным способом объединения таблиц по сравнению с обычными сравнениями (например, = <, > =). –

+0

Можете ли вы предоставить некоторые образцы значений для 'a.url' и' b.url', которые используются с 'strpos'? Возможно, более эффективный способ выполнить запрос. –

ответ

0

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

В зависимости от того, какие URL-адреса находятся в dim_B, вы можете оптимизировать это, извлекая префиксы в отдельные столбцы. Например, если вы всегда сравниваете подпапки формы http [s]: // hostname/part1/part2/part3, вы можете извлечь «part1/part2/part3» в качестве отдельного столбца как fact_A, так и dim_B и сделать это dist и сортировать ключи.

Вы также можете положиться на параллелизм Redshift. Если вы измените размер своего кластера с двух узлов на 20 узлов, вы увидите немедленное повышение производительности в 8-10 раз, так как этот запрос может выполняться каждым узлом параллельно (по большей части).