Оптимизация запросов к тераданным - PullRequest
0 голосов
/ 21 июня 2020

Мне нужно выбрать группу людей из базы данных с некоторыми условиями с помощью Teradata SQL Assistant. Какой из следующих методов быстрее и почему:

Метод A

Create volatile table selection as ( 
Select * 
from table_a
Where id not in (sel id from table_b)
And id not in (sel id from table_c)
And id not in (sel id from table_d)
...
) With data primary index (id) on commit preserve rows;

Метод B

Create volatile table selection as ( 
Select * 
from table_a
) With data primary index (id) on commit preserve rows;
Delete from selection where id in (sel id from table_b);
Delete from selection where id in (sel id from table_c);
Delete from selection where id in (sel id from table_d);

Ответы [ 2 ]

1 голос
/ 21 июня 2020

Вы должны протестировать любой запрос к вашим данным и базе данных.

Я ожидал бы, что not exists будет работать немного лучше:

Select a.* 
from table_a a
where not exists (select 1 from table_b b where b.id = a.id) and
      not exists (select 1 from table_c c where c.id = a.id) and
      not exists (select 1 from table_d d where d.id = a.id) ;

В частности , это может использовать индексы для table_b(id), table_c(id) и table_d(id). К тому же семантика яснее. NOT IN с подзапросами может возвращать (или не возвращать!) Странные результаты, когда подзапрос возвращает NULL.

Тем не менее, я ожидал, что получение правильного запроса будет быстрее, чем создание таблицы и последующее удаление строк . Последнее, казалось бы, связано с множеством "подработок" - добавлением строк в таблицу только для их удаления.

0 голосов
/ 21 июня 2020

Как писал Гордон, если эти идентификаторы определены как NULLable, NOT EXISTS превзойдет NOT IN. В противном случае они равны, просто сравните объяснения.

Эти три подзапроса будут преобразованы в три соединения, другое решение, использующее только одно соединение:

Create volatile table selection as ( 
Select * 
from table_a
Where id not in 
 ( sel id from table_b 
   union all
   sel id from table_c
   union all
   sel id from table_d
 )
...
) With data primary index (id) on commit preserve rows;

Конечно, производительность также зависит от количество строк в таблице и существующие индексы.

...