天天看點

PostgreSQL 虛拟|虛假 索引(hypothetical index) - HypoPG

PostgreSQL , 虛拟索引 , 虛假索引 , HypoPG , hypothetical index

DBA實際上是一種比較稀缺的資源,很多企業甚至沒有DBA,或者SA、開發人員兼職DBA,對于一般的使用者,對資料庫了解程度有限,特别是在SQL優化方面的知識更加有限。

最常用也是奏效較快的SQL優化手段,通常是加索引,這也是我從很多開發者交流後得知的,很多人的概念是,SQL慢,加索引嘛。

但是加索引有沒有效果要針對“SQL、針對資料分布、針對輸入條件、針對列的唯一值比例” 來判斷:加索引後的降低了多少CPU的FILTER計算開銷,降低了多少IO的掃描。同時,加索引帶來的副作用是寫入IO放大,占用更多空間,寫入性能下降。

并且,在加索引時,會堵塞DML(不過還好,PG支援并發加索引,不堵塞DML。 <code>CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ]</code>)。

那麼對于一般的使用者,如何更好的判斷加索引是否有效呢?

虛拟索引是一個很有用的東西,沒有副作用,隻是虛拟的索引,建立虛拟索引後,可以通過EXPLAIN來檢視加索引後的成本估算,判斷是否加索引COST會降低。

1、安裝插件

<a href="https://github.com/dalibo/hypopg/">https://github.com/dalibo/hypopg/</a>

2、建立插件

3、建測試表

4、檢視沒有索引時,全表掃描的成本

5、建立虛拟索引

6、檢視已建立了哪些虛拟索引

7、檢視建立虛拟索引後的執行計劃

8、檢視真實的執行計劃

9、清除虛拟索引

調用hypopg_drop_index(indexrelid) 清除單個虛拟索引,調用hypopg_reset() 清除所有虛拟索引。