oracle hint 強制索引(轉)


1.建議建立一個以paytime,id,cost的復合索引。光是在paytime上建立索引會產生很多隨機讀。
2.就算建立了索引,如果你查詢的數據量很大的話,也不一定會用索引,有時候全表掃描速度比索引掃描要快!(官方文檔上好像說的是大概10%,就是如果你查詢的數據占到總數據的10%,全表掃描比索引快)。
3.建復合索引語句如下(建議去 搜索看看官方文檔,建索引有很多參數,而且每個版本的 ORACLE也不一定一樣):
CREATE  INDEXTEST_ index ONC ONSUME_test
(PAYTIME,ID, COST)
LOGGING
TABLESPACE  INDEX_A
NOPARALLEL;
最后說一句, ORACLE好像沒有“強制索引”的說法的!
追問:
我記得有強制索引啊,就是/*+這里面寫的*/,但是我不知道語法
追答:
你指的是用hints去提示你查詢語句去使用哪個索引。
SELECT   /*+INDEX(TABLE INDEX_NAME)*/ FROM TABLE 
可以提示ORACLE 去使用TABLE 表上已經建好的INDEX_NAME。ORACLE 官方文檔上說過,這並不是強制的,僅僅是提示,優化器可能會選擇這個索引,也可能不選擇。不過絕大部分情況會按照提示的去做!

hints是oracle提供的一種機制,用來告訴優化器按照我們的告訴它的方式生成執行計划。我們可以用hints來實現:

  1) 使用的優化器的類型

  2) 基於代價的優化器的優化目標,是all_rows還是first_rows。

  3) 表的訪問路徑,是全表掃描,還是索引掃描,還是直接利用rowid。

  4) 表之間的連接類型

  5) 表之間的連接順序

  6) 語句的並行程度

  2、HINT可以基於以下規則產生作用

  表連接的順序、表連接的方法、訪問路徑、並行度

  3、HINT應用范圍

  dml語句

  查詢語句

  4、語法
  {DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
  or
  {DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...
  如果語(句)法不對,則ORACLE會自動忽略所寫的HINT,不報錯


例子:

在一些場景下,可能ORACLE不會自動走索引,這時候,如果對業務清晰,可以嘗試使用強制索引,測試查詢語句的性能。

以EMP表為例:

先在EMP表中建立唯一索引,如圖。

普通搜索:

SELECT * FROM EMP T

查看執行計划:

可以看到,是走的全表掃描。

使用強制索引,在SELECT 后面加上/*.......*/ 中間加上索引的屬性,代碼如下:

SELECT /*+index(t pk_emp)*/* FROM EMP T   

--強制索引,/*.....*/第一個星星后不能有空格,里邊內容結構為:加號index(表名 空格 索引名)。
--如果表用了別名,注釋里的表也要使用別名。

 

可以看到,這是走的是索引PK_EMP。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM