SQL語句的執行計畫和暗示

2021-04-15 16:20:32 字數 1912 閱讀 8164

我真的感覺寫sql語句是鍛鍊智商的乙個好方法. 當你用一條語句實現了乙個複雜的功能.或通過乙個小技巧讓執行速度成百倍的提高時,那種感覺比嗑了藥還爽.

前幾天才了解到sql語句的執行計畫這個東東.大概意思就是一條sql語句按照怎樣的步驟去查詢資料的.在pl/sql developer中的explain plan window中寫入語句,執行,就可以看到該語句的執行計畫(或在某編輯視窗按f5).很有用,還沒有全部搞懂,但想先寫寫.

一條簡單的語句

select * from table 或select * from table where name='123'

檢視它的執行計畫,如果name不是索引的話,都應該是:table access full.是啊,這兩條語句都需要依次檢索整個表才能檢索出想要的資訊.

而select  *  from  table where id = '123'

如果id是索引的話.此時再看執行計畫,就是table access by index rowid,並會顯示出根據哪個index檢索的.根據索引來查當然會快很多.

現實中的sql語句大多不會這麼簡單.有很多條件,還會併聯別的表.這時你就會發現,sql的執行計畫有時很笨.

select * from table wher name='123' and id is null(id是索引)

上面語句的執行計畫還是table access full(執行計畫根據你的表結構和索引有關,上面只是個例子).也就是說它還是依次在表中檢索資料,先看第一條資料的name是多少,id是不是空,再看第二條...直到檢索到最後一條.仔細看下條件,想想,查id比較快一些吧,而且id中為空的應該不多吧,把id為空的資料先找出來.再從這些資料中全掃瞄查詢name為123的,是不是比一條一條的檢索快.那麼怎麼讓sql語句按照我們的想法來檢索呢.那就要用暗示了,如下:

/*+ index(t,index_name)*/

/*+ */是使用暗示的語法

index()是暗示的乙個函式,用於指定使用某個索引.當然還有別的函式,比如在多表關聯時用於指定哪兩個表先關聯的函式.等

t 是表的別名,必須使用別名.

index_name是使用的索引的名字.注意t 和index_name之間是逗號不是點.

把暗示加到select 後

select /*+ index(t,id)*/ * from table t wher t.name='123' and t.id is null

這時再看執行計畫,就是table access by index rowid.既先按照id檢索.

這個例子還是比較簡單,我遇到的真實情況大概是這樣的.

select a.*,b.* from table_a a,table_b b where a.id = b.id and a.date>to_date('2007-01-01','yyyy-mm-dd')

其中a,b 的id和a 的date都是索引.最初的執行計畫是a 和b先根據id關聯,再從關聯的資料中檢索大於2007-01-01的資料.a,b表是基表,相關聯的資料量很大,再加上還有別的條件,所以速度很慢,花了180秒.後經高手指導加了這樣乙個暗示

/*+ index(a,date)*/這樣執行計畫就變成了:先找a 表中大於2007-01-01的資料,再將這些資料與b表相關聯.因為雖然a,b表關聯的資料量大,但a表中date>2007-01-01的數要少很多.用這部分少量的資料來關聯,速度馬上就上去了,只花了2秒時間就查出結果.快了90倍啊.

到現在我還不太會看執行計畫,當查詢條件多了,關聯的表多的時候,執行計畫乙個嵌乙個,好麻煩的.而且暗示也不是隨便用的.並不是任意指定乙個索引就好使,要抓住關鍵點,分析各個條件間的關係,資料的主要集中範圍,等等.有時如果沒用好,指定了索引後還不如全表掃瞄快.

在這裡你將看到你的sql語句執**況,一般來說我們都比較關注他是否進行了全表掃瞄。如果是進行了全表掃瞄的話你就需要檢查是那個條件發生了全表掃瞄,那個你對該字段建立索引就可以了。

檢視sql語句的執行計畫

explain plan 是乙個很好的分析sql語句的工具,它甚至可以在不執行sql的情況下分析語句.通過分析,我們就可以知道oracle是怎麼樣連線表,使用什麼方式掃瞄表 索引掃瞄或全表掃瞄 以及使用到的索引名稱.你需要按照從裡到外,從上到下的次序解讀分析的結果.explain plan分析的結果...

ORACLE裡SQL語句的執行計畫(二)

1.autotrace 命令 set autotrace on 表示輸出sql的結果,以及執行計畫和統計資訊 set autotrace traceonly 表示不輸出sql的結果 但是輸出執行計畫和統計資訊 set autotrace traceonly explain 表示進輸出執行計畫 set...

MySQL執行計畫詳解 優化sql語句

執行計畫,簡單的來說,是sql在資料庫中執行時的表現情況,通常用於sql效能分析,優化等場景。在mysql使用explain關鍵字來檢視sql的執行計畫。如下所示 1.查詢t base user select from t base user where name andyqian 2.檢視上述語句...