SQL Distinct关键字会降低性能?

MxL*_*evs 8 sql plsql

我收到了一个使用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')

Ben*_*oit 8

是的,因为使用DISTINCT意愿(有时根据评论)导致结果被命令.排序数百条记录需要时间.

尝试GROUP BY所有列,有时可以引导查询优化器选择更有效的算法(至少在Oracle中我注意到了显着的性能提升).

  • 只是一个小小的注意事项:不一定要通过订购结果来完成.数据库可以自由应用它认为可以计算不同行的任何策略.Oracle可以使用索引或散列,具体取决于哪些列应该是不同的.两者都不会导致排序步骤.但如果涉及排序,那么这可能会非常昂贵. (2认同)
  • @Unreason:但散列不会对结果进行排序。这就是我想指出的。并且索引扫描也不一定是排序的 (2认同)

Tro*_*ame 7

Distinct 总是给我敲响警钟——它通常意味着糟糕的表设计或对自己不确定的开发人员。它用于删除重复行,但如果连接正确,则很少需要它。是的,使用它的成本很高。

订单表的主键是什么?假设它是 orderno 那么应该足以保证没有重复。如果是其他原因,那么您可能需要对查询做更多的事情,但您应该将删除这些差异作为目标!;-)

您还提到,当您检查行数时,查询需要一段时间才能运行 - 将整个查询包装在“select count(*) from ()”中通常会更快,特别是如果您获得大量行返回。就在你显然在测试的时候。;-)

最后,确保您已在订单表(也可能是 recDate)上对 custID 进行索引。