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好像沒有“強制索引”的說法的!
2.就算建立了索引,如果你查詢的數據量很大的話,也不一定會用索引,有時候全表掃描速度比索引掃描要快!(官方文檔上好像說的是大概10%,就是如果你查詢的數據占到總數據的10%,全表掃描比索引快)。
3.建復合索引語句如下(建議去

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。