最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL游標(biāo)與索引選擇實(shí)例詳細(xì)介紹

 更新時(shí)間:2022年09月15日 16:34:32   作者:foucus、  
這篇文章主要介紹了PostgreSQL游標(biāo)與索引選擇優(yōu)化案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

之前有寫過(guò)一個(gè)案例,order by limit因?yàn)閿?shù)據(jù)分布不均而選擇了錯(cuò)誤的索引,這是由于優(yōu)化器沒法判斷數(shù)據(jù)的分布關(guān)系,默認(rèn)認(rèn)為數(shù)據(jù)分布是均勻的所導(dǎo)致的。

而除了limit,當(dāng)我們?cè)谑褂糜螛?biāo)時(shí)也要注意有可能會(huì)出現(xiàn)類似的情況。而往往這類在存儲(chǔ)過(guò)程中的SQL我們更難發(fā)現(xiàn)其選擇了錯(cuò)誤的執(zhí)行計(jì)劃,所以需要注意。

1、建測(cè)試表

bill=# create table tbl (id int, c1 int, c2 int, c3 int, c4 int);
CREATE TABLE

2、寫入一批隨機(jī)數(shù)據(jù),ID從1到1000萬(wàn)。

bill=# insert into tbl select generate_series(1,10000000), random()*100, random()*100, random()*100, random()*100;  
INSERT 0 10000000  

3、寫入另一批100萬(wàn)條數(shù)據(jù),c1,c2 與前面1000萬(wàn)的值不一樣。

bill=# insert into tbl select generate_series(10000001,11000000), 200,200,200,200;  
INSERT 0 1000000  

4、創(chuàng)建兩個(gè)索引,也就是本文需要重點(diǎn)關(guān)注的,到底走哪個(gè)索引更劃算

bill=# create index idx_tbl_1 on tbl(id);  
CREATE INDEX  
bill=# create index idx_tbl_2 on tbl(c1,c2,c3,c4);  
CREATE INDEX  

5、收集統(tǒng)計(jì)信息

bill=# vacuum analyze tbl;  
VACUUM  

6、查看下面SQL的執(zhí)行計(jì)劃,走了正確的索引

bill=# explain select * from tbl where c1=200 and c2=200 order by id;
                                     QUERY PLAN
-------------------------------------------------------------------------------------
 Sort  (cost=72109.20..72344.16 rows=93984 width=20)
   Sort Key: id
   ->  Bitmap Heap Scan on tbl  (cost=1392.77..60811.81 rows=93984 width=20)
         Recheck Cond: ((c1 = 200) AND (c2 = 200))
         ->  Bitmap Index Scan on idx_tbl_2  (cost=0.00..1369.28 rows=93984 width=0)
               Index Cond: ((c1 = 200) AND (c2 = 200))
(6 rows)

7、而當(dāng)我們?cè)谟螛?biāo)中使用該SQL時(shí),會(huì)發(fā)現(xiàn)執(zhí)行計(jì)劃出現(xiàn)了偏差

bill=# begin;
BEGIN
bill=*# explain declare tt cursor for select * from tbl where c1=200 and c2=200 order by id;
                                  QUERY PLAN
-------------------------------------------------------------------------------
 Index Scan using idx_tbl_1 on tbl  (cost=0.43..329277.60 rows=93984 width=20)
   Filter: ((c1 = 200) AND (c2 = 200))
(2 rows)

為什么會(huì)出現(xiàn)這種情況呢,這其實(shí)是因?yàn)槭褂糜螛?biāo)的SQL會(huì)根據(jù)cursor_tuple_fraction參數(shù)進(jìn)行自動(dòng)優(yōu)化,而該參數(shù)默認(rèn)是0.1,表示只檢索前10%的行進(jìn)行預(yù)估,這就和limit有點(diǎn)異曲同工的味道了。

因?yàn)閷?duì)于這張表,優(yōu)化器認(rèn)為數(shù)據(jù)是均勻分布的,而實(shí)際上,數(shù)據(jù)分布是不均勻的,c1=200 and c2=200的記錄在表的末端。當(dāng)我們?cè)谟螛?biāo)中只檢索了前10%的行,所以會(huì)得到一個(gè)錯(cuò)誤的執(zhí)行計(jì)劃。

具體的細(xì)節(jié)我們可以在parsenodes.h和planner.c中看到:

當(dāng)使用cursor或者SPI_PREPARE_CURSOR函數(shù)時(shí),會(huì)設(shè)置CURSOR_OPT_FAST_PLAN標(biāo)志位,然后就會(huì)根據(jù)cursor_tuple_fraction參數(shù)對(duì)SQL進(jìn)行自動(dòng)優(yōu)化,所以對(duì)于一些數(shù)據(jù)分布不均的情況,可能就會(huì)

導(dǎo)致選擇了錯(cuò)誤的執(zhí)行計(jì)劃。
	/* Determine what fraction of the plan is likely to be scanned */
	if (cursorOptions & CURSOR_OPT_FAST_PLAN)
	{
		/*
		 * We have no real idea how many tuples the user will ultimately FETCH
		 * from a cursor, but it is often the case that he doesn't want 'em
		 * all, or would prefer a fast-start plan anyway so that he can
		 * process some of the tuples sooner.  Use a GUC parameter to decide
		 * what fraction to optimize for.
		 */
		tuple_fraction = cursor_tuple_fraction;
		/*
		 * We document cursor_tuple_fraction as simply being a fraction, which
		 * means the edge cases 0 and 1 have to be treated specially here.  We
		 * convert 1 to 0 ("all the tuples") and 0 to a very small fraction.
		 */
		if (tuple_fraction >= 1.0)
			tuple_fraction = 0.0;
		else if (tuple_fraction <= 0.0)
			tuple_fraction = 1e-10;
	}
	else
	{
		/* Default assumption is we need all the tuples */
		tuple_fraction = 0.0;
	}

到此這篇關(guān)于PostgreSQL游標(biāo)與索引選擇實(shí)例詳細(xì)介紹的文章就介紹到這了,更多相關(guān)PostgreSQL游標(biāo)與索引選擇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Postgres bytea類型 轉(zhuǎn)換及查看操作

    Postgres bytea類型 轉(zhuǎn)換及查看操作

    這篇文章主要介紹了Postgres bytea類型 轉(zhuǎn)換及查看操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • PostgreSQL實(shí)現(xiàn)一個(gè)通用標(biāo)簽系統(tǒng)

    PostgreSQL實(shí)現(xiàn)一個(gè)通用標(biāo)簽系統(tǒng)

    這篇文章主要給大家介紹了關(guān)于利用PostgreSQL實(shí)現(xiàn)一個(gè)通用標(biāo)簽系統(tǒng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • postgreSQL如何設(shè)置數(shù)據(jù)庫(kù)執(zhí)行超時(shí)時(shí)間

    postgreSQL如何設(shè)置數(shù)據(jù)庫(kù)執(zhí)行超時(shí)時(shí)間

    本文我們將深入探討PostgreSQL數(shù)據(jù)庫(kù)中的一個(gè)關(guān)鍵設(shè)置SET?statement_timeout,這個(gè)設(shè)置對(duì)于管理數(shù)據(jù)庫(kù)性能和優(yōu)化查詢執(zhí)行時(shí)間非常重要,讓我們一起來(lái)了解它的工作原理以及如何有效地使用它
    2024-01-01
  • postgresql 查詢字符串中是否包含某字符的操作

    postgresql 查詢字符串中是否包含某字符的操作

    這篇文章主要介紹了postgresql 查詢字符串中是否包含某字符的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Centos環(huán)境下Postgresql 安裝配置及環(huán)境變量配置技巧

    Centos環(huán)境下Postgresql 安裝配置及環(huán)境變量配置技巧

    本文給大家分享在Centos環(huán)境下Postgresql 安裝配置及環(huán)境變量配置技巧,給大家?guī)?lái)了詳細(xì)的安裝步驟,對(duì)Postgresql 安裝配置相關(guān)知識(shí)感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2021-05-05
  • PostgreSQL 慢查詢SQL跟蹤操作

    PostgreSQL 慢查詢SQL跟蹤操作

    這篇文章主要介紹了PostgreSQL 慢查詢SQL跟蹤操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • postgresql無(wú)序uuid性能測(cè)試及對(duì)數(shù)據(jù)庫(kù)的影響

    postgresql無(wú)序uuid性能測(cè)試及對(duì)數(shù)據(jù)庫(kù)的影響

    小編最近在做一個(gè)超大表的性能測(cè)試,在過(guò)程中發(fā)現(xiàn)無(wú)序uuid做主鍵對(duì)表插入性能有些影響,糾結(jié)該怎么處理這一問題呢?接下來(lái)小編給大家分享postgresql無(wú)序uuid性能測(cè)試的相關(guān)知識(shí)幫助大家學(xué)習(xí),需要的彭參考下吧
    2021-06-06
  • postgresql中的ctid解讀

    postgresql中的ctid解讀

    這篇文章主要介紹了postgresql中的ctid使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • PostgreSQL教程(一):數(shù)據(jù)表詳解

    PostgreSQL教程(一):數(shù)據(jù)表詳解

    這篇文章主要介紹了PostgreSQL教程(一):數(shù)據(jù)表詳解表的定義、系統(tǒng)字段、表的修改、表的權(quán)限等4大部份內(nèi)容,內(nèi)容種包括表的創(chuàng)建、刪除、修改、字段的修改、刪除、主鍵和外鍵、約束添加修改刪除等,本文講解了,需要的朋友可以參考下
    2015-05-05
  • sqoop讀取postgresql數(shù)據(jù)庫(kù)表格導(dǎo)入到hdfs中的實(shí)現(xiàn)

    sqoop讀取postgresql數(shù)據(jù)庫(kù)表格導(dǎo)入到hdfs中的實(shí)現(xiàn)

    這篇文章主要介紹了sqoop讀取postgresql數(shù)據(jù)庫(kù)表格導(dǎo)入到hdfs中的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

南汇区| 来宾市| 苗栗市| 安宁市| 拜泉县| 建宁县| 平陆县| 禄丰县| 江城| 商水县| 白沙| 嘉义市| 丁青县| 鄱阳县| 江津市| 临高县| 洪雅县| 赞皇县| 库伦旗| 建湖县| 绥江县| 甘德县| 昌乐县| 怀安县| 乌拉特中旗| 文水县| 安康市| 桓台县| 聂拉木县| 开平市| 肥城市| 恭城| 宜州市| 鲁山县| 和顺县| 平山县| 印江| 武乡县| 景宁| 宿松县| 微博|