使用多个查询来避免使用NOT关键字

时间:2014-09-10 08:25:13

标签: sql sql-server

我有第一组行,没有NOT关键字:

insert into temptable 
    (select value1, count(value1), value2, count(value2) 
        from originaltable group by value1, value2)
delete from temptable where value1=1 and value2=1 
delete from temptable where value1=0 and value2=1 
select * from temptable

和第二个查询。

select value1, count(value1), value2, count(value2) from originaltable 
    where not (value1=1 and value2=1)
      and not (value1=0 and value2=1)
    group by value1, value2

是否存在第一组查询比第二组查询更快或更可取的情况?我认为当原始表中有大量数据并且temptable被索引时,第一组查询会更快。我想是的,因为对于第一个选择,没有必要使用NOT关键字进行比较。

我甚至更正确地说NOT关键字会导致查询2变慢?

1 个答案:

答案 0 :(得分:1)

不,你错了

首先

如果原始表中没有数据,则第一个查询可能比第二个查询快。

其次

您的原始表格中有数据。

如果原始表上存在value1和value2的索引,则第二个查询将比第一个查询更快。

如果temptable上有value1和value2的索引,则第一个查询将比第二个查询慢。

第三

NOT是一个逻辑操作,与=<>等同时进行。

无索引分析:

insert into temptable --need at least one tablescan and an aggregation operation.log file will be written
(select value1, count(value1), value2, count(value2) 
    from originaltable group by value1, value2)
delete from temptable where value1=1 and value2=1 --need one tablescan, log file will be written 
delete from temptable where value1=0 and value2=1 --need one tablescan, log file will be written 
select * from temptable --one tablescan

您的第一次查询至少需要四次表扫描操作和一次聚合,更糟糕的是您的查询需要写入日志文件,这对所有DBMS来说都是非常慢的操作。

您的第二个查询只需要一个表扫描操作和一个聚合,您第一次查询的所有其他操作只能浪费时间。

使用索引进行分析:

如果你有temptable索引,你可以安全地找到需要删除的行,但是你会增加更多时间来重建索引。更多数据需要花费更多时间在重建索引上。

如果你有原始表的索引,你可以直接通过索引扫描节省时间。

顺便说一句,您应该在第一次查询之前添加truncate table操作。