2015-05-20 6 views
0

У меня есть относительный простой запросTeradata: использование синонимов воздействий EXPLAIN оценка времени

SELECT 
    , db1.something 
    , COALESCE(db2.something_else, 'NA') AS something2 
FROM dwh.db_1 AS db1 
LEFT JOIN dwh.db_2 AS db2 ON db1.some_id = db2 = some_id 

EXPLAIN дает ориентировочное время что-то более чем на 15 секунд.

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

SELECT 
    , db1.something 
    , COALESCE(db_2.something_else, 'NA') AS something2 
FROM dwh.db_1 AS db1 
LEFT JOIN dwh.db_2 AS db2 ON db1.some_id = db2.some_id 

дает ориентировочное время более 4 часов, где кажется, что система пытается выполните соединение продукта на некоторой катушке (я не могу следовать последовательности шагов планирования).

Я всегда думал, что псевдонимы - это просто псевдонимы и have no impact on perf.

+1

Эти два вопроса выглядят одинаково для меня. И конструкция 'db1.some_id = db2 = some_id' выглядит некорректной. –

ответ

2

расчетное время, вероятно, правильно :-)

A Таблица-Alias ​​на самом деле не является псевдонимом, он заменяет имя таблицы в этом запросе. В Teradata, использующем исходное имя табуляции, не возникает сообщение об ошибке (как и в большинстве других СУБД), но оно вызывает соединение CROSS .

Почему? Ну, Teradata был реализован до того, как появился стандартный SQL, исходный язык запросов был назван TEQUEL (TEradata QUEry Language), синтаксис которого не требовал перечислить таблицы в FROM. Простой RETRIEVE TableName.ColumnName содержит достаточно информации для анализатора/оптимизатора для разрешения имени и имени столбца. Нет флажка, чтобы отключить его, некоторые инструменты для клиентов отказываются его отправлять, но вы можете отправить RETRIEVE в BTEQ.

В этом примере выше вы смешиваете старый TEQUEL и SQL, есть 3 таблицы для оптимизатора, но только одно условие соединения, это приводит к соединению CROSS к третьей таблице.

По крайней мере, это легко заметить в Объяснении. Оптимизатор сделает это глупое соединение как последний шаг, поэтому прокрутите до конца, и вы увидите joined using a product join, with a join condition of ("(1=1)").