我收到了一个使用distinct关键字的SQL查询.当我尝试运行查询时,至少需要一分钟才能连接两个包含数十万条记录的表并实际返回一些内容.
然后我取出了明显的,它在0.2秒内回来了.distinct关键字真的会让事情变坏吗?
编辑:这是查询
SELECT Distinct
c.username, o.orderno, o.totalcredits, o.totalrefunds,
o.recstatus, o.reason
from management.contacts c
join management.orders o
on (c.custID = o.custID)
where o.recDate > to_date('2010-01-01', 'YYYY/MM/DD')
是的,因为使用DISTINCT意愿(有时根据评论)导致结果被命令.排序数百条记录需要时间.
尝试GROUP BY所有列,有时可以引导查询优化器选择更有效的算法(至少在Oracle中我注意到了显着的性能提升).
Distinct 总是给我敲响警钟——它通常意味着糟糕的表设计或对自己不确定的开发人员。它用于删除重复行,但如果连接正确,则很少需要它。是的,使用它的成本很高。
订单表的主键是什么?假设它是 orderno 那么应该足以保证没有重复。如果是其他原因,那么您可能需要对查询做更多的事情,但您应该将删除这些差异作为目标!;-)
您还提到,当您检查行数时,查询需要一段时间才能运行 - 将整个查询包装在“select count(*) from ()”中通常会更快,特别是如果您获得大量行返回。就在你显然在测试的时候。;-)
最后,确保您已在订单表(也可能是 recDate)上对 custID 进行索引。