天天看點

PostgreSQL 存儲智慧 - 空間聚集存儲

postgresql , 空間資料 , r-tree , 聚集存儲

單身漢的房間可能是這樣的,淩亂得很。

PostgreSQL 存儲智慧 - 空間聚集存儲
PostgreSQL 存儲智慧 - 空間聚集存儲

可能會有人表示不服,不是應該這樣的嗎?

PostgreSQL 存儲智慧 - 空間聚集存儲

實際上大多數情況下資料庫存儲也可能是這樣的,資料淩亂。索引的目的是在淩亂的資料中找到目标資料,但是從淩亂的資料中按索引順序掃描一批資料,會有什麼後果呢:

沒錯,io放大,我在以前的文章中有詳細介紹過其原理。

<a href="https://github.com/digoal/blog/blob/master/201404/20140426_01.md">《索引順序掃描引發的堆掃描io放大背後的統計學原理與解決辦法 - postgresql index scan enlarge heap page scans when index and column correlation small.》</a>

對于亂序存放的資料,如果按索引順序來調整存儲,聚集後,可以減少io放大。

對于空間資料,應該如何存放呢?

postgresql 插件有一個插件pageinspect,可以解析block檢視索引、堆表的内容。

但是一直沒有支援gist, sp-gist的内窺,不過馬上就會支援了,看這個patch。

<a href="https://www.postgresql.org/message-id/flat/accae316-5e4d-8963-0c3d-277ef13c396c%40postgrespro.ru#[email protected]">https://www.postgresql.org/message-id/flat/accae316-5e4d-8963-0c3d-277ef13c396c%40postgrespro.ru#[email protected]</a>

1、打更新檔

2、加載pageinspect插件

3、幾個函數接口的講解

3.1 檢視gist索引概貌,比如層級,占用多少個page,多少葉子節點,多少tuple等。

gist_stat(indexname) - show some statistics about gist tree

3.2 列出gist索引的每個層級的概貌,直到某個層級的節點。

gist_tree(indexname,maxlevel) - show gist tree up to maxlevel

3.3 列印gist索引的詳細内容,這裡包含了每一個索引的區間,例如國家、省、市。。。box邊界。

gist_print(indexname) - prints objects stored in gist tree, works only if objects in index have textual representation (type_out functions should be implemented for given object type).

it's known to work with r-tree gist based index (contrib/rtree_gist).

note, in example below, objects are of type box.

我們可以把gist索引的内容,按層級繪制出圖像來。

例如一級長這樣,就是大box。

PostgreSQL 存儲智慧 - 空間聚集存儲

下一級(葉子節點),長這樣,就是大box下的一個個小box。

PostgreSQL 存儲智慧 - 空間聚集存儲

如果我們按照gist索引的層級排序,聚集存儲,那麼在基于空間掃描資料的時候,掃描的塊就更少。

假設落在杭州地區有100萬條資料,按照單身漢的亂序存儲,杭州的資料可能散落分布在很多個page中,我們掃描時也許掃描的是全量資料,而且是離散掃,性能損耗比較大。如果按照gist聚集存儲,那麼會有極大的性能提升。

1、建立測試表

2、寫入1000萬測試記錄,随機點位

3、建立空間索引

4、内窺空間索引

4.1、末端(葉子)節點的box如下。

5、空間聚集前,也就是從單身漢的淩絡卧室空間掃描落在某一個box内的資料。

傳回101518條記錄,掃描了50914個heap資料塊。

6、按gist空間聚集,整理資料。

postgresql提供了一個聚集文法:

使用gist索引對資料進行聚集:

驗證聚集後的塊掃描性能。

傳回101518條記錄,掃描了691個heap資料塊。

使用空間聚集,按某個空間條件查詢并傳回101518記錄,對比聚集前後,掃描的heap資料塊數目從50914降到了691。

<a href="http://www.sai.msu.su/~megera/wiki/gevel">http://www.sai.msu.su/~megera/wiki/gevel</a>

<a href="http://www.sai.msu.su/~megera/wiki/rtree_index">http://www.sai.msu.su/~megera/wiki/rtree_index</a>