久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

PostgreSQL 統(tǒng)計信息在計算選擇率上的應(yīng)用分析

153次閱讀
沒有評論

共計 5658 個字符,預(yù)計需要花費(fèi) 15 分鐘才能閱讀完成。

這篇文章主要講解了“PostgreSQL 統(tǒng)計信息在計算選擇率上的應(yīng)用分析”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PostgreSQL 統(tǒng)計信息在計算選擇率上的應(yīng)用分析”吧!

一、計算選擇率

單條件等值查詢
測試數(shù)據(jù)生成腳本如下:

insert into t_grxx(dwbh,grbh,xm,xb,nl) 
select generate_series(1,100000)/10|| ,generate_series(1,100000), XM ||generate_series(1,100000),
(case when (floor(random()*2)=0) then  男  else  女  end),floor(random() * 100 + 1)::int;

SQL 腳本和執(zhí)行計劃:

testdb=# explain verbose select * from t_grxx where dwbh =  6323 
 QUERY PLAN 
----------------------------------------------------------------------------------------
 Index Scan using idx_t_grxx_dwbh on public.t_grxx (cost=0.29..46.90 rows=30 width=24)
 Output: dwbh, grbh, xm, xb, nl
 Index Cond: ((t_grxx.dwbh)::text =  6323 ::text)
(3 rows)
testdb=# explain verbose select * from t_grxx where dwbh =  24 
 QUERY PLAN 
----------------------------------------------------------------------------------------
 Index Scan using idx_t_grxx_dwbh on public.t_grxx (cost=0.29..20.29 rows=10 width=24)
 Output: dwbh, grbh, xm, xb, nl
 Index Cond: ((t_grxx.dwbh)::text =  24 ::text)
(3 rows)

雖然都是等值查詢, 但執(zhí)行計劃中 dwbh= 6323 和 dwbh= 24 返回的行數(shù) (rows) 卻不一樣, 一個是 rows=30, 一個是 rows=10, 從生成數(shù)據(jù)的腳本來看, 6323 和 24 的 rows 應(yīng)該是一樣的, 但執(zhí)行計劃顯示的結(jié)果卻不同, 原因是計算選擇率時 6323 出現(xiàn)在高頻值中, 因此與其他值不同.
計算過程解析
查詢該列的統(tǒng)計信息:

testdb=# \x
Expanded display is on.
testdb=# select starelid,staattnum,stainherit,stanullfrac,stawidth,stadistinct 
from pg_statistic 
where starelid = 16742 and staattnum = 1;
-[ RECORD 1 ]---------
starelid | 16742
staattnum | 1
stainherit | f
stanullfrac | 0
stawidth | 4
stadistinct | -0.10015
testdb=# select staattnum,stakind1,staop1,stanumbers1,stavalues1,
 stakind2,staop2,stanumbers2,stavalues2,
 stakind3,staop3,stanumbers3,stavalues3
from pg_statistic 
where starelid = 16742 
 and staattnum = 1;
-[ RECORD 1 ]----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
staattnum | 1
stakind1 | 1
staop1 | 98
stanumbers1 | {0.0003}
stavalues1 | {6323}
stakind2 | 2
staop2 | 664
stanumbers2 | 
stavalues2 | {0,1092,1181,1265,1350,1443,1529,1619,171,1797,1887,1972,2058,2151,2240,2334,2423,2520,2618,271,2798,2892,2987,3076,3162,3246,3332,3421,3510,3597,3685,3777,3860,3956,4051,4136,4227,4317,4408,45,4590,4671,4760,4850,4933,5025,5120,5210,5300,5396,548,5570,5656,5747,5835,5931,6017,6109,6190,6281,6374,6465,6566,6649,6735,6830,6921,7012,7101,7192,7278,737,7455,7544,7630,7711,7801,7895,7988,8081,8167,8260,8344,8430,8520,8615,8707,8809,8901,8997,9083,918,9272,9367,9451,9538,9630,9729,982,9904,9999}
stakind3 | 3
staop3 | 664
stanumbers3 | {0.819578}
stavalues3 |

條件語句是等值表達(dá)式, 使用的操作符是 = (字符串等值比較,texteq/eqsel/eqjoinsel), 因此使用的統(tǒng)計信息是高頻值 MCV(注意:staop1=98, 這是字符串等值比較). 6323 出現(xiàn)在高頻值中, 選擇率為 0.0003, 因此 rows=100,000×0.0003=30. 而 24 沒有出現(xiàn)在高頻值中, 選擇率 =(1-0.0003)/abs(stadistinct)/Tuples=(1-0.0003)/abs(-0.10015)/100000=0.000099820269595606590000,rows=(1-0.0003)/abs(stadistinct)=10(取整).

單條件比較查詢
測試腳本:

testdb=# create table t_int(c1 int,c2 varchar(20));
CREATE TABLE
testdb=# 
testdb=# insert into t_int select generate_series(1,100000)/10, C2 ||generate_series(1,100000)/100;
INSERT 0 100000
testdb=# ANALYZE t_int;
ANALYZE
testdb=# select oid from pg_class where relname= t_int 
 oid 
-------
 16755
(1 row)

查詢 c1 列的統(tǒng)計信息

testdb=# \x
Expanded display is on.
testdb=# select staattnum,stakind1,staop1,stanumbers1,stavalues1,
testdb-# stakind2,staop2,stanumbers2,stavalues2,
testdb-# stakind3,staop3,stanumbers3,stavalues3
testdb-# from pg_statistic 
testdb-# where starelid = 16755 
testdb-# and staattnum = 1;
-[ RECORD 1 ]---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
staattnum | 1
stakind1 | 1
staop1 | 96
stanumbers1 | {0.0003}
stavalues1 | {8306}
stakind2 | 2
staop2 | 97
stanumbers2 | 
stavalues2 | {0,108,215,318,416,514,611,704,809,912,1015,1111,1217,1312,1410,1511,1607,1705,1805,1903,2002,2094,2189,2287,2388,2487,2592,2695,2795,2896,2998,3112,3213,3304,3408,3507,3606,3707,3798,3908,4004,4106,4205,4312,4413,4505,4606,4714,4821,4910,5014,5118,5220,5321,5418,5516,5613,5709,5807,5916,6014,6127,6235,6341,6447,6548,6648,6741,6840,6931,7032,7131,7234,7330,7433,7532,7626,7727,7827,7925,8020,8120,8217,8322,8420,8525,8630,8730,8831,8934,9032,9128,9223,9323,9425,9527,9612,9706,9804,9904,9999}
stakind3 | 3
staop3 | 97
stanumbers3 | {1}
stavalues3 |

查詢語句:

testdb=# explain verbose select * from t_int where c1   2312;
 QUERY PLAN 
-------------------------------------------------------------------
 Seq Scan on public.t_int (cost=0.00..1790.00 rows=23231 width=9)
 Output: c1, c2
 Filter: (t_int.c1   2312)
(3 rows)

SQL 使用了非等值查詢 (,int4lt/scalarltsel/scalarltjoinsel), 結(jié)合統(tǒng)計信息中 MCV 和直方圖使用,
由于 2312 均小于 MCV 中的值, 因此根據(jù) MCV 得出的選擇率為 0.
根據(jù)直方圖計算的選擇率 =(1-0.0003)x(23+(2312-2287-1)/(2388-2287))/100=0.2323065247,rows=100000×0.2323065247=23231(取整)
其中:
除高頻值外的其他數(shù)值占比 =(1-0.0003)
直方圖中的總槽數(shù) = 數(shù)組元素總數(shù) - 1 即 101-1=100
2312 落在第 24 個槽中, 槽占比 =(23+(2312-2287-1)/(2388-2287))/100

感謝各位的閱讀,以上就是“PostgreSQL 統(tǒng)計信息在計算選擇率上的應(yīng)用分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對 PostgreSQL 統(tǒng)計信息在計算選擇率上的應(yīng)用分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-20發(fā)表,共計5658字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 会昌县| 绵阳市| 盖州市| 南漳县| 砀山县| 广饶县| 增城市| 青冈县| 博湖县| 汉川市| 兴和县| 伊吾县| 永兴县| 阜新市| 贺兰县| 宁河县| 卢湾区| 浮梁县| 潞城市| 台南市| 永丰县| 老河口市| 明光市| 青神县| 大足县| 自治县| 周至县| 陇南市| 利津县| 中阳县| 本溪市| 吴忠市| 平安县| 沁源县| 六枝特区| 中超| 高雄县| 双牌县| 塘沽区| 南川市| 韩城市|