使用DISTINCT子句进行查询运行得更快

时间:2012-12-26 19:43:31

标签: sql oracle distinct

我有以下查询:

select distinct type, account 
  from balances_tbl 
 where month = 'DEC-12'

balances_tbl每月有超过300万条记录。不同的类型和帐户行可能约为20,000条记录。 month列已编入索引。 typeaccount列也会被编入索引。查询需要很长时间(大约30分钟)才能执行。

有没有办法更快地使用DISTINCT子句进行此查询?

5 个答案:

答案 0 :(得分:6)

您需要添加包含所有三列的索引。我会建议(月,类型,帐户)的索引。这样,Oracle就可以通过扫描索引来完成它的工作。

否则,您必须进行全表扫描,然后才能找到不同的值。

我可能还建议按月对表进行分区。但是,这需要重新组织表格,并且会有更多的工作。

答案 1 :(得分:1)

首先,请与您的DBA核实您是否拥有该表/索引的新统计信息。

然后,对于该查询,30分钟太长,如果没有看到EXPLAIN PLAN,我猜Oracle正在进行全面扫描,因此它正在访问表中的每一行。鉴于每月有大约300万行,这可能是很多行。正如您所说month被编入索引,您可以尝试使用以下内容强制month上的索引访问:

select /*+ index(b <index_on_month)>*/ distinct type, account 
from balances_tbl b
where month = 'DEC-12'

其中<index_on_month>month列上索引的名称。由于它是与日期相关的字段,因此该索引很可能具有良好的clustering factor

无论如何,如果没有看到执行计划,很难确定为什么这么长时间。

答案 2 :(得分:-1)

您可以创建月分区或使用可以使用oracle优化提示来更快地检索数据

这些是对你的查询有用的提示

 1) /*+ ALL_ROWS */
 2) /*+ FIRST_ROWS(n) */ 
 3) /*+ parallel */

答案 3 :(得分:-1)

尝试添加聚合函数,确保月份列上有索引。除非服务器很差,否则我不应该花这么长时间。

尝试:

select type, 
       account,
       count(*) as dummy
from   balances_tbl 
where  month = 'DEC-12'
group by type,
       account

答案 4 :(得分:-2)

这是最简单的解决方案 - 无需索引,计划和所有这些......:

SELECT DISTINCT d.deptno, dname FROM scott.dept D, scott.emp E WHERE D.deptno = E.deptno
/  
-- Same as Distinct --
SELECT deptno, dname FROM scott.dept D WHERE EXISTS ( SELECT 'X' FROM scott.emp E WHERE E.deptno = D.deptno)
/