一, 安裝html
環境介紹:官方說postgresql 9.3 版本以後支持HStore 插件,目前最新版本10.3sql
本次測試版本:10.1 或 9.6.2數據庫
進入psql 運行環境,使用管理員(高級別用戶)進入服務器,鏈接某個應用數據庫。服務器
# \c 命令,數據庫名 , 高級別用戶 \c databasename postgres; # 啓用插件 create extension hstore; # 切換普通用戶 \c databasename ir_user; # 察看Hstore 使用狀況 \dT hstore;
二, 使用Hstore dom
新增列(Hstore) alter table tbl_name add column column_name hstore; 給列賦值 update tbl_name set column_name =('exp=>' || exp || ', wealth=>' || wealth )::hstore; 查詢 Select * from tbl_name where column_name ? 'exp’ 修改 Select * from tbl_name where column_name || ‘exp=>new_value’::hstore 新增 Select * from tbl_name where column_name || ‘exp2=>value2’::hstore 刪除 Select * from tbl_name where column_name - ‘exp2’
三, 性能測試函數
a) 數據準備,分揀平臺2kw條子域名數據,列(20個)post
數據表 1 : select * from test.tmp_jackical_hstore2 limit 2;性能
數據表2 : select * from test.bt_sub_domain limit 2;測試
測試sql1(hstore) : select * from test.tmp_jackical_hstore2 where domain_hstore2 ? 'zcrbjx.cn.china.cn';優化
測試sql2 :select * from test.bt_sub_domain where domain_name = 'zcrbjx.cn.china.cn';
兩個表都沒有加索引 語句1 : 17.561 s
語句2: 5.219 s
b) 追加索引
給 hstore 列加上 gist 索引
CREATE INDEX ***** ON test.tmp_jackical_hstore2 USING gist(domain_hstore2);
給 沒有hstore 的表加 btree 索引 :
CREATE INDEX **** ON test.bt_sub_domain USING btree(domain_name );
再次測試 語句1 : 7 s 左右
語句2 : 0.122 s
被正常數據秒殺了。。。
繼續優化 ....
c) 再次給Hstore查詢條件加索引
給 hstore 列繼續 加上 btree 索引 : CREATE INDEX **** ON test.tmp_jackical_hstore2 USING btree(hstore_keys(domain_hstore2));
到目前未知,己給hstore 這列加了,gist 與 btree索引 了,來看看性能吧。
測試語句1: select * from test.tmp_jackical_hstore2 where hstore_keys(domain_hstore2) = 'zcrbjx.cn.china.cn';
測試語句2: select * from test.bt_sub_domain where domain_name = 'zcrbjx.cn.china.cn';
再再次測試 語句1 : 0.122s
語句2 : 0.122s
結論:Hstore 提供key-value 保存形式,但性能不大好,須要加入有針對性查詢的索引才能提升性能。
附函數:hstore_keys
CREATE OR REPLACE FUNCTION "test"."hstore_keys"("field" hstore) RETURNS "pg_catalog"."text" AS $BODY$ select array_to_string(akeys($1),','); $BODY$ LANGUAGE 'sql' IMMUTABLE COST 100 ; ALTER FUNCTION "test"."hstore_keys"("field" hstore) OWNER TO "ir_user";