当中间列可以是任何东西时,是否使用3列SQL索引?

时间:2017-11-22 13:59:54

标签: sql sql-server oracle

尝试在当前证明某事情,看是否有必要添加索引。

如果我在列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中查看此内容。不确定一个人的优化程度是否与另一个人不同。

任何建议表示赞赏!谢谢!

2 个答案:

答案 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