尝试在当前证明某事情,看是否有必要添加索引。
如果我在列A,B,C和I上有一个索引,那么创建一个查询,在where子句中只显式使用A和C,我能获得索引的好处吗?
在这种情况下,想象一下where子句是这样的:
A = 'Q' AND (B is not null OR B is null) AND C='G'
我使用EXPLAIN PLAN在Oracle中对此进行了调查,但它似乎没有使用索引。此外,根据我对如何创建和使用索引的理解,它将无法受益,因为由于缺乏细节,索引无法利用列B.
目前在MSSQL或ORACLE中查看此内容。不确定一个人的优化程度是否与另一个人不同。
任何建议表示赞赏!谢谢!
答案 0 :(得分:1)
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
SQL> create table t$ (a integer not null, b integer, c integer, d varchar2(100 char));
Table created
SQL> insert into t$ select rownum, rownum, rownum, lpad('0', '1', 100) from dual connect by level <= 1000000;
1000000 rows inserted
SQL> create index t$i on t$(a, b, c);
Index created
SQL> analyze table t$ estimate statistics;
Table analyzed
SQL> explain plan for select * from t$ where a = 128 and c = 128;
Explained
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3274478018
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 13 | 4 (0)
| 1 | TABLE ACCESS BY INDEX ROWID BATCHED| T$ | 1 | 13 | 4 (0)
|* 2 | INDEX RANGE SCAN | T$I | 1 | | 3 (0)
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("A"=128 AND "C"=128)
filter("C"=128)
15 rows selected
有问题吗?
答案 1 :(得分:0)
如果你看一下索引的B +树结构,那么答案如下 索引的左侧(包括第一个不等式)将转到Seek Predicate,其余部分将在查询计划中的谓词中。
例如阅读http://use-the-index-luke.com/sql/where-clause/the-equals-operator/concatenated-keys