校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

熱門標(biāo)簽:電話機器人怎么換人工座席 移動外呼系統(tǒng)模擬題 地圖標(biāo)注要花多少錢 天津開發(fā)區(qū)地圖標(biāo)注app 廣州電銷機器人公司招聘 濟南外呼網(wǎng)絡(luò)電話線路 電銷機器人能補救房產(chǎn)中介嗎 400電話申請客服 江蘇400電話辦理官方

在數(shù)據(jù)庫中經(jīng)常會碰到一些表的列是稀疏列,只有很少的值,例如性別字段,一般就只有2種不同的值。
但是當(dāng)我們求這些稀疏列的唯一值時,如果表的數(shù)據(jù)量很大,速度還是會很慢。

例如:
創(chuàng)建測試表

bill=# create table t_sex (sex char(1), otherinfo text);
CREATE TABLE
bill=# insert into t_sex select 'm', generate_series(1,10000000)||'this is test';
INSERT 0 10000000
bill=# insert into t_sex select 'w', generate_series(1,10000000)||'this is test';
INSERT 0 10000000

查詢:
可以看到下面的查詢速度很慢。

bill=# select count(distinct sex) from t_sex;
 count
-------
   2
(1 row)

Time: 8803.505 ms (00:08.804)
bill=# select sex from t_sex t group by sex;
 sex
-----
 m
 w
(2 rows)

Time: 1026.464 ms (00:01.026)

那么我們對該字段加上索引又是什么情況呢?

速度依然沒有明顯

bill=# create index idx_sex_1 on t_sex(sex);
CREATE INDEX
bill=# select count(distinct sex) from t_sex;
 count
-------
   2
(1 row)

Time: 8502.460 ms (00:08.502)
bill=# select sex from t_sex t group by sex;
 sex
-----
 m
 w
(2 rows)

Time: 572.353 ms

的變化,可以看到執(zhí)行計劃已經(jīng)使用Index Only Scan了。

bill=# explain select count(distinct sex) from t_sex;
                     QUERY PLAN
----------------------------------------------------------------------------------------------
 Aggregate (cost=371996.44..371996.45 rows=1 width=8)
  -> Index Only Scan using idx_sex_1 on t_sex (cost=0.44..321996.44 rows=20000000 width=2)
(2 rows)

同樣的SQL我們看看在Oracle中性能如何?

創(chuàng)建測試表:

SQL> create table t_sex (sex char(1), otherinfo varchar2(100));

Table created.

SQL> insert into t_sex select 'm', rownum||'this is test' from dual connect by level =10000000;

10000000 rows created.

SQL> commit;

Commit complete.

SQL> insert into t_sex select 'w', rownum||'this is test' from dual connect by level =10000000;

10000000 rows created.

SQL> commit;

Commit complete.

性能測試:

SQL> set lines 1000 pages 2000
SQL> set autotrace on
SQL> set timing on

SQL> select count(distinct sex) from t_sex;

COUNT(DISTINCTSEX)
------------------
         2

Elapsed: 00:00:01.58

Execution Plan
----------------------------------------------------------
Plan hash value: 3915432945

----------------------------------------------------------------------------
| Id | Operation     | Name | Rows | Bytes | Cost (%CPU)| Time   |
----------------------------------------------------------------------------
|  0 | SELECT STATEMENT  |    |   1 |   3 | 20132  (1)| 00:00:01 |
|  1 | SORT GROUP BY   |    |   1 |   3 |      |     |
|  2 |  TABLE ACCESS FULL| T_SEX |  14M|  42M| 20132  (1)| 00:00:01 |
----------------------------------------------------------------------------

Note
-----
  - dynamic statistics used: dynamic sampling (level=2)


Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
   74074 consistent gets
     0 physical reads
     0 redo size
    552 bytes sent via SQL*Net to client
    608 bytes received via SQL*Net from client
     2 SQL*Net roundtrips to/from client
     1 sorts (memory)
     0 sorts (disk)
     1 rows processed

SQL> select sex from t_sex t group by sex;

SE
--
m
w

Elapsed: 00:00:01.08

Execution Plan
----------------------------------------------------------
Plan hash value: 3915432945

----------------------------------------------------------------------------
| Id | Operation     | Name | Rows | Bytes | Cost (%CPU)| Time   |
----------------------------------------------------------------------------
|  0 | SELECT STATEMENT  |    |  14M|  42M| 20558  (3)| 00:00:01 |
|  1 | SORT GROUP BY   |    |  14M|  42M| 20558  (3)| 00:00:01 |
|  2 |  TABLE ACCESS FULL| T_SEX |  14M|  42M| 20132  (1)| 00:00:01 |
----------------------------------------------------------------------------

Note
-----
  - dynamic statistics used: dynamic sampling (level=2)


Statistics
----------------------------------------------------------
     0 recursive calls
     0 db block gets
   74074 consistent gets
     0 physical reads
     0 redo size
    589 bytes sent via SQL*Net to client
    608 bytes received via SQL*Net from client
     2 SQL*Net roundtrips to/from client
     1 sorts (memory)
     0 sorts (disk)
     2 rows processed

可以看到Oracle的性能即使不加索引也明顯比PostgreSQL中要好。
那么我們在PostgreSQL中是不是沒辦法繼續(xù)優(yōu)化了呢?這種情況我們利用pg中的遞歸語句結(jié)合索引可以大幅提升性能。

SQL改寫:

bill=# with recursive tmp as (
bill(#  (
bill(#   select min(t.sex) as sex from t_sex t where t.sex is not null
bill(#  )
bill(#  union all
bill(#  (
bill(#   select (select min(t.sex) from t_sex t where t.sex > s.sex and t.sex is not null)
bill(#    from tmp s where s.sex is not null
bill(#  )
bill(# )
bill-# select count(distinct sex) from tmp;
 count
-------
   2
(1 row)

Time: 2.711 ms

查看執(zhí)行計劃:

bill=# explain with recursive tmp as (
bill(#  (
bill(#   select min(t.sex) as sex from t_sex t where t.sex is not null
bill(#  )
bill(#  union all
bill(#  (
bill(#   select (select min(t.sex) from t_sex t where t.sex > s.sex and t.sex is not null)
bill(#    from tmp s where s.sex is not null
bill(#  )
bill(# )
bill-# select count(distinct sex) from tmp;
                           QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
 Aggregate (cost=53.62..53.63 rows=1 width=8)
  CTE tmp
   -> Recursive Union (cost=0.46..51.35 rows=101 width=32)
      -> Result (cost=0.46..0.47 rows=1 width=32)
         InitPlan 3 (returns $1)
          -> Limit (cost=0.44..0.46 rows=1 width=2)
             -> Index Only Scan using idx_sex_1 on t_sex t (cost=0.44..371996.44 rows=20000000 width=2)
                Index Cond: (sex IS NOT NULL)
      -> WorkTable Scan on tmp s (cost=0.00..4.89 rows=10 width=32)
         Filter: (sex IS NOT NULL)
  -> CTE Scan on tmp (cost=0.00..2.02 rows=101 width=32)
(11 rows)

Time: 1.371 ms

可以看到執(zhí)行時間從原先的8000ms降低到了2ms,提升了幾千倍!

甚至對比Oracle,性能也是提升了很多。

但是需要注意的是:這種寫法僅僅是針對稀疏列,換成數(shù)據(jù)分布廣泛的字段,顯然性能是下降的, 所以使用遞歸SQL不適合數(shù)據(jù)分布廣泛的字段的group by或者count(distinct)操作。

到此這篇關(guān)于PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的文章就介紹到這了,更多相關(guān)PostgreSQL遞歸優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • postgresql 導(dǎo)入數(shù)據(jù)庫表并重設(shè)自增屬性的操作
  • 在PostgreSQL中設(shè)置表中某列值自增或循環(huán)方式
  • postgresql數(shù)據(jù)添加兩個字段聯(lián)合唯一的操作

標(biāo)簽:榆林 昭通 溫州 海西 辛集 濮陽 杭州 寶雞

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法》,本文關(guān)鍵詞  PostgreSQL,利用,遞歸,優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    91福利在线观看| 99热在这里有精品免费| 日韩一卡二卡三卡四卡| 日韩经典一区二区| 欧美一区二区免费视频| 久久99精品国产.久久久久久 | 色系网站成人免费| 亚洲精品老司机| 欧美日本免费一区二区三区| 日日夜夜精品视频天天综合网| 日韩一级黄色大片| 国产麻豆精品95视频| 中文字幕中文字幕中文字幕亚洲无线| 91性感美女视频| 亚洲国产综合视频在线观看| 91精品国产免费| 成年人午夜久久久| 国产精品1024| 国产精品自拍av| 欧美伊人久久久久久午夜久久久久| 久久综合色婷婷| 91精品国产乱| 欧美日韩色综合| 欧美性受xxxx黑人xyx性爽| 久久精品国产色蜜蜜麻豆| 亚洲18女电影在线观看| 亚洲主播在线观看| 国产成人精品亚洲日本在线桃色| 亚洲品质自拍视频| 极品尤物av久久免费看| 色婷婷久久久亚洲一区二区三区| 国产午夜精品一区二区三区视频 | 国产成人综合视频| 99久久久国产精品免费蜜臀| 日韩和欧美的一区| 26uuu国产电影一区二区| 99精品国产99久久久久久白柏| 午夜久久久影院| 国产亚洲婷婷免费| 欧美少妇一区二区| 国产乱码精品1区2区3区| 亚洲最新视频在线观看| 精品噜噜噜噜久久久久久久久试看| www.久久精品| 麻豆精品一区二区av白丝在线| 国产精品剧情在线亚洲| 欧美肥妇free| 99在线视频精品| 久久国产综合精品| 18欧美亚洲精品| 欧美成人福利视频| 91国产成人在线| 国产尤物一区二区| 亚洲成国产人片在线观看| 国产色一区二区| 91麻豆精品国产91久久久| 成人网页在线观看| 免费观看久久久4p| 一区二区三区蜜桃网| 久久日一线二线三线suv| 欧美视频在线观看一区二区| 国产成人av电影在线| 日韩国产欧美在线观看| 亚洲另类中文字| 国产女主播在线一区二区| 欧美一区二区三区视频免费播放| 成人av影视在线观看| 精品在线播放免费| 午夜精品123| 亚洲欧美一区二区三区孕妇| 亚洲色图一区二区| 国产在线看一区| 首页国产欧美日韩丝袜| 亚洲欧美另类综合偷拍| 久久久久久久久久久久电影| 91精品欧美久久久久久动漫 | 久久精品夜色噜噜亚洲aⅴ| 91福利国产成人精品照片| 丁香网亚洲国际| 国产一区二区美女诱惑| 人人狠狠综合久久亚洲| 亚洲一区二区视频在线| 中文字幕综合网| 日本一区二区免费在线| 亚洲精品在线电影| 欧美一区二区三区免费在线看| 日本韩国欧美在线| 99精品视频在线播放观看| 国产成人鲁色资源国产91色综 | 国产欧美精品国产国产专区 | 一区二区三区欧美| 国产精品久久综合| 日本一区二区三区国色天香| 2020日本不卡一区二区视频| 欧美一区二区三区爱爱| 制服丝袜中文字幕一区| 欧美群妇大交群的观看方式| 一本大道av一区二区在线播放 | 91色综合久久久久婷婷| 成人激情av网| 成人app在线观看| 岛国精品在线观看| 高清beeg欧美| 成人免费看片app下载| 懂色av中文字幕一区二区三区 | 日本高清不卡视频| 一本色道久久综合狠狠躁的推荐| 成人激情免费电影网址| 成人免费高清视频| 成人av网在线| 91网站最新网址| 色综合天天综合网天天狠天天| 不卡在线视频中文字幕| aaa亚洲精品一二三区| av一二三不卡影片| 91女厕偷拍女厕偷拍高清| 91视频.com| 精品视频一区二区不卡| 欧美精品xxxxbbbb| 日韩欧美一区二区视频| 精品国产伦理网| 国产色一区二区| 中文字幕不卡的av| 日韩毛片视频在线看| 亚洲男人的天堂一区二区| 国产成人精品在线看| 亚洲一区二区三区四区不卡| 亚洲在线免费播放| 天天色图综合网| 美国av一区二区| 国产精品一区二区男女羞羞无遮挡| 国产大片一区二区| 波多野结衣在线一区| www.亚洲国产| 欧美系列在线观看| 91精品国产91久久久久久一区二区| 欧美高清视频不卡网| 日韩三级.com| 国产欧美一区二区精品仙草咪| 国产精品福利影院| 一区二区高清免费观看影视大全| 午夜欧美在线一二页| 麻豆精品国产91久久久久久| 国产精品18久久久久久久久久久久| 成人av免费在线| 欧美日韩高清在线播放| 精品欧美黑人一区二区三区| 欧美激情一区在线观看| 一区二区三区**美女毛片| 轻轻草成人在线| 国产69精品久久久久毛片| 色欧美乱欧美15图片| 欧美精品一二三| 2023国产一二三区日本精品2022| 中文字幕在线观看一区二区| 亚洲成人动漫一区| 国产一区二区三区高清播放| 91在线国产观看| 欧美精品视频www在线观看| 精品国产成人在线影院| 亚洲天堂av老司机| 日韩 欧美一区二区三区| 国产99久久久国产精品潘金| 日本丰满少妇一区二区三区| 欧美α欧美αv大片| 中文字幕亚洲精品在线观看 | 亚洲欧美日韩系列| 婷婷综合久久一区二区三区| 国模少妇一区二区三区| 91老师片黄在线观看| 欧美一区二区播放| 国产精品理论在线观看| 视频一区在线播放| 成人精品免费网站| 91精品午夜视频| 国产精品国产精品国产专区不片| 青青草国产精品97视觉盛宴| 成人激情开心网| 欧美v国产在线一区二区三区| 亚洲男人的天堂av| 国产一区免费电影| 欧美日韩国产首页| 国产精品美女久久久久久2018| 丝袜脚交一区二区| aaa亚洲精品| 久久久美女毛片| 日韩精品一级中文字幕精品视频免费观看 | 国产麻豆视频一区二区| 欧美一级淫片007| 国产欧美日韩久久| 老汉av免费一区二区三区| 91视频免费看| 国产喂奶挤奶一区二区三区| 日精品一区二区| caoporn国产精品| 91精品国产色综合久久不卡蜜臀| 中文字幕一区二区三区四区不卡| 久久爱www久久做| 欧美欧美欧美欧美首页| 日韩一区中文字幕|