我有第一组行,没有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变慢?
答案 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
操作。