我有以下查询:
select distinct type, account
from balances_tbl
where month = 'DEC-12'
表balances_tbl
每月有超过300万条记录。不同的类型和帐户行可能约为20,000条记录。 month
列已编入索引。 type
和account
列也会被编入索引。查询需要很长时间(大约30分钟)才能执行。
有没有办法更快地使用DISTINCT
子句进行此查询?
答案 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)
/