成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > postgresql通過索引優(yōu)化查詢速度操作

postgresql通過索引優(yōu)化查詢速度操作

熱門標(biāo)簽:美容工作室地圖標(biāo)注 外呼調(diào)研系統(tǒng) 漯河外呼電話系統(tǒng) 辦公外呼電話系統(tǒng) 重慶自動外呼系統(tǒng)定制 地圖標(biāo)注和圖片名稱的區(qū)別 打電話智能電銷機(jī)器人授權(quán) 合肥公司外呼系統(tǒng)運(yùn)營商 海豐有多少商家沒有地圖標(biāo)注

當(dāng)數(shù)據(jù)量比較大的時候,提升查詢效率就是需要去考慮的事情了。一個百萬級別的表格,如果不做任何優(yōu)化的話,即使是最簡單的查詢語句執(zhí)行起來也是慢的讓人難以接受;當(dāng)然“優(yōu)化”本身是一個比較復(fù)雜的工程,從設(shè)計表、字段到查詢語句的寫法都有很多講究,這里只考慮索引的方式,且是最普通的索引;

下面的操作中對應(yīng)數(shù)據(jù)庫表w008_execrise_info(8000數(shù)據(jù)量), w008_wf02_info(4000數(shù)據(jù)量)

1 任務(wù)表數(shù)據(jù)

SELECT
 w.*
FROM
 w008_wf02_info w 
WHERE
 w.is_removed =0
 AND w.wfno = 'WF02' 
 AND EXISTS (
SELECT
 1 
FROM
 w008_execrise_info info
 JOIN w008_privilege_allocation P ON (
 info.subjecttyp = P.subjecttyp 
 AND info.gradetyp = P.gradetyp 
 AND P.loginname = w.create_by 
 AND P.verifyusers ='yixi_li'
 AND P.wftype = 20 
 ) 
WHERE
 info.is_removed =0 
 AND info.wfid = w.wfid 
 ) 
 
ORDER BY
 create_date DESC

執(zhí)行結(jié)果:耗時在3秒左右(這個數(shù)據(jù)量,這個速度就比較慢了)

順帶說一句,這里把w.* 改成對應(yīng)的字段也會稍微的提高一些查詢速度(畢竟少了一步把*轉(zhuǎn)成對應(yīng)字段的操作),在標(biāo)準(zhǔn)的查詢規(guī)范中也不會寫成table.*這種方式的。

2 添加索引:

雖說索引可以提高查詢速度,但是不代表加了索引就一定會加快查詢速度,有時甚至?xí)m得其反。

一般來說索引會加在where 后面的查詢字段,尤其是關(guān)聯(lián)字段上面,這里w008_execrise_info 表數(shù)據(jù)量最大,暫時針對這個表進(jìn)行處理;w008_execrise_info 表涉及四個字段:subjecttyp,gradetyp,wfid和is_removed。

其中is_removed先不考慮,subjecttyp和gradetyp保存的是字典表的數(shù)據(jù)(數(shù)據(jù)內(nèi)容比較少,類似10 20 30 40),wfid保存的是數(shù)字類型的字符串。

一個索引起到的效果還取決于這樣一個條件,一般來說添加索引的字段的值"唯一性"越明顯越好,在這里,subjecttyp和gradetyp包含大量的重復(fù)值,索引效果會“不明顯”一些,而wfid 更像是“主鍵”,相對應(yīng)的效果會好很多。

2.1 subjecttyp 和gradetyp添加索引

CREATE INDEX w008_execrise_info_gradetyp_index ON w008_execrise_info (gradetyp);

CREATE INDEX w008_execrise_info_subjecttyp_index ON w008_execrise_info (subjecttyp);

添加后執(zhí)行時間大約2秒,快了一點(diǎn)點(diǎn)

2.2 對wfid添加索引

CREATE INDEX w008_execrise_info_wfid_index ON w008_execrise_info (wfid);

再次執(zhí)行,0.2秒左右,快了很多

再補(bǔ)充一句,有很多情況下索引是不起作用的,比如 like后面跟的字段,還有條件語句or關(guān)聯(lián)的字段,這種情況就是要考慮查詢策略了。

3 查看當(dāng)前表的索引內(nèi)容;

select * from pg_indexes where tablename='w008_execrise_info';

select * from pg_statio_all_indexes where relname='w008_execrise_info';

4 刪除索引

DROP INDEX indexName;

5 重置索引

對于一些經(jīng)常改動的表,如果時間長了發(fā)現(xiàn)查詢效率變慢,可以考慮重置一下索引;

因?yàn)槿绻淼膬?nèi)容被頻繁的修改的話會產(chǎn)生許多類似'索引碎片'的東西,會導(dǎo)致查詢索引本身的時間變長;

 REINDEX INDEX index_name;//重置單個索引
 REINDEX TABLE table_name;//重置整個表的索引
 REINDEX DATABASE db_name;//終止整個數(shù)據(jù)庫的所以你

補(bǔ)充:PostgreSql查詢優(yōu)化之根據(jù)執(zhí)行計劃優(yōu)化SQL

1、執(zhí)行計劃路徑選擇

postgresql查詢規(guī)劃過程中,查詢請求的不同執(zhí)行方案是通過建立不同的路徑來表達(dá)的,在生成許多符合條件的路徑之后,要從中選擇出代價最小的路徑(基于成本運(yùn)算),把它轉(zhuǎn)化為一個計劃,傳遞給執(zhí)行器執(zhí)行,規(guī)劃器的核心工作就是生成多條路徑,然后從中找出最優(yōu)的那一條。

1.1代價評估

評估路徑優(yōu)劣的依據(jù)是用系統(tǒng)表pg_statistic中的統(tǒng)計信息估算出來的不同路徑的代價(cost),PostgreSQL估計計劃成本的方式:基于統(tǒng)計信息估計計劃中各個節(jié)點(diǎn)的成本。PostgreSQL會分析各個表來獲取一個統(tǒng)計信息樣本(這個操作通常是由autovacuum這個守護(hù)進(jìn)程周期性的執(zhí)行analyze,來收集這些統(tǒng)計信息,然后保存到pg_statistic和pg_class里面)。

1.2用于估算代價的參數(shù)postgresql.conf

# - Planner Cost Constants -
 
#seq_page_cost = 1.0  # measured on an arbitrary scale 順序磁盤掃描時單個頁面的開銷
 
#random_page_cost = 4.0  # same scale as above 隨機(jī)磁盤訪問時單頁面的讀取開銷
 
#cpu_tuple_cost = 0.01  # same scale as above cpu處理每一行的開銷
 
#cpu_index_tuple_cost = 0.005 # same scale as above cpu處理每個索引行的開銷
 
#cpu_operator_cost = 0.0025 # same scale as above cpu處理每個運(yùn)算符或者函數(shù)調(diào)用的開銷
 
#parallel_tuple_cost = 0.1 # same scale as above 計算并行處理的成本,如果成本高于非并行,則不會開啟并行處理。
 
#parallel_setup_cost = 1000.0 # same scale as above
 
#min_parallel_relation_size = 8MB
 
#effective_cache_size = 4GB 再一次索引掃描中可用的文件系統(tǒng)內(nèi)核緩沖區(qū)有效大小

也可以使用 show all的方式查看

1.3 路徑的選擇

--查看表信息

highgo=# \d t_jcxxgl_tjaj
 
  Table "db_jcxx.t_jcxxgl_tjaj"
 
 Column |  Type  | Modifiers --------------+--------------------------------+-----------
 
 c_bh | character(32)   | not null
 
 c_xzdm | character varying(300)  |
 
 c_jgid | character(32)   |
 
 c_ajbm | character(22)   |
 
...
 
Indexes:
 
 "t_jcxxgl_tjaj_pkey" PRIMARY KEY, btree (c_bh)
 
 "idx_ttjaj_cah" btree (c_ah)
 
 "idx_ttjaj_dslrq" btree (d_slrq)

首先更新統(tǒng)計信息vacuum analyze t_jcxxgl_tjaj,許多時候可能因?yàn)榻y(tǒng)計信息的不準(zhǔn)確導(dǎo)致了不正常的執(zhí)行計劃--執(zhí)行計劃。

--執(zhí)行計劃,全表掃描

highgo=# explain (analyze,verbose,costs,buffers,timing)select c_bh,c_xzdm,c_jgid,c_ajbm from t_jcxxgl_tjaj where d_slrq >='2018-03-18';
 
       QUERY PLAN      ------------------------------------------------------------------------------------------------------------
 
 Seq Scan on db_jcxx.t_jcxxgl_tjaj (cost=0.00..9.76 rows=3 width=96) (actual time=1.031..1.055 rows=3 loops
 
=1)
 
 Output: c_bh, c_xzdm, c_jgid, c_ajbm
 
 Filter: (t_jcxxgl_tjaj.d_slrq >= '2018-03-18'::date)
 
 Rows Removed by Filter: 138
 
 Buffers: shared hit=8
 
 Planning time: 6.579 ms
 
 Execution time: 1.163 ms
 
(7 rows)

如上,d_slrq是有索引的,但是執(zhí)行計劃中并沒有走索引,為什么呢?我們繼續(xù)往下看。

--執(zhí)行計劃,關(guān)閉全表掃描

highgo=# set session enable_seqscan = off;
 
SET
 
highgo=# explain (analyze,verbose,costs,buffers,timing)select c_bh,c_xzdm,c_jgid,c_ajbm from t_jcxxgl_tjaj where d_slrq >='2018-03-18';
 
        QUERY PLAN        ------------------------------------------------------------------------------------------------------------
 
 Index Scan using idx_ttjaj_dslrq on db_jcxx.t_jcxxgl_tjaj (cost=0.14..13.90 rows=3 width=96) (actual time=0.012..0.026 rows=3 loops=1)
 
 Output: c_bh, c_xzdm, c_jgid, c_ajbm
 
 Index Cond: (t_jcxxgl_tjaj.d_slrq >= '2018-03-18'::date)
 
 Buffers: shared hit=4
 
 Planning time: 0.309 ms
 
 Execution time: 0.063 ms
 
(6 rows)

d_slrq上面有btree索引,但是查看執(zhí)行計劃并沒有走索引,這是為什么呢?

代價計算:

一個路徑的估算由三部分組成:啟動代價(startup cost),總代價(totalcost),執(zhí)行結(jié)果的排序方式(pathkeys)

代價估算公式:

總代價=啟動代價+I/O代價+CPU代價(cost=S+P+W*T)

P:執(zhí)行時要訪問的頁面數(shù),反應(yīng)磁盤的I/O次數(shù)

T:表示在執(zhí)行時所要訪問的元組數(shù),反映了cpu開銷

W:表示磁盤I/O代價和CPU開銷建的權(quán)重因子

統(tǒng)計信息:

統(tǒng)計信息的其中一部分是每個表和索引中項的總數(shù),以及每個表和索引占用的磁盤塊數(shù)。這些信息保存在pg_class表的reltuples和relpages列中。我們可以這樣查詢相關(guān)信息:

​--查看統(tǒng)計信息

highgo=# select relpages,reltuples from pg_class where relname ='t_jcxxgl_tjaj';
 
 relpages | reltuples ----------+-----------
 
 8 | 141
 
(1 row)

total_cost = 1(seq_page_cost)*8(磁盤總頁數(shù))+0.01(cpu_tuple_cost)*141(表的總記錄數(shù))+0.0025(cpu_operation_cost)*141(表的總記錄數(shù))=9.7625

可以看到走索引的cost=13.90比全表掃描cost=9.76要大。所以上面沒有關(guān)閉全表掃描的時候,根據(jù)成本代價,執(zhí)行計劃走的全表掃描。在表較小的情況下,全表掃描比索引掃描更有效, index scan 至少要發(fā)生兩次I/O,一次是讀取索引塊,一次是讀取數(shù)據(jù)塊。

2、一個SQL優(yōu)化實(shí)例

2.1慢SQL:

select c_ajbh, c_ah, c_cbfy, c_cbrxm, d_larq, d_jarq, n_dbjg, c_yqly from db_zxzhld.t_zhld_db dbxx join db_zxzhld.t_zhld_ajdbxx dbaj on dbxx.c_bh = dbaj.c_dbbh where dbxx.n_valid=1 and dbxx.n_state in (1,2,3) and dbxx.c_dbztbh='1003' and dbaj.c_zblx='1003' and dbaj.c_dbfy='0' and dbaj.c_gy = '2550' and c_ajbh in (select distinct c_ajbh from db_zxzhld.t_zhld_zbajxx where n_dbzt = 1 and c_zblx = '1003' and c_gy = '2550' ) order by d_larq asc, c_ajbh asc limit 15 offset 0;

慢sql耗時:7s

先過下這個sql是干什么的、首先dbxx和dbaj的一個join連接然后dbaj.c_ajbh要包含在zbaj表里面,做了個排序,取了15條記錄、大概就這樣。

Sql有個缺點(diǎn)就是我不知道查詢的字段是從那個表里面取的、建議加上表別名.字段。

查看該sql的表的數(shù)據(jù)量:

  t_zhld_db :1311
  t_zhld_ajdbxx :341296
 t_zhld_zbajxx :1027619 

執(zhí)行計劃:

 Limit (cost=36328.67..36328.68 rows=1 width=107) (actual time=88957.677..88957.729 rows=15 loops=1)
 
 -> Sort (cost=36328.67..36328.68 rows=1 width=107) (actual time=88957.653..88957.672 rows=15 loops=1)
 
  Sort Key: dbaj.d_larq, dbaj.c_ajbh
 
  Sort Method: top-N heapsort Memory: 27kB
 
  -> Nested Loop Semi Join (cost=17099.76..36328.66 rows=1 width=107) (actual time=277.794..88932.662 rows=8605 loops=1)
 
  Join Filter: ((dbaj.c_ajbh)::text = (t_zhld_zbajxx.c_ajbh)::text)
 
  Rows Removed by Join Filter: 37018710
 
  -> Nested Loop (cost=0.00..19200.59 rows=1 width=107) (actual time=199.141..601.845 rows=8605 loops=1)
 
   Join Filter: (dbxx.c_bh = dbaj.c_dbbh)
 
   Rows Removed by Join Filter: 111865
 
   -> Seq Scan on t_zhld_ajdbxx dbaj (cost=0.00..19117.70 rows=219 width=140) (actual time=198.871..266.182 rows=8605 loops=1)
 
    Filter: ((n_valid = 1) AND ((c_zblx)::text = '1003'::text) AND ((c_dbfy)::text = '0'::text) AND ((c_gy)::text = '2550'::text))
 
    Rows Removed by Filter: 332691
 
   -> Materialize (cost=0.00..66.48 rows=5 width=33) (actual time=0.001..0.017 rows=14 loops=8605)
 
    -> Seq Scan on t_zhld_db dbxx (cost=0.00..66.45 rows=5 width=33) (actual time=0.044..0.722 rows=14 loops=1)
 
     Filter: ((n_valid = 1) AND ((c_dbztbh)::text = '1003'::text) AND (n_state = ANY ('{1,2,3}'::integer[])))
 
     Rows Removed by Filter: 1297
 
  -> Materialize (cost=17099.76..17117.46 rows=708 width=32) (actual time=0.006..4.890 rows=4303 loops=8605)
 
   -> HashAggregate (cost=17099.76..17106.84 rows=708 width=32) (actual time=44.011..54.924 rows=8605 loops=1)
 
    Group Key: t_zhld_zbajxx.c_ajbh
 
    -> Bitmap Heap Scan on t_zhld_zbajxx (cost=163.36..17097.99 rows=708 width=32) (actual time=5.218..30.278 rows=8605 loops=1)
 
     Recheck Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text))
 
     Filter: ((c_gy)::text = '2550'::text)
 
     Rows Removed by Filter: 21849
 
     Heap Blocks: exact=960
 
     -> Bitmap Index Scan on i_tzhldzbajxx_zblx_dbzt (cost=0.00..163.19 rows=5876 width=0) (actual time=5.011..5.011 rows=30458 loops=1)
 
     Index Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text))
 
 Planning time: 1.258 ms
 
 Execution time: 88958.029 ms

執(zhí)行計劃解讀:

1:第27->21行,通過索引i_tzhldzbajxx_zblx_dbzt過濾表t_zhld_zbajxx的數(shù)據(jù),然后根據(jù)過濾條件(c_gy)::text = '2550'::text過濾最終返回8605條數(shù)據(jù)

2:第17->15行,根據(jù)條件過濾t_zhld_db表的數(shù)據(jù),最終返回了14條數(shù)據(jù)

3:第20->19行,對表t_zhld_zbajxx做group by的操作

4:第13->11行,全表掃描t_zhld_ajdbxx 最終返回了8605條數(shù)據(jù)

5:第08行,根據(jù)t_zhld_ajdbxx返回的8605條結(jié)果集作為驅(qū)動表和t_zhld_db的結(jié)果集(14條)做嵌套循環(huán),t_zhld_db的結(jié)果集被循環(huán)了8605次。然后過濾掉了其中的111865條記錄,那么最終將得到(8605*14-111865) = 8605

6:第07->05行,根據(jù)第08和18行返回的結(jié)果集最終做了Nested Loop Semi Join,第18行的4303條結(jié)果集被循環(huán)了8605次,(4303*8605-37018710)=8605

7: 第04->02行,對最終的8605條記錄進(jìn)行排序

8:第01行,limit最終獲取15條記錄

整個執(zhí)行計劃中耗時最長的地方在05行Nested Loop Semi Join,actual time=277.794..88932.662, 表db_zxzhld.t_zhld_db dbxx和db_zxzhld.t_zhld_ajdbxx均是全表掃描

2.2具體優(yōu)化步驟

查看索引頁并沒有索引,創(chuàng)建c_ajbh,c_dbbh等邏輯外鍵的索引

drop index if exists I_T_ZHLD_AJDBXX_AJBH;
 
create index I_T_ZHLD_AJDBXX_AJBH on T_ZHLD_AJDBXX (c_ajbh);
 
commit;
 
drop index if exists I_T_ZHLD_AJDBXX_DBBH;
 
create index I_T_ZHLD_AJDBXX_DBBH on T_ZHLD_AJDBXX (c_dbbh);
 
commit;

創(chuàng)建d_larq,c_ajbh的排序索引:

drop index if exists I_T_ZHLD_AJDBXX_m6;create index I_T_ZHLD_AJDBXX_m6 on T_ZHLD_AJDBXX (c_zblx,c_dbfy,c_gy,d_larq asc,c_ajbh asc);
 
commit;
 
drop index if exists I_T_ZHLD_ZBAJXX_h3 ;
 
create index I_T_ZHLD_ZBAJXX_h3 on db_zxzhld.t_zhld_zbajxx (n_dbzt,c_zblx,c_gy,c_gy);
 
commit;

創(chuàng)建索引后執(zhí)行計劃有了改變,原來的dbaj表和dbxx表先做nestedloop變成了zbaj和dbaj表先做了nestedloop join,總的cost也從36328.68降到了12802.87,

執(zhí)行計劃

Limit (cost=12802.87..12802.87 rows=1 width=107) (actual time=4263.598..4263.648 rows=15 loops=1)
 
 -> Sort (cost=12802.87..12802.87 rows=1 width=107) (actual time=4263.592..4263.609 rows=15 loops=1)
 
 Sort Key: dbaj.d_larq, dbaj.c_ajbh
 
 Sort Method: top-N heapsort Memory: 27kB
 
 -> Nested Loop (cost=2516.05..12802.86 rows=1 width=107) (actual time=74.240..4239.723 rows=8605 loops=1)
 
  Join Filter: (dbaj.c_dbbh = dbxx.c_bh)
 
  Rows Removed by Join Filter: 111865
 
  -> Nested Loop (cost=2516.05..12736.34 rows=1 width=140) (actual time=74.083..327.974 rows=8605 loops=1)
 
   -> HashAggregate (cost=2515.62..2522.76 rows=714 width=32) (actual time=74.025..90.185 rows=8605 loops=1)
 
    Group Key: ("ANY_subquery".c_ajbh)::text
 
    -> Subquery Scan on "ANY_subquery" (cost=2499.56..2513.84 rows=714 width=32) (actual time=28.782..59.823 rows=8605 loops=1)
 
    -> HashAggregate (cost=2499.56..2506.70 rows=714 width=32) (actual time=28.778..39.968 rows=8605 loops=1)
 
     Group Key: zbaj.c_ajbh
 
     -> Index Scan using i_t_zhld_zbajxx_h3 on t_zhld_zbajxx zbaj (cost=0.42..2497.77 rows=715 width=32) (actual time=0.062..15.104 rows=8605 loops=1)
 
      Index Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text) AND ((c_gy)::text = '2550'::text))
 
   -> Index Scan using i_t_zhld_ajdbxx_ajbh on t_zhld_ajdbxx dbaj (cost=0.42..14.29 rows=1 width=140) (actual time=0.015..0.021 rows=1 loops=8605)
 
    Index Cond: ((c_ajbh)::text = ("ANY_subquery".c_ajbh)::text)
 
    Filter: (((c_zblx)::text = '1003'::text) AND ((c_dbfy)::text = '0'::text) AND ((c_gy)::text = '2550'::text))
 
    Rows Removed by Filter: 1
 
  -> Seq Scan on t_zhld_db dbxx (cost=0.00..66.45 rows=5 width=33) (actual time=0.015..0.430 rows=14 loops=8605)
 
   Filter: ((n_valid = 1) AND ((c_dbztbh)::text = '1003'::text) AND (n_state = ANY ('{1,2,3}'::integer[])))
 
   Rows Removed by Filter: 1298
 
Planning time: 1.075 ms
 
Execution time: 4263.803 ms

執(zhí)行的時間還是要4s左右仍然不滿足需求,并且沒有使用上I_T_ZHLD_AJDBXX_m6這個索引。

2.3等價改寫SQL(1)

等價改寫:將排序條件加入db_zxzhld.t_zhld_ajdbxx讓其先排序,再和t_zhld_db表連接。

修改后sql:

Select dbaj.c_ajbh, dbaj.c_ah, dbaj.c_cbfy, dbaj.c_cbrxm, dbaj.d_larq, dbaj.d_jarq, dbaj.n_dbjg, dbaj.c_yqly from (select * from db_zxzhld.t_zhld_db where n_valid=1 and n_state in (1,2,3) and c_dbztbh='1003' )dbxx
 
 join (select * from db_zxzhld.t_zhld_ajdbxx where n_valid=1 and c_zblx='1003'
 
 and c_dbfy='0' and c_gy = '2550' and
 
c_ajbh in (select distinct c_ajbh from db_zxzhld.t_zhld_zbajxx where n_dbzt = 1 and c_zblx = '1003' and c_gy = '2550' ) order by d_larq asc, c_ajbh asc)dbajon dbxx.c_bh = dbaj.c_dbbh
 
 limit 15 offset 0

再次查看執(zhí)行計劃:

Limit (cost=3223.92..3231.97 rows=1 width=107) (actual time=127.291..127.536 rows=15 loops=1)
 
 -> Nested Loop (cost=3223.92..3231.97 rows=1 width=107) (actual time=127.285..127.496 rows=15 loops=1)
 
 -> Sort (cost=3223.64..3223.65 rows=1 width=140) (actual time=127.210..127.225 rows=15 loops=1)
 
  Sort Key: t_zhld_ajdbxx.d_larq, t_zhld_ajdbxx.c_ajbh
 
  Sort Method: quicksort Memory: 2618kB
 
  -> Hash Semi Join (cost=2523.19..3223.63 rows=1 width=140) (actual time=55.913..107.265 rows=8605 loops=1)
 
   Hash Cond: ((t_zhld_ajdbxx.c_ajbh)::text = (t_zhld_zbajxx.c_ajbh)::text)
 
   -> Index Scan using i_t_zhld_ajdbxx_m6 on t_zhld_ajdbxx (cost=0.42..700.28 rows=219 width=140) (actual time=0.065..22.005 rows=8605 loops=1)
 
    Index Cond: (((c_zblx)::text = '1003'::text) AND ((c_dbfy)::text = '0'::text) AND ((c_gy)::text = '2550'::text))
 
   -> Hash (cost=2513.84..2513.84 rows=714 width=32) (actual time=55.802..55.802 rows=8605 loops=1)
 
    Buckets: 16384 (originally 1024) Batches: 1 (originally 1) Memory Usage: 675kB
 
    -> HashAggregate (cost=2499.56..2506.70 rows=714 width=32) (actual time=30.530..43.275 rows=8605 loops=1)
 
    Group Key: t_zhld_zbajxx.c_ajbh
 
    -> Index Scan using i_t_zhld_zbajxx_h3 on t_zhld_zbajxx (cost=0.42..2497.77 rows=715 width=32) (actual time=0.043..15.552 rows=8605 loops=1)
 
     Index Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text) AND ((c_gy)::text = '2550'::text))
 
 -> Index Scan using t_zhld_db_pkey on t_zhld_db (cost=0.28..8.30 rows=1 width=33) (actual time=0.009..0.011 rows=1 loops=15)
 
  Index Cond: (c_bh = t_zhld_ajdbxx.c_dbbh)
 
  Filter: (((c_dbztbh)::text = '1003'::text) AND (n_state = ANY ('{1,2,3}'::integer[])))
 
Planning time: 1.154 ms
 
Execution time: 127.734 ms

這一次可以看出,ajdbxx和zbajxx表做了hash semi join 消除了nestedloop,cost降到了3231.97。并且使用上了i_t_zhld_ajdbxx_m6子查詢中in的結(jié)果集有一萬多條數(shù)據(jù)。

繼續(xù)嘗試使用exists等價改寫in,看能否有更好的結(jié)果

2.4等價改寫SQL(2)

等價改寫:將in替換為exists:

select c_ajbh, c_ah, c_cbfy, c_cbrxm, d_larq, d_jarq, n_dbjg, c_yqlyfrom (select c_bh from db_zxzhld.t_zhld_db where n_state in (1,2,3) and c_dbztbh='1003' )dbxx
 join (select c_ajbh, c_ah, c_cbfy, c_cbrxm, d_larq, d_jarq, n_dbjg, c_yqly,c_dbbh from db_zxzhld.t_zhld_ajdbxx ajdbxxwhere c_zblx='1003'
 and c_dbfy='0' and c_gy = '2550' and 
exists (select distinct c_ajbh from db_zxzhld.t_zhld_zbajxx zbajxx where ajdbxx.c_ajbh = zbajxx.c_ajbh and n_dbzt = 1 and c_zblx = '1003' and c_gy = '2550' ) order by d_larq asc, c_ajbh asc)dbajon dbxx.c_bh = dbaj.c_dbbh 
 limit 15 offset 0

再次查看執(zhí)行計劃:

Limit (cost=1.12..2547.17 rows=1 width=107) (actual time=0.140..0.727 rows=15 loops=1)
 
 -> Nested Loop (cost=1.12..2547.17 rows=1 width=107) (actual time=0.136..0.689 rows=15 loops=1)
 
 -> Nested Loop Semi Join (cost=0.85..2538.84 rows=1 width=140) (actual time=0.115..0.493 rows=15 loops=1)
 
  -> Index Scan using i_t_zhld_ajdbxx_m6 on t_zhld_ajdbxx t2 (cost=0.42..700.28 rows=219 width=140) (actual time=0.076..0.127 rows=15 loops=1)
 
   Index Cond: (((c_zblx)::text = '1003'::text) AND ((c_dbfy)::text = '0'::text) AND ((c_gy)::text = '2550'::text))
 
  -> Index Scan using i_t_zhld_zbajxx_c_ajbh on t_zhld_zbajxx t3 (cost=0.42..8.40 rows=1 width=32) (actual time=0.019..0.019 rows=1 loops=15)
 
   Index Cond: ((c_ajbh)::text = (t2.c_ajbh)::text)
 
   Filter: (((c_zblx)::text = '1003'::text) AND ((c_gy)::text = '2550'::text) AND (n_dbzt = 1))
 
 -> Index Scan using t_zhld_db_pkey on t_zhld_db (cost=0.28..8.30 rows=1 width=33) (actual time=0.007..0.008 rows=1 loops=15)
 
  Index Cond: (c_bh = t2.c_dbbh)
 
  Filter: (((c_dbztbh)::text = '1003'::text) AND (n_state = ANY ('{1,2,3}'::integer[])))
 
Planning time: 1.268 ms
 
Execution time: 0.859 ms

可以看出使用exist效果更好,最終cost 2547.17

(1).少了t_zhld_zbajxx表的group by操作:Sort Key: t_zhld_ajdbxx.d_larq, t_zhld_ajdbxx.c_ajbh。(這一步是因?yàn)槭褂昧怂饕械呐判?

(2).少了分組的操作:Group Key: t_zhld_zbajxx.c_ajbh。

第(2)為什么這個查詢消除了t_zhld_zbajxx表的group by操作呢?

原因是exists替換了distinct的功能,一旦滿足條件則立刻返回。所以使用exists的時候子查詢可以直接去掉distinct。

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL之INDEX 索引詳解
  • PostgreSql 重建索引的操作
  • PostgreSQL模糊匹配走索引的操作
  • postgresql查看表和索引的情況,判斷是否膨脹的操作
  • PostgreSQL的B-tree索引用法詳解
  • postgresql 索引之 hash的使用詳解

標(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)民參考!
  • 推薦文章
    欧美日韩综合| 菠萝蜜影院一区二区免费| 日韩不卡一二区| 欧美男人天堂网| 色天使综合视频| 韩剧1988在线观看免费完整版| 日日橹狠狠爱欧美超碰| 国产亚洲精品aa午夜观看| 99tv成人| 日本综合一区二区三区| 蜜桃视频一区二区三区| 国产麻豆综合视频在线观看| 污片免费在线观看| 熟妇人妻av无码一区二区三区| 亚洲精品免费一区亚洲精品免费精品一区| 国产亚洲综合性久久久影院| 日日狠狠久久偷偷综合色| 免费黄色在线视频| 黄色亚洲大片免费在线观看| 亚洲精品一区视频| 国产精品一区二区入口九绯色| 欧美熟妇一区二区| 亚洲一卡二卡在线| 国产网站在线| 亚洲女人毛茸茸高潮| 成人亚洲一区二区三区| 欧美精品色婷婷五月综合| 51妺嘿嘿午夜福利| av中文字幕在线观看| 亚洲爆乳无码一区二区三区| 色婷婷av一区二区三区之e本道| ed2k情侣啪啪91av| 在线看三级网站视频| 伊人一区二区三区| 国产传媒日韩欧美成人| 亚洲视频在线视频| 亚洲在线色站| 国产精品毛片久久久久久| 美女国产精品| 18一19gay欧美视频网站| 日本美女高清在线观看免费| 日韩精品一区二区三区中文精品| 五月婷婷一区二区| 国产成人在线免费视频| 日本美女视频一区二区| 久久久久久网| 超碰在线97国产| 一区二区三区在线免费视频| 一本加勒比波多野结衣| 欧美午夜精品一区二区三区电影| 日本簧片在线观看| 欧美午夜一区二区三区| 巨大黑人video| 色94色欧美sute亚洲线路一ni| 精品国产精品久久一区免费式| 另类成人小视频在线| 在线观看免费高清视频| 天堂久久午夜av| 国产精品综合在线| 免费人成a大片在线观看动漫| 忘忧草精品久久久久久久高清| 美女在线观看视频一区二区| 日韩欧美不卡在线| 中文字幕日本在线观看| 好吊日精品视频| 精品国产乱码一区二区| 亚洲狼人在线| 亚洲欧美国产视频| 97人人香蕉| 日本网站在线免费观看| 国产成人av影院| 美女网站免费观看视频| 一色桃子在线| 久久五月天色综合| 国产成人小视频| 亚洲熟女综合色一区二区三区| 亚洲色大成网站www久久九九| 波多野结衣在线播放一区| 亚洲精品国产无天堂网2021| 日韩伦理一区二区三区av在线| 国产盗摄一区二区三区在线| 欧美日韩在线免费播放| www.久久久久久久久久| 99se婷婷在线视频观看| 日韩精品久久久久久| 色老汉av一区二区三区| 久久精品国产一区二区电影| 阳光姐妹淘韩国版| 天使と恶魔の榨精在线播放| 欧美成人精精品一区二区频| 精品人妻伦一区二区三区久久| 国产网站欧美日韩免费精品在线观看| 欧美aaaaaaaaaaaa| 国产高清精品一区二区| av在线观看地址| 午夜精品福利影院| 国产精品美女久久福利网站| 国产毛片毛片毛片毛片毛片| 麻豆changesxxx国产| 日本美女久久久| 日韩专区在线视频| 91精品啪在线观看国产| 91av资源在线| av一线二线| 欧美久久久久久久久久久| 女女百合国产免费网站| 亚洲国产精品久久久久婷婷884| 色先锋影音岛国av资源| 欧美蜜桃一区二区三区| 免费人成黄页网站在线一区二区| 五月天电影免费在线观看一区| 欧洲美一区二区三区亚洲| 欧美乱妇高清无乱码| 97se亚洲国产综合自在线| 国产精品一香蕉国产线看观看| 一区二区免费av| 亚洲人成电影| 欧美日韩dvd在线观看| 中文日韩电影网站| 99热在线网站| 国产日本在线| 久久亚洲av午夜福利精品一区| 欧美xxxx做受欧美.88| 亚洲国产精品高清久久久| 视色,视色影院,视色影库,视色网| 999久久久国产999久久久| 国产欧美一区二区精品久久久| 亚洲午夜私人影院| 久久久久一区二区三区四区| 爱情岛论坛亚洲入口| 亚洲成人免费在线| 午夜在线观看91| 亚洲成人一区| 偷拍欧美精品| 五月天亚洲综合小说网| 美女又黄又免费| 91精品国产综合久久久久久丝袜| 蜜桃传媒一区二区三区| 9色在线视频网站| 天天操天天射天天爽| 红桃av永久久久| 777国产偷窥盗摄精品视频| 韩国v欧美v亚洲v日本v| 成人久久18免费网站麻豆| 日韩欧美综合在线视频| 国产污污视频在线观看| 欧美视频观看一区| 成人免费在线观看av| 日韩精彩视频在线观看| 国产在线免费观看| 夜先锋资源站| 精品国产乱码久久久久久1区二区| 欧美国产激情二区三区| 国产91丝袜在线播放| 国产youjizz在线| 中文字幕欧美三区| xxxxxhd亚洲人hd| 国产三级三级在线观看| 9999热视频在线观看| 亚洲婷婷免费| www免费网站在线观看| 亚洲a区在线视频| 香蕉久久夜色精品国产使用方法| 精品久久影院| 久久综合色鬼综合色| 中文字幕av日韩精品| www男人天堂| 无套白嫩进入乌克兰美女| 国产成人亚洲精品自产在线| 销魂美女一区二区三区视频在线| 91影院在线免费观看| 精品少妇一区二区30p| av黄色免费网站| 精品少妇一区二区三区免费观| 日日噜噜夜夜狠狠视频| 性色av一区二区三区在线观看| caopon在线免费视频| 无码人妻丰满熟妇区五十路百度| 国产精品人人人人| 欧美日韩国产一级片| 亚洲天堂手机在线| 九七午夜视频| 亚洲私人影院| gogogo高清在线观看免费完整版| 国产成人亚洲综合a∨婷婷| 亚洲精品成人久久久998| 亚洲一区一卡| 久久亚洲精精品中文字幕早川悠里| 色呦哟—国产精品| 成人免费高清在线观看| 日韩综合一区二区三区| 亚洲已满18点击进入久久| 麻豆网站视频在线观看| 又粗又黑又大的吊av| 亚洲免费在线播放视频| 成熟丰满熟妇高潮xxxxx视频| 女同性恋一区二区三区| 丁香花高清视频完整版在线观看| 亚洲专区区免费| 日本特黄特色aaa大片免费| 日韩jizzz| 今天免费高清在线观看国语| 从欧美一区二区三区| 国产99久久久国产精品潘金网站| 亚洲欧洲精品一区二区| 日韩一区二区三区三四区视频在线观看| 精品熟女一区二区三区| 欧美日韩va| 欧美日韩国产一二| 日韩一区欧美二区| 久九九久频精品短视频| 国产suv精品一区二区三区88区| 久久精品国产亚洲夜色av网站| 伊人色综合久久久天天蜜桃| 国产成人调教视频在线观看| 国产日本欧美一区| 国产精品成人久久| 成人av资源在线观看| 亚洲视频狠狠干| 97精品一区| 蜜桃av一区二区| heyzo中文字幕在线| 国产二区精品| 欧美日韩免费看片| 视频一区二区免费| 亚洲天堂av在线免费| 国产精品二区在线观看| 欧美日韩在线二区| 国产三级av在线| 青青草视频在线视频| 日韩高清在线一区二区| 婷婷综合久久一区二区三区| 成人mm视频在线观看| 我和岳m愉情xxxⅹ视频| 欧美日韩精品一区二区| 亚洲精品一区二三区不卡| 黄色片视频在线播放| 久久久777精品电影网影网| 日韩欧美在线综合| 国产第一页在线| 国内高清免费在线视频| 欧美三级一区| 亚洲专区第一页| 国产精品视频一区二区三区| 成人国产激情| 久久久精品2019中文字幕神马| 久久久国产一区二区三区四区小说| 亚洲女色av| 99久久精品国产观看| 亚洲丝袜自拍清纯另类| www日韩精品| 91麻豆精品国产无毒不卡在线观看| 一区二区三区回区在观看免费视频| 亚洲国产婷婷香蕉久久久久久| 国产精品美女久久久久久免费| 色又黄又爽网站www久久| 欧美一级一区二区三区| 亚洲男子天堂网| 精品国产一区二区三区久久久狼| 国产精品视频一区二区三区| 亚洲图片欧美视频| 亚洲国产一区二区精品专区| 国产精品免费观看久久| 亚洲精品鲁一鲁一区二区三区| 在线观看日韩精品| 国产精品草莓在线免费观看| 91专区在线观看| 国产精品伦理一区二区三区| 日韩欧美精品一区二区综合视频| 成人资源av| 欧美亚洲另类久久综合| 婷婷久久综合九色综合绿巨人| 国产成人免费视| 精品一区二区三区国产| 美女视频免费一区| 国产精品日韩欧美一区二区三区| 日韩动漫一区| 日本丶国产丶欧美色综合| 一本色道久久综合亚洲精品小说| 人人草人人干| 久久精品国产一区二区三| 欧美寡妇偷汉性猛交| 高清无码视频直接看| 久久久久久久片| 欧美精品videossex变态| eeuss影院网站免费观看| 不卡的av在线播放| 色多多国产成人永久免费网站| 亚洲色图插插| 久久99久久99精品中文字幕| 要久久爱电视剧全集完整观看| 欧美在线观看你懂的| 亚洲精品在线一区二区| 欧美乱大交xxxxx另类| 中文字幕有码热在线视频| 日韩av片永久免费网站| 欧美日韩亚洲自拍| 黄页网站在线观看视频| 伊人久久久大香线蕉综合直播| 国产伦精品一区二区三区视频免费| 国产精品美女久久久久| 日韩欧美国产大片| xxxxxx黄色| 丁香亚洲综合激情啪啪综合| 9999国产精品| 天堂av中文在线资源库| 狠狠入ady亚洲精品| 欧美精品免费在线| 亚洲综合一区二区三区| 精品免费99久久| 88xx成人永久免费观看| 日韩中文在线电影| 亚洲1区2区3区视频| 99在线观看视频免费| 国产精品亚洲美女av网站| 伊人一区二区三区| 国产精品二区在线| 91免费精品国偷自产在线在线| 一级毛片国产| 国产美女做爰免费视频软件| 狠狠色噜噜狠狠狠狠色吗综合| 国产亚洲成av人片在线观看| 久久免费黄色| 亚洲精品一区二区在线看| 国产精品自产拍在线网站| 电影午夜精品一区二区三区| 91天堂素人约啪| 欧美一区中文字幕|