2015-04-23 30 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(第二個查詢)上的索引將加速這些特定查詢。