2015-04-23 33 views
2

我有几个疑问,他们大多是:指数为“大于”查询

select * from Blah where col > 0 

select * from Blah where date > current_date 

因为他们都是怎样的一个范围内的,将非集群B +树col和date的索引是加速查询的好主意吗?或者一个哈希索引?或者没有索引会更好?

+0

Oracle(可能会改变,但我怀疑它) – Hook

+0

哈希指数或No指数不会更好。索引在SQL中非常有用,并且可以显着提高结果速度。 – Martin

+0

您是否在创建索引后检查了**解释计划**?你看到'索引范围扫描'吗? –

回答

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> 

所以,在第二个测试用例中,您会看到索引范围扫描。我建议你也对你的环境做类似的测试。

+0

这样做,感谢有和没有索引的例子。它清理了很多:) – Hook

+0

@挂钩,不客气! –

+0

@钩你可能想看看http://lalitkumarb.wordpress.com/2014/05/31/oracle-explain-plan/ –

0

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

这个问题很模糊。也许有更多的代码或更大的例子,可以提供更多的帮助来提高特定查询的性能优势。

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