最近遇到一个SQL语句效率的问题,实在不知如何解决,请大家帮忙看看,谢谢了。用的是Oracle10g + TOAD。原语句:SELECT * FROM table
WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND
column_3 > 333333.33 AND column_4 < 444444.44column_1,column_2,column_3,column_4 都已建了index,但都不是UNIQUE的。table中有一列 column_0 是建有 UNIQUE INDEX的。问题是,现在这个查询语句需要大概10分钟来运行,有没有什么更快的实现方法?
WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND
column_3 > 333333.33 AND column_4 < 444444.44column_1,column_2,column_3,column_4 都已建了index,但都不是UNIQUE的。table中有一列 column_0 是建有 UNIQUE INDEX的。问题是,现在这个查询语句需要大概10分钟来运行,有没有什么更快的实现方法?
select /*+index(tablename,idx1)*/ * from tablename
WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND
column_3 > 333333.33 AND column_4 < 444444.44;
2,找一个选择性最高的索引使用;
3,使用所有的索引SELECT /*+ index_combine(table index_1,index_2,index_3,index_4)*/* FROM table
WHERE column_1 > 111111.11 AND column_2 < 222222.22 AND
column_3 > 333333.33 AND column_4 < 444444.44
你用的是'>'和'<'这2个操作符合都不会使用索引的。这样看看
SELECT * FROM table
WHERE (case when column_1 > 111111.11,1,else 0 end ) +(case when column_2 < 222222.22,1,else 0 end ) +(case when column_3 > 333333.33,1,else 0 end ) +(case when column_4 < 444444.44,1,else 0 end ) =4
create index indexname on table(column_1,column_2,column_3,column_4);
试过了,这个方法大概需要7-8分钟,有了1-2分钟的进步。谢谢啦!不知道还有没有更好的建议呢?回答大家几个问题:
这个table已经建了组合索引(column_1,column_2,column_3,column_4)。
其中的数据量大概有50000000。感谢大家的建议,希望能看到更多更好的建议!谢谢。
执行计划如下:PLAN_TABLE_OUTPUT
Plan hash value: 1357647378
--------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 307K| 20M| 96130 (4)| 00:19:14 |
|* 1 | TABLE ACCESS FULL| table | 307K| 20M| 96130 (4)| 00:19:14 |
--------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("column_4"<444444.44 AND "column_1">111111.11 AND "column_2"<222222.22
AND "column_3">333333.33)
.............5kw的数据量,分区不知道行不行。。
谢谢你的建议,分区的话需要企业级的Oracle,我们这个标准版是不能分区的 :)