使用EXPLAIN (postgresql) 對sql進行調校

現在sql調校有兩種方向,一種是透過增加快取的方式,例如透過使用redis , mybites 一二級快取來提高搜尋效率。 第二種是透過使用explain來分析慢搜尋的sql陳述式, 找到該敘述的問題從而進行調校。

這裡對使用explain來進行調校的方式做一些介紹。

使用方式: explain + sql => 執行 => 檢視結果

使用explain會列印出來資料庫引擎在底層執行sql陳述式是具體是怎麼做的。

舉個範例:

使用explain對這條sql陳述式進行具體的分析。

1
explain (ANALYZE on ,TIMING on, VERBOSE on, BUFFERS on, COSTS on )select data_date from e_mp_energy_month where data_date between to_date('2021-02','yyyy-mm-dd') and to_date('2021-02','yyyy-mm-dd') and meter_id in ( 20122700000146 , 20122700000147 , 20122700000148 , 20122700000149 , 20122700000150 , 20122700000151 , 20122700000152 , 20122700000153 , 20122700000154 , 20122700000155 , 20122700000156 , 20122700000157 , 20122700000158 , 20122700000159 , 20122700000160 , 20122700000161 , 20122700000162 , 20122700000163 , 20122700000164 ) order by meter_id,data_date asc

在顯示的結果中, cost表示對啟動成本和總成本的預估。 cost後面第一個數值代表啟動成本(搜尋到第一行所需要的成本), 第二個數值表示搜尋結束所需要的成本。

Seq Scan表示這條sql的執行方式時 順序掃描表。

actual time 表示實際的執行時間(單位毫秒)

buffers -> shared hit 表示在記憶體中讀到了多少塊。

filter表示過濾條件。

需要注意的一點是 , 使用了ANALYZE欄位的explain, 是真正會執行的 ,修改不可逆。 不使用ANALYZE的explain,只是預執行,不會改變資料庫中實際資料。

使用ANALYZE可以獲得資料庫實際執行時間, 但是修改不可逆, 要想結果可逆, 需要手動rollback。

個人認為,調校後sql, cost的值越小越好 , buffers shared hit的值越高越好。