Postgres10高效能開發(1)索引

2021-10-03 10:22:29 字數 3358 閱讀 5430

text_pattern_ops,varchar_pattern_ops和bpchar_pattern_ops運算子支援按字元比較,而不是預設語言排序規則比較。可以用於btree索引,但只支援等於比較,不再支援範圍查詢

#查詢lc_collate方法

show lc_collate

結構gin索引是一種廣義倒排索引,從索引物件生成key(1或多個),並儲存集合

支援的運算子

運算子被索引字段型別

支援的比較方法

array_ops

anyarray

&&, <@, =, @>

jsonb_ops

jsonb

?, ?&, ?|, @>

jsonb_path_ops

jsonb

@>

tsvector_ops

tsvector

@@, @@@

btree_gin外掛程式

支援對int2, int4, int8, float4, float8, timestamp with time zone, timestamp without time zone, time with time zone, time without time zone, date, interval, oid, money, char, varchar, text, bytea, bit, varbit, macaddr, macaddr8, inet, cidr和enum型別建立索引

特點廣義搜尋樹,內部採用btree結構,支援自主擴充套件

create index idx_xx on tablea (fileda,filedb)
索引bitmap and

對於where a=1 and b=1,如果a和b欄位都有索引,資料庫有可能對a和b都使用索引查詢,然後將結果生成位圖,進行and操作

索引bitmap or

對於where a=1 or b=1,如果a和b欄位都有索引,資料庫有可能對a和b都使用索引查詢,然後將結果生成bitmap,進行or操作

create index access_log_client_ip_ix on access_log(client_ip)

where not(client_ip> inet'192.168.100.0'and

client_ip 排除區分度低的值

如果某個欄位的某些值出現頻率很高(值區分度低),可以通過部分索引排除這些值。

過濾掉固定查詢值

如果查詢總是附帶某些固定條件,如 status = 『y』 and fileda=?,其中status = 'y』條件是不變的,因此可以對fileda建立索引並排除其他status值

create index idx_xx on tablea (fileda) where status = 'y'

like 『xx%』

前文提到 like 'xx%'可以使用btree索引

like 『%xx%』 和 like 『xx%』

可以使用pg_trgm外掛程式,使用gin_trgm_ops操作符建立gin索引

pg_trgm將對文字型別字段分解為三元組,從字串中提取三字母時忽略非單詞字元(非字母數字)。在確定字串中包含的三元組時,每個單詞被認為有兩個空格字首,乙個空格字尾生成組。例如』abc defg』字串將生成" a"," d"," ab"," de",abc,"bc ",「def」,「efg」,"fg "}

可通過函式show_trgm查詢字串生成的三元組結果

參考

create extension pg_trgm;

create index idx_xx on tablea using gin (fileda gin_trgm_ops);

查詢中必須有連續的三個明確的值才能使用索引

中文字元限制

少於3個連續字元的like '%xx%'查詢

使用函式,參照三元組思想,自己構造一元組和二元組

create or replace function "crm"."split2arry_v2"(text)

returns "pg_catalog"."_text" as $body$

declare

res text;

len int;

begin

res := regexp_split_to_array($1,'');

len := length($1);

for i in 1..len-1 loop

end loop;

if len > 2 then

for j in 1..len-2 loop

end loop;

end if;

return res;

end;

$body$

language plpgsql immutable strict

cost 100

索引

create index "idx_split_arry_cn_v2" on "crm"."crm_t_archive_person" using gin (

crm.split2arry_v2(cl_name_cn::text) collate "pg_catalog"."default" "pg_catalog"."_text_ops"

);

查詢語句

select * from crm_t_archive_person where split2arry_v2(cl_name_cn) @> array['aa'];
create index test1_lower_col1_idx on test1(lower(col1));

預設建立索引時,索引將鎖定表,不會阻塞select,但會阻塞表create、update和delete這些寫入操作。postgres提供了concurrently關鍵字避免阻塞寫入。

create index concurrently "idx_split_arry_cn_v2" on "crm"."crm_t_archive_person" using gin (

crm.split2arry_v2(cl_name_cn::text) collate "pg_catalog"."default" "pg_catalog"."_text_ops"

);

Postgres10高效能開發(4)控制解釋計畫

引數 預設值說明 enable bitmapscan on啟用或禁用位圖索引掃瞄 enable gathermerge on啟用或禁用收集合併,併發查詢時會出現收集合併 enable hashagg on啟用或禁用hashaggregate enable hashjoin on啟用或禁用hash j...

「位運算」助力高效能開發

符號 描述運算規則 按位與 2個位都為1,結果為1 按位或 乙個位為1,結果為1 按位異或 相同為0,相異為1 按位取反 1變0,0變1 左移各二進位全部左移n位,高位丟棄,低位補0 n 右移各二進位全部右移若干位,對無符號數,高位補0,有符號數,各編譯器處理方法不一樣,有的補符號位 算術右移 有的...

Oracle11高效能開發 (5)SQL調優

全表掃瞄select from c fraud detail trowid訪問select from c fraud detail t where rowid 唯一索引掃瞄select from c fraud detail t where t.id 2016fd3b 7aa6 44d0 80f9 ...