我有一张表(5000万行),其中列 column_a 和 column_b 都建有索引。
当我执行
但是当我执行
谢谢!
查询 1 的计划:
当我执行
select count(*) from table where column_a in (list_a)
时,可以立即得到结果;同样地,对于 select count(*) from table where column_b in (list_b)
也是如此。但是当我执行
select count(*) from table where column_a in (list_a) or column_b in (list_b)
时,查询变得异常缓慢,需要半个小时才能输出正确的数字……请问我的操作是否存在问题?如何优化这个查询?谢谢!
查询 1 的计划:
Plan hash value: 2471097773
-------------------------------------------------------------
| Id | Operation | Name |
-------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | NESTED LOOPS | |
| 3 | SORT UNIQUE | |
| 4 | TABLE ACCESS FULL | LIST_A |
| 5 | BITMAP CONVERSION COUNT | |
| 6 | BITMAP INDEX SINGLE VALUE| MY_TABLE_IX02 |
-------------------------------------------------------------
查询2的计划
Plan hash value: 1870911518
-------------------------------------------------------------
| Id | Operation | Name |
-------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | NESTED LOOPS | |
| 3 | SORT UNIQUE | |
| 4 | TABLE ACCESS FULL | LIST_B |
| 5 | BITMAP CONVERSION COUNT | |
| 6 | BITMAP INDEX SINGLE VALUE| MY_TABLE_IX05 |
-------------------------------------------------------------
查询3的计划:
Plan hash value: 1821967683
----------------------------------------------------------------
| Id | Operation | Name |
----------------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | FILTER | |
| 3 | VIEW | index$_join$_001 |
| 4 | HASH JOIN | |
| 5 | BITMAP CONVERSION TO ROWIDS| |
| 6 | BITMAP INDEX FULL SCAN | MY_TABLE_IX02 |
| 7 | BITMAP CONVERSION TO ROWIDS| |
| 8 | BITMAP INDEX FULL SCAN | MY_TABLE_IX05 |
| 9 | TABLE ACCESS FULL | LIST_A |
| 10 | TABLE ACCESS FULL | LIST_B |
----------------------------------------------------------------
EXPLAIN PLAN
吗?Oracle 是否使用了你的索引?你尝试过在 column_a、column_b 上添加一个联合索引吗? - Frank SchmittBITMAP INDEX SINGLE VALUE
vsBITMAP INDEX FULL SCAN
。你在两个测试中使用了相同的IN
子句吗? - Frank Schmitt