2015-10-26 2 views
1

Я пытаюсь найти некоторую информацию вокруг оптимизации запросов данной как и = операторов в ИНЕКЕ моего поиска Redshift. Пример запрос ниже:RedShift «Like» или «=» Оператор Предпочтение

Select Event, substring(regexp_substr(message, 'Segment=[A-Za-z0-9]*', 1), 9) as 
Segment, 
messagetime 
from Logs 
where message like '%JobType=ProcessVideoSegmentIntoFragmentsJob%' 
and (Status='Ingested' OR Status='Started') 
and message like '%.ts%' 
and messagetime >= DATEADD(DAY, -30, GETDATE()) 

Что касается Где положения, мне любопытно, в каком порядке сравнение будет сделано, в частности, Status = и сообщений как. Поскольку подобный оператор в этом случае намного менее эффективен, я надеюсь, что он сравнивался послеСтатус =. Я сделал EXPLAIN на запрос, который размещен ниже:

XN Seq Scan on logs (cost=0.00..48973188.14 rows=1 width=692) 
Filter: (((message)::text ~~ 
'%JobType=ProcessVideoSegmentIntoFragmentsJob%'::text) AND (((status)::text = 
'Ingested'::text) OR ((status)::text = 'Started'::text)) AND (messagetime >= 
'2015-09-26 16:19:56'::timestamp without time zone) AND ((message)::text ~~ 
'%.ts%'::text)) 

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

В конце концов мне просто нужно знать, будет ли Redshift запустить как или = оператор первым.

ответ

0

Amazon Redshift не использует индексы. Вместо этого он обрабатывает данные параллельно по нескольким узлам и использует распределение данных (DISTKEY) и порядок сортировки данных (SORTKEY).

Таким образом, вполне вероятно, оценка этих выражения для каждой строки данных (но это может быть уменьшено, если WHERE условия в SORTKEY).

Общей методикой в ​​улучшении производительности SQL является устранение как можно большего количества строк внутри вложенного SELECT. Это единственный способ сделать все оценочные значения баз данных SQL в определенном порядке. (Некоторые базы данных имеют дополнительные возможности в этой области, но они не являются общими для SQL.) Поэтому вы можете попробовать поставить свою проверку Status= в подзапрос.

См. Документацию по Redshift: Subquery Examples

Смежные вопросы