我有幾個疑問,他們大多是:指數爲「大於」查詢
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
您是否在創建索引後檢查了**解釋計劃**?你看到'索引範圍掃描'嗎? –