【问题标题】:Indexes for 'greater than' queries“大于”查询的索引
【发布时间】:2015-07-01 15:31:36
【问题描述】:

我有几个问题,其中大部分是:

select * from Blah where col > 0

select * from Blah where date > current_date

既然它们都是一个范围,那么 col 和 date 上的非聚集 b+ 树索引是否是加快查询速度的好主意?还是哈希索引?还是没有更好的索引?

【问题讨论】:

  • Oracle(它可能会改变,但我对此表示怀疑)
  • 哈希索引或无索引不会更好。索引在 SQL 中非常有用,拥有索引会显着加快结果速度。
  • 创建索引后是否检查了说明计划?你看到index range scan了吗?
  • Oracle 中没有哈希索引,除非我弄错了

标签: sql oracle indexing


【解决方案1】:

过滤谓词中使用的列上创建一个INDEX作为日期范围条件应该很有用,因为它会做一个索引范围扫描

这是一个关于How to create, display and read EXPLAIN PLAN in Oracle的演示。

让我们看看这两种场景的测试用例:

测试#1:没有索引

SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM emp WHERE hiredate > to_date('01/04/1981','mm/dd/yyyy');

Explained.

SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
Plan hash value: 3956160932

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    14 |   518 |     3   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| EMP  |    14 |   518 |     3   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------

   1 - filter("HIREDATE">TO_DATE(' 1981-01-04 00:00:00', 'syyyy-mm-dd
              hh24:mi:ss'))

14 rows selected.

SQL>

测试#1:带索引

SQL> CREATE INDEX emp_idx ON emp(hiredate);

Index created.

SQL>
SQL> EXPLAIN PLAN FOR
  2  SELECT * FROM emp WHERE hiredate > to_date('01/04/1981','mm/dd/yyyy');

Explained.

SQL>
SQL> SELECT * FROM TABLE(dbms_xplan.display);

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
Plan hash value: 3589413211

-----------------------------------------------------------------------------------------------
| Id  | Operation                           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                    |         |    14 |   518 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID BATCHED| EMP     |    14 |   518 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN                  | EMP_IDX |    14 |       |     1   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

PLAN_TABLE_OUTPUT
-----------------------------------------------------------------------------------------------
---------------------------------------------------

   2 - access("HIREDATE">TO_DATE(' 1981-01-04 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

14 rows selected.

SQL>

因此,在第二个测试用例中,您会看到索引范围扫描。我建议您也对您的环境进行类似的测试。

【讨论】:

【解决方案2】:

是的。如果您对任何列进行索引并且仅对该列进行过滤,则将使用该索引。

这个问题很模糊。也许通过更多代码或更大的示例,可以针对特定查询的性能优势提供更多帮助。

在您的情况下,col(第一个查询)和 date(第二个查询)上的索引会加快这些特定查询的速度。

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2018-01-02
    • 1970-01-01
    相关资源
    最近更新 更多