我有几个疑问,他们大多是:指数为“大于”查询
select * from Blah where col > 0
和
select * from Blah where date > current_date
因为他们都是怎样的一个范围内的,将非集群B +树col和date的索引是加速查询的好主意吗?或者一个哈希索引?或者没有索引会更好?
我有几个疑问,他们大多是:指数为“大于”查询
select * from Blah where col > 0
和
select * from Blah where date > current_date
因为他们都是怎样的一个范围内的,将非集群B +树col和date的索引是加速查询的好主意吗?或者一个哈希索引?或者没有索引会更好?
创建在所述过滤谓词用作时间范围条件的列中的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>
所以,在第二个测试用例中,您会看到索引范围扫描。我建议你也对你的环境做类似的测试。
这样做,感谢有和没有索引的例子。它清理了很多:) – Hook
@挂钩,不客气! –
@钩你可能想看看http://lalitkumarb.wordpress.com/2014/05/31/oracle-explain-plan/ –
是的。如果您在任何列上进行索引并且仅在该列上进行过滤,则将使用该索引。
这个问题很模糊。也许有更多的代码或更大的例子,可以提供更多的帮助来提高特定查询的性能优势。
在您的情况下,col
(第一个查询)和date
(第二个查询)上的索引将加速这些特定查询。
Oracle(可能会改变,但我怀疑它) – Hook
哈希指数或No指数不会更好。索引在SQL中非常有用,并且可以显着提高结果速度。 – Martin
您是否在创建索引后检查了**解释计划**?你看到'索引范围扫描'吗? –