永无止境的查询

时间:2014-08-06 15:13:31

标签: sql oracle

直到今天,我的查询工作正常。

我认为索引存在一些问题。

注意:在列类型(在表1中)中有索引,而table_1

中的类型不是唯一的

以下是查询相似的内容:

--works fine(finish in 5 seconds)
select *
from table_1 a,table_2 b
where a.id=b.id
and a.date < date'2014-6-31'
and a.type=2

当我增加日期范围(包括更多1个月,大约1000个记录以上)时,它没有完成,所以我必须停止它。

--never ending
select *
from table_1 a,table_2 b
where a.id=b.id
and a.date < date'2014-7-31'
and a.type=2

但是当我省略具有索引的列时,没关系:

--works fine
select *
from table_1 a,table_2 b
where a.id=b.id
and a.date < date'2014-7-31'

我会对任何提示感激不尽。

2 个答案:

答案 0 :(得分:0)

尝试以这种方式禁用索引:

ALTER INDEX idxname DISABLE;

您还可以重建索引

ALTER INDEX idxname REBUILD;

或收集表格的统计数据

EXEC DBMS_STATS.GATHER_TABLE_STATS ('yourschema', 'table');

但要小心可能需要很长时间!

答案 1 :(得分:0)

您可以使用查询计划查看发生了什么。

在runstats或禁用索引之前,首先重新编码查询计划,在runstats之后比较查询计划或禁用索引。然后,您可以自己弄清楚数据库中发生了什么。

你应该知道,并非所有索引都有帮助。

有些时候没有索引,dbms会选择全表扫描和散列连接来提高性能。

但是对于某些索引,dbms可能会使用下一个循环连接,这种类型的连接可能会降低成本,但可能会执行串行。