我需要使用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条答案
按热度按时间vxf3dgd41#
您应该测试对数据和数据库的任何查询。
我希望
not exists
要表现得更好一点:特别是,这可以利用上的索引
table_b(id)
,table_c(id)
,和table_d(id)
. 另外,语义更加清晰。NOT IN
with子查询可以返回(或不返回!)子查询返回时出现奇怪的结果NULL
.也就是说,我希望正确地获取查询比创建表然后删除行更快。后者似乎涉及许多“make work”--将行添加到表中只是为了删除它们。
igsr9ssn2#
正如gordon所写,如果这些id被定义为可空的,notexists将比notin更好。否则他们是平等的,只是比较一下。
这三个子查询将转换为三个联接,另一个解决方案仅使用一个联接:
当然,性能还取决于每个表的行数和现有索引。