欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > Postgresql的select優化操作(快了200倍)

Postgresql的select優化操作(快了200倍)

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

對于龐大的數據,檢索sql的編寫要格外小心,有很多平時不注意的sql可能就會變成瓶頸。

比如, 我們有個系統, 其中t96_pd_log表,記錄數8000w多,在開發階段乃至用了那么多年都沒問題, 最近卻發生頻繁死鎖的問題, 查數據庫后臺發現問題出在一個select語句上, 它耗時高達2.4-2.7s,這對于一個需要高并發的系統來說當然是致命的。

數據表t96_pd_log有兩條index, 一條的字段組成是f96_mgtbarcd,另一條的字段組成是f96_result_type, 檢索sql是這樣寫的:

select recseq,f96_create_dt,f96_op from t96_pd_log where f96_mgtbarcd='113D1907032385' 
and f96_station='AS01-L113' and f96_result_type='TFT' 
and f96_qty=1 order by f96_create_dt desc limit 1 

意在找出AS01-L113站位最近一條有效的記錄,而這條sql有足夠的index支持,但耗時高達2.7s。

F7查一下,居然包含f96_result_type的這支索引也參與運算, 這就出事了, 因為f96_result_type有相同值的記錄極其多,從圖3也可以看出, 這也是主要耗費時間的環節。

通過數據分析, f96_mgtbarcd值相同的記錄數很少, 所以我們可以將順序改一下,先用f96_mgtbarcd作為過濾器生成一個子集后, 再從這個子集里面做f96_result_type等過濾, 跑了一下,13ms, 足足快了這樣就快200多倍,如下:

with a as (
select recseq,f96_create_dt,f96_op,f96_station,f96_result_type,f96_qty from t96_pd_log where f96_mgtbarcd='113D1907032385'
) 
select recseq,f96_create_dt,f96_op from a where f96_station='AS01-L113' and f96_result_type='TP' and f96_qty=1 order by f96_create_dt desc limit 1

ps:我用的工具是 pgAdmin自帶的,F7, Shift-F7

補充:PostgreSql查詢優化之根據執行計劃優化SQL

1、執行計劃路徑選擇

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

1.1代價評估

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

1.2用于估算代價的參數postgresql.conf

# - Planner Cost Constants - 
#seq_page_cost = 1.0  # measured on an arbitrary scale 順序磁盤掃描時單個頁面的開銷 
#random_page_cost = 4.0  # same scale as above 隨機磁盤訪問時單頁面的讀取開銷 
#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處理每個運算符或者函數調用的開銷 
#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 再一次索引掃描中可用的文件系統內核緩沖區有效大小

也可以使用 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)

首先更新統計信息vacuum analyze t_jcxxgl_tjaj,許多時候可能因為統計信息的不準確導致了不正常的執行計劃--執行計劃。

--執行計劃,全表掃描 
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是有索引的,但是執行計劃中并沒有走索引,為什么呢?我們繼續往下看。

--執行計劃,關閉全表掃描 
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索引,但是查看執行計劃并沒有走索引,這是為什么呢?

代價計算:

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

代價估算公式:

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

P:執行時要訪問的頁面數,反應磁盤的I/O次數

T:表示在執行時所要訪問的元組數,反映了cpu開銷

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

統計信息:

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

--查看統計信息
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(磁盤總頁數)+0.01(cpu_tuple_cost)*141(表的總記錄數)+0.0025(cpu_operation_cost)*141(表的總記錄數)=9.7625

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

2、一個SQL優化實例

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有個缺點就是我不知道查詢的字段是從那個表里面取的、建議加上表別名.字段。

查看該sql的表的數據量:

t_zhld_db :1311

t_zhld_ajdbxx :341296

t_zhld_zbajxx :1027619

執行計劃:

01 Limit (cost=36328.67..36328.68 rows=1 width=107) (actual time=88957.677..88957.729 rows=15 loops=1)
 
02 -> Sort (cost=36328.67..36328.68 rows=1 width=107) (actual time=88957.653..88957.672 rows=15 loops=1)
 
03  Sort Key: dbaj.d_larq, dbaj.c_ajbh
 
04  Sort Method: top-N heapsort Memory: 27kB
 
05  -> Nested Loop Semi Join (cost=17099.76..36328.66 rows=1 width=107) (actual time=277.794..88932.662 rows=8605 loops=1)
 
06  Join Filter: ((dbaj.c_ajbh)::text = (t_zhld_zbajxx.c_ajbh)::text)
 
07  Rows Removed by Join Filter: 37018710
 
08  -> Nested Loop (cost=0.00..19200.59 rows=1 width=107) (actual time=199.141..601.845 rows=8605 loops=1)
 
09   Join Filter: (dbxx.c_bh = dbaj.c_dbbh)
 
10   Rows Removed by Join Filter: 111865
 
11   -> 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)
 
12    Filter: ((n_valid = 1) AND ((c_zblx)::text = '1003'::text) AND ((c_dbfy)::text = '0'::text) AND ((c_gy)::text = '2550'::text))
 
13    Rows Removed by Filter: 332691
 
14   -> Materialize (cost=0.00..66.48 rows=5 width=33) (actual time=0.001..0.017 rows=14 loops=8605)
 
15    -> 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)
 
16     Filter: ((n_valid = 1) AND ((c_dbztbh)::text = '1003'::text) AND (n_state = ANY ('{1,2,3}'::integer[])))
 
17     Rows Removed by Filter: 1297
 
18  -> Materialize (cost=17099.76..17117.46 rows=708 width=32) (actual time=0.006..4.890 rows=4303 loops=8605)
 
19   -> HashAggregate (cost=17099.76..17106.84 rows=708 width=32) (actual time=44.011..54.924 rows=8605 loops=1)
 
20    Group Key: t_zhld_zbajxx.c_ajbh
 
21    -> 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)
 
22     Recheck Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text))
 
23     Filter: ((c_gy)::text = '2550'::text)
 
24     Rows Removed by Filter: 21849
 
25     Heap Blocks: exact=960
 
26     -> 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)
 
27     Index Cond: ((n_dbzt = 1) AND ((c_zblx)::text = '1003'::text))
 
28 Planning time: 1.258 ms 
29 Execution time: 88958.029 ms

執行計劃解讀:

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

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

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

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

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

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

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

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

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

2.2具體優化步驟

查看索引頁并沒有索引,創建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;

創建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;

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

執行計劃

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

執行的時間還是要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

再次查看執行計劃:

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的結果集有一萬多條數據。

繼續嘗試使用exists等價改寫in,看能否有更好的結果

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

再次查看執行計劃:

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。(這一步是因為使用了索引中的排序)

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

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

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

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

您可能感興趣的文章:
  • postgreSql分組統計數據的實現代碼
  • postgresql 計算兩點距離的2種方法小結
  • postgresql 計算距離的實例(單位直接生成米)
  • postgresql 除法保留小數位的實例
  • PostgreSQL 性能優化之服務器參數配置操作
  • Postgresql 動態統計某一列的某一值出現的次數實例

標簽:昭通 辛集 濮陽 海西 寶雞 榆林 溫州 杭州

巨人網絡通訊聲明:本文標題《Postgresql的select優化操作(快了200倍)》,本文關鍵詞  Postgresql,的,select,優化,操作,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Postgresql的select優化操作(快了200倍)》相關的同類信息!
  • 本頁收集關于Postgresql的select優化操作(快了200倍)的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产xxxxxxxxx| 精品久久久久av影院| 中文字幕日韩av资源站| 国内精品免费**视频| 久久亚洲AV成人无码国产野外| 欧美精品少妇一区二区三区| 亚洲另类春色校园小说| 成人午夜电影久久影院| 影音先锋男人资源在线观看| 久久人人爽爽爽人久久久| 久久国产精品免费| 中文字幕成人动漫| 久久综合九色综合97婷婷| 久久精品国产99| 国产真人做爰视频免费| 久久久午夜精品| 国精产品一区一区三区mba视频| a天堂中文字幕| 26uuu国产在线精品一区二区| 麻豆国产精品官网| 中文字幕免费高清| 久久久不卡网国产精品一区| 国产精品一级二级三级| xxxx日本少妇| 一区二区三区在线播放| 影音先锋资源av| 欧美丝袜丝交足nylons图片| 亚洲一区二区3| 亚洲成在人线免费| 成人国产精品免费观看动漫| 国产精品九九九九九九| 亚洲激情图片一区| 91视频在线免费| 精品国产精品网麻豆系列| 国产在线不卡视频| www.超碰在线观看| 一区二区欧美国产| av无码av天天av天天爽| 久久免费精品国产久精品久久久久| 国产精品亚洲а∨天堂免在线| 91porn在线视频| 亚洲国产日韩a在线播放| 最近中文字幕无免费| 久久婷婷色综合| 成人av第一页| 91.com视频| 国产一区二区中文字幕| 色哟哟欧美精品| 天堂va蜜桃一区二区三区 | 日韩片在线观看| 2欧美一区二区三区在线观看视频| 国产成人在线看| 欧美制服丝袜第一页| 奇米影视一区二区三区小说| 999久久久国产| 亚洲自拍偷拍欧美| 亚洲精品色午夜无码专区日韩| 国产精品乱码一区二区三区软件| 国产chinesehd精品露脸| 精品日韩在线一区| 成人97人人超碰人人99| 欧美一卡2卡三卡4卡5免费| 国产精品白丝av| 欧美日韩免费在线视频| 黄色小说综合网站| 欧美亚洲动漫精品| 激情欧美一区二区三区在线观看| 色综合久久88色综合天天免费| 亚洲18色成人| 26uuu成人网| 日韩福利电影在线观看| 538精品在线视频| 日韩和欧美的一区| 精品欧美一区二区久久久久| 男女激情视频一区| 91官网在线免费观看| 精品一区二区三区欧美| 欧美色老头old∨ideo| 国产一区二区精品久久99| 欧美日韩国产123区| 国产一区二区精品久久91| 欧美伦理电影网| 夫妻av一区二区| 日韩美女视频在线| 91香蕉视频污| 日本一区二区三区dvd视频在线| 免费看毛片的网站| 亚洲女人的天堂| 超碰人人人人人人人| 日韩精彩视频在线观看| 91福利精品视频| 国产高清亚洲一区| 精品国产免费人成电影在线观看四季| 国产黄色一区二区三区| 欧美色网一区二区| 国产福利一区二区三区在线视频| 欧美一级在线视频| 苍井空张开腿实干12次| 最近日韩中文字幕| 性色国产成人久久久精品| 美女脱光内衣内裤视频久久影院| 欧美日韩精品电影| 99精品欧美一区二区蜜桃免费| 国产亚洲1区2区3区| brazzers精品成人一区| 亚洲成av人影院在线观看网| 91国偷自产一区二区三区成为亚洲经典 | 蜜桃av免费在线观看| 日本色综合中文字幕| 欧美日韩激情一区| 制服下的诱惑暮生| 亚洲三级在线看| www.xxxx日本| 国产福利一区二区三区视频在线| 久久日一线二线三线suv| 高潮毛片无遮挡| 日韩不卡一区二区三区| 欧美精品亚洲二区| 成人区人妻精品一区二| 亚洲影院理伦片| 欧洲中文字幕精品| 91原创在线视频| 亚洲色图丝袜美腿| 2021亚洲天堂| 成人app软件下载大全免费| 国产精品成人一区二区三区夜夜夜 | 国产精品密蕾丝袜| 美女视频网站久久| 精品少妇一区二区三区日产乱码| 无码精品一区二区三区在线播放| 天天影视网天天综合色在线播放| 91麻豆精品国产91久久久久久久久 | 在线一区二区视频| 99久久99久久精品国产片果冻 | 精品亚洲aⅴ无码一区二区三区| 美女视频黄久久| 精品国产第一区二区三区观看体验| 亚洲狠狠婷婷综合久久久久图片| 日精品一区二区三区| 日韩一区二区视频在线观看| 色呦呦一区二区| 老司机精品视频在线| 欧美精品一区二区三区蜜臀| 成人激情五月天| 国产成人在线视频网站| 国产精品国产a| 色天天综合久久久久综合片| 91麻豆6部合集magnet| 亚洲国产精品久久久男人的天堂| 欧美精品久久一区二区三区| 国产成人无码一区二区在线观看| 麻豆一区二区在线| 国产蜜臀av在线一区二区三区| 中文字幕亚洲欧美日韩| 91女厕偷拍女厕偷拍高清| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美在线观看一区| 国产综合内射日韩久| 免费三级欧美电影| 国产欧美精品一区| 色偷偷久久一区二区三区| 亚洲最大视频网| 麻豆精品新av中文字幕| 日本一区二区三区免费乱视频| 日本精品免费观看高清观看| 中文字幕在线视频播放| 久久99国产精品麻豆| 国产精品久久午夜夜伦鲁鲁| 欧美性感一类影片在线播放| 内射中出日韩无国产剧情| 国产麻豆视频精品| 亚洲激情中文1区| 日韩美一区二区三区| 极品久久久久久| 国产午夜在线一区二区三区| 麻豆91免费看| 中文字幕在线一区二区三区| 欧美久久高跟鞋激| 男女男精品视频网站| 99久久精品免费看国产免费软件| 天堂蜜桃91精品| 国产精品久久久久天堂| 337p亚洲精品色噜噜噜| 久久精品国产亚洲AV成人婷婷| 91免费版在线| 精品在线免费视频| 亚洲免费观看在线观看| 欧美成人精品福利| 色婷婷国产精品| 国产aⅴ激情无码久久久无码| 97se亚洲国产综合自在线观| 秋霞成人午夜伦在线观看| 中文字幕一区在线| 欧美电影免费观看高清完整版| 午夜69成人做爰视频| 熟女少妇一区二区三区| 91在线国内视频| 久久99久国产精品黄毛片色诱| 亚洲精品va在线观看| 日本一区二区综合亚洲|