1

I have the following query:

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

The table balances_tbl has over 3 million records per month. The distinct type and account rows are maybe around 20,000 records. The month column is indexed. The type and account columns are also indexed. The query takes a really long time (about 30 minutes) to execute.

Is there a way to make this query with the DISTINCT clause faster?

4

5 回答 5

6

您需要添加一个包含所有三列的索引。我建议对(月份、类型、帐户)进行索引。这样,Oracle 只需扫描索引即可完成工作。

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

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

于 2012-12-26T20:07:56.120 回答
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'

where<index_on_month>month列上索引的名称。由于它是与日期相关的字段,因此索引可能具有良好的聚类因子

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

于 2012-12-26T21:27:12.140 回答
-1

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

尝试:

select type, 
       account,
       count(*) as dummy
from   balances_tbl 
where  month = 'DEC-12'
group by type,
       account
于 2012-12-27T11:43:24.043 回答
-1

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

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

 1) /*+ ALL_ROWS */
 2) /*+ FIRST_ROWS(n) */ 
 3) /*+ parallel */
于 2012-12-27T07:16:24.473 回答
-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)
/
于 2012-12-27T14:40:15.813 回答