日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

postgresql中表的继承及分区表(四)

發布時間:2025/3/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 postgresql中表的继承及分区表(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

分區查詢優化-Constraint Exclusion

Oracle中這種技術叫分區裁剪(Partition Pruning),通過排除不需要的分區,只掃描特定分區來極大地優化sql查詢

PG中的分區因為通過check約束來實現,因此查詢條件中如果滿足某些子分區的約束,就可以通過排除不必要的分區來提高查詢效率

這里我們通過執行計劃來看一下pg的這個特性.

db01=> show constraint_exclusion;constraint_exclusion ----------------------partition (1 row)db01=> explain select * from t_partition where log_date = date'2015-3-13';QUERY PLAN ----------------------------------------------------------------------------------------------Append (cost=0.00..13.67 rows=7 width=40)-> Seq Scan on t_partition (cost=0.00..0.00 rows=1 width=40)Filter: (log_date = '2015-03-13'::date)-> Bitmap Heap Scan on t_partition_s200503 (cost=4.20..13.67 rows=6 width=40)Recheck Cond: (log_date = '2015-03-13'::date)-> Bitmap Index Scan on idx_t_partition_s200503_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = '2015-03-13'::date) (7 rows)

constraint_exclusion參數控制查詢優化器是否使用這種技術.
這里可以看到只查詢了t_partition_s200503這個分區

不使用此優化手段后的計劃:

db01=> set constraint_exclusion=off; SET db01=> explain select * from t_partition where log_date = date'2015-3-13';QUERY PLAN ----------------------------------------------------------------------------------------------Append (cost=0.00..65.50 rows=25 width=40)-> Seq Scan on t_partition (cost=0.00..0.00 rows=1 width=40)Filter: (log_date = '2015-03-13'::date)-> Bitmap Heap Scan on t_partition_s200502 (cost=4.20..13.67 rows=6 width=40)Recheck Cond: (log_date = '2015-03-13'::date)-> Bitmap Index Scan on idx_t_partition_s200502_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = '2015-03-13'::date)-> Bitmap Heap Scan on t_partition_s200503 (cost=4.20..13.67 rows=6 width=40)Recheck Cond: (log_date = '2015-03-13'::date)-> Bitmap Index Scan on idx_t_partition_s200503_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = '2015-03-13'::date)-> Bitmap Heap Scan on t_partition_s200504 (cost=4.20..13.67 rows=6 width=40)Recheck Cond: (log_date = '2015-03-13'::date)-> Bitmap Index Scan on idx_t_partition_s200504_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = '2015-03-13'::date)-> Seq Scan on t_partition_s200505 (cost=0.00..24.50 rows=6 width=40)Filter: (log_date = '2015-03-13'::date) (17 rows)

可以看到優化器選擇的方案是每個子分區全部掃描一遍,顯而易見性能差距有多大.

PG支持的分區類型

暫時只支持range partition 和 list partition
list 跟 range類似, 比如分公司表按各分公司代碼分區的check 寫法為 (check branch = '1010100' )

分區總結

總得來說pg的分區功能支持類型較少,與oracle相比較實現比較復雜.

這里還需要注意:
1. 各子分區見的check約束不要發生數據重疊情況.
2. 直接更新分區關鍵字,迫使該記錄映射到其他分區會失敗,需要通過變通方法實現.

db01=> select * from t_partition;id | msg | log_date ----+------+------------2 | msg2 | 2015-02-133 | msg3 | 2015-03-024 | msg4 | 2015-04-12 (3 rows)db01=> update t_partition set log_date = date'2015-3-20' where id = 4; ERROR: new row for relation "t_partition_s200504" violates check constraint "t_partition_s200504_log_date_check" DETAIL: Failing row contains (4, msg4, 2015-03-20). db01=> with t as ( db01(> delete from t_partition where id =4 returning * ) db01-> insert into t_partition select t.id,t.msg,date'2015-03-20' from t; INSERT 0 0

或者可以通過觸發器來實現

3. 約束排除(Constraint Exclusion)對于諸如now()等不確定的值不能使用此技術來優化.

db01=> show constraint_exclusion;constraint_exclusion ----------------------partition (1 row)db01=> explain select * from t_partition where log_date = now();QUERY PLAN ----------------------------------------------------------------------------------------------Append (cost=0.00..68.45 rows=25 width=40)-> Seq Scan on t_partition (cost=0.00..0.00 rows=1 width=40)Filter: (log_date = now())-> Bitmap Heap Scan on t_partition_s200502 (cost=4.20..13.68 rows=6 width=40)Recheck Cond: (log_date = now())-> Bitmap Index Scan on idx_t_partition_s200502_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = now())-> Bitmap Heap Scan on t_partition_s200503 (cost=4.20..13.68 rows=6 width=40)Recheck Cond: (log_date = now())-> Bitmap Index Scan on idx_t_partition_s200503_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = now())-> Bitmap Heap Scan on t_partition_s200504 (cost=4.20..13.68 rows=6 width=40)Recheck Cond: (log_date = now())-> Bitmap Index Scan on idx_t_partition_s200504_1 (cost=0.00..4.20 rows=6 width=0)Index Cond: (log_date = now())-> Seq Scan on t_partition_s200505 (cost=0.00..27.40 rows=6 width=40)Filter: (log_date = now()) (17 rows)

4. 由于計劃器進行constraint_exclusion時,對每個子分區的約束檢查,因此子分區太多會影響解析的性能,官方所說的百八十個性能還可以我沒有機會測試.不要超過千八百個..

//END

轉載于:https://my.oschina.net/hippora/blog/379754

總結

以上是生活随笔為你收集整理的postgresql中表的继承及分区表(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。