午夜视频免费看_日韩三级电影网站_国产精品久久一级_亚洲一级在线播放_人妻体内射精一区二区三区_91夜夜揉人人捏人人添红杏_91福利在线导航_国产又粗又猛又黄又爽无遮挡_欧美日韩一区在线播放_中文字幕一区二区三区四区不卡 _日日夜夜精品视频免费观看_欧美韩日一区二区三区

主頁 > 知識庫 > postgresql關于like%xxx%的優化操作

postgresql關于like%xxx%的優化操作

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

任何一個關系型數據庫關于模糊匹配(like)的優化都是一件痛苦的事,相對而言,諸如like 'abc%'之類的還好一點,可以通過創建索引來優化,但對于like 'c%'之類的,真的就沒有辦法了。

這里介紹一種postgresql關于like 'c%'的優化方法,是基于全文檢索的特性來實現的。

測試數據準備(環境centos6.5 + postgresql 9.6.1)。

postgres=# create table ts(id int,name text);
CREATE TABLE
postgres=# \d ts
Table "public.ts"
Column | Type  | Modifiers
--------+---------+-----------
id   | integer |
name  | text  |
postgres=# insert into ts select n,n||'_pjy' from generate_series(1,2000) n;
INSERT 0 2000
postgres=# insert into ts select n,n||'_mdh' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_lmm' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_syf' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_wbd' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_hhh' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_sjw' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_jjs' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_ymd' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_biu' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# insert into ts select n,n||'_dfl' from generate_series(1,2000000) n;
INSERT 0 2000000
postgres=# select count(*) from ts;
 count 
----------
 20002000
(1 row)

開始測試:

postgres=# explain analyze select * from ts where name like '%pjy%';
                        QUERY PLAN                        
-----------------------------------------------------------------------------------------------------------
 Seq Scan on ts (cost=0.00..358144.05 rows=2000 width=15) (actual time=0.006..1877.087 rows=2000 loops=1)
  Filter: (name ~~ '%pjy%'::text)
  Rows Removed by Filter: 20000000
 Planning time: 0.031 ms
 Execution time: 1877.178 ms
(5 rows)

關鍵一步:

postgres=# create index idx_name on ts using gin (to_tsvector('english',name));
CREATE INDEX
postgres=# vacuum analyze ts;
VACUUM
postgres=# \d ts
   Table "public.ts"
 Column | Type  | Modifiers
--------+---------+-----------
 id   | integer |
 name  | text  |
Indexes:
  "idx_name" gin (to_tsvector('english'::regconfig, name))
postgres=# explain analyze select * from ts where to_tsvector('english',name) @@ to_tsquery('pjy');
                           QUERY PLAN                           
---------------------------------------------------------------------------------------------------------------------
 Bitmap Heap Scan on ts (cost=39.75..8187.70 rows=2000 width=15) (actual time=0.016..0.016 rows=0 loops=1)
  Recheck Cond: (to_tsvector('english'::regconfig, name) @@ to_tsquery('pjy'::text))
  -> Bitmap Index Scan on idx_name (cost=0.00..39.25 rows=2000 width=0) (actual time=0.016..0.016 rows=0 loops=1)
     Index Cond: (to_tsvector('english'::regconfig, name) @@ to_tsquery('pjy'::text))
 Planning time: 0.094 ms
 Execution time: 0.036 ms
(6 rows)

大家可以看到,執行時間從2秒下降到了0.04毫秒!!!

關于pg的全文檢索,tsvector和tsquery,這里就不詳細介紹了,大家可以自己查閱手冊。

補充:postgresql子查詢優化(提升子查詢)

問題背景

在開發項目過程中,客戶要求使用gbase8s數據庫(基于informix),簡單的分頁頁面響應很慢。排查發現分頁sql是先查詢出數據在外面套一層后再取多少條,如果去掉嵌套的一層,直接獲取則很快。日常使用中postgresql并沒有這樣的操作也很快,這是為什么呢?

說明

在數據庫實現早期,查詢優化器對子查詢一般采用嵌套執行的方式,即父查詢中的每一行,都要執行一次子查詢,這樣子查詢會執行很多次,效率非常低。

本篇主要講postgresql針對子查詢的優化。

項目中使用子查詢的地方非常多,如何寫出高效的sql,掌握子查詢的優化是非常有必要的。

執行計劃對比(gbase8s vs postgresql):

gbase8s慢sql執行計劃:

--gbase8s執行計劃

SET EXPLAIN ON ; 
SET EXPLAIN FILE TO '/home/gbasedbt/sqexplain.out' ;
select skip 0 first 15 * from ( select * from T_SZGL_JDRY order by T_SZGL_JDRY.updatetime desc ) Estimated Cost: 3207 Estimated # of Rows Returned: 6172 ​ 1) gbasedbt.t_szgl_jdry: INDEX PATH  (1) Index Name: gbasedbt.i_t_szgl_jdry_updatetime    Index Keys: updatetime (Reverse) (Serial, fragments: ALL) QUERY: (OPTIMIZATION TIMESTAMP: 12-21-2017 03:20:43) ------ select skip 0 first 15 * from ( select * from T_SZGL_JDRY order by T_SZGL_JDRY.updatetime desc ) Estimated Cost: 232 Estimated # of Rows Returned: 6172 1) (Temp Table For Collection Subquery): SEQUENTIAL SCAN Query statistics: ----------------- The final cost of the plan is reduced because of the FIRST n specification in the query. ​ Table map : ---------------------------- Internal name   Table name ---------------------------- t1        t_szgl_jdry t2        (Temp Table For Collection Subquery) type   table rows_prod est_rows rows_scan time    est_cost ------------------------------------------------------------------- scan   t1   6173    6172   6173    00:00.05  3207  --查詢執行用 222 ms,15行受影響

gbase8s修改后執行計劃

select skip 0 first 15 * from T_SZGL_JDRY order by T_SZGL_JDRY.updatetime desc ​ Estimated Cost: 7 Estimated # of Rows Returned: 6172 ​ 1) gbasedbt.t_szgl_jdry: INDEX PATH  (1) Index Name: gbasedbt.i_t_szgl_jdry_updatetime    Index Keys: updatetime (Reverse) (Serial, fragments: ALL) Query statistics: ----------------- The final cost of the plan is reduced because of the FIRST n specification in the query. ​ Table map : ---------------------------- Internal name   Table name ---------------------------- t1        t_szgl_jdry ​ type   table rows_prod est_rows rows_scan time    est_cost ------------------------------------------------------------------- scan   t1   15     6172   15     00:00.00  8    ​ QUERY: (OPTIMIZATION TIMESTAMP: 12-21-2017 03:23:25) ------ select 1 from sysusers Estimated Cost: 2 Estimated # of Rows Returned: 1 1) gbasedbt.sysusers: SEQUENTIAL SCAN ... --查詢執行用 18 ms,15行受影響

第一個執行計劃中 (1) (Temp Table For Collection Subquery): SEQUENTIAL SCAN)可以看出是將子查詢的結果查詢出來后,在這個基礎上獲取了15條記錄

對比postgresql執行計劃

--分頁執行計劃-不嵌套

db_jcxxzypt=# explain select * from db_jcxx.t_jcxxzy_tjaj order by d_slrq limit 15 offset 0;                        QUERY PLAN                         ------------------------------------------------------------------------- Limit (cost=0.44..28.17 rows=15 width=879)  -> Index Scan using idx_ttjaj_dslrq on t_jcxxzy_tjaj (cost=0.44..32374439.85 rows=17507700 width=879) (2 rows) --子查詢執行計劃-嵌套一層 db_jcxxzypt=# explain db_jcxxzypt-# select * from ( db_jcxxzypt(# select * from db_jcxx.t_jcxxzy_tjaj order by d_slrq db_jcxxzypt(# )tab1 limit 15 offset 0;                        QUERY PLAN                         ------------------------------------------------------------------------- Limit (cost=0.44..28.32 rows=15 width=879)  -> Index Scan using idx_ttjaj_dslrq on t_jcxxzy_tjaj (cost=0.44..32374439.85 rows=17507700 width=879) (2 rows) ​ --子查詢執行計劃-嵌套兩層 db_jcxxzypt=# explain db_jcxxzypt-# select * from ( db_jcxxzypt(# select * from ( db_jcxxzypt(# select * from db_jcxx.t_jcxxzy_tjaj order by d_slrq db_jcxxzypt(# )tab1 )tab2 limit 15 offset 0;                        QUERY PLAN                         ------------------------------------------------------------------------- Limit (cost=0.44..28.32 rows=15 width=879)  -> Index Scan using idx_ttjaj_dslrq on t_jcxxzy_tjaj (cost=0.44..32374439.85 rows=17507700 width=879) (2 rows)

postgresql的子查詢即使嵌套多層,執行計劃還是和未嵌套一樣。原因就是postgresql在重寫sql的階段上拉子查詢(提升子查詢),把子查詢合并到父查詢中。

postgresql子查詢優化

子查詢可分為三類:一、([not]in/all/any/some),二、([not]exists),三、其他子查詢(sjp子查詢 選擇、投影、連接)

子查詢可以出現在目標列、form子句、where子句、join/on子句、group by子句、having子句、orderby子句等位置。

db_jcxxzypt=# explain select * from t_jcxxzy_tjaj aj ,(select * from t_jcxxzy_ajdsr) dsr where dsr.c_ajbm = '1301020400000120090101';                   QUERY PLAN                    ------------------------------------------------------------------------- Nested Loop (cost=0.56..1252119.58 rows=17507700 width=1098)  -> Index Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..8.57 rows=1 width=219)     Index Cond: (c_ajbm = '1301020400000120090101'::bpchar)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1077034.00 rows=17507700 width=879) (4 rows) ​ Time: 1.101 ms

postgresql子鏈接([not]in,[not]exists,all,some,any)

子查詢和子鏈接區別:子查詢是不在表達式中的子句,子鏈接在表達式中的子句

--in子鏈接

(1).

db_jcxxzypt=# explain select * from t_jcxxzy_tjaj aj where aj.c_ajbm in (select dsr.c_ajbm from t_jcxxzy_ajdsr dsr); 轉化為: select * from t_jcxxzy_tjaj aj join t_jcxxzy_ajdsr dsr aj.c_ajbm = dsr.c_ajbm;                           QUERY PLAN                       ------------------------------------------------------------------------- Hash Semi Join (cost=362618.61..5537768.07 rows=7957409 width=879)  Hash Cond: (t_jcxxzy_tjaj.c_ajbm = t_jcxxzy_ajdsr.c_ajbm)  -> Seq Scan on t_jcxxzy_tjaj (cost=0.00..1077034.00 rows=17507700 width=879)  -> Hash (cost=237458.59..237458.59 rows=6817202 width=23)     -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 wi dth=23) (5 rows) --in等價于=any hash semi join表示執行的是兩張表的hash半連接, 原始sql中沒有(t_jcxxzy_tjaj.c_ajbm = t_jcxxzy_ajdsr.c_ajbm),表明此in子查詢被優化,優化后采用hash semi join算法。 (2).相關子查詢 --當加入條件where aj.d_slrq='2001-06-14'后不能提升子鏈接,如果把where aj.d_slrq ='2001-06-14'放到父查詢 是支持子鏈接優化的 db_jcxxzypt=# explain db_jcxxzypt-# select * from t_jcxxzy_tjaj aj where c_ajbm in (select c_ajbm from t_jcxxzy_ajdsr dsr where aj.d_slrq='2001-06-14') ;                            QUERY PLAN                           ------------------------------------------------------------------------- Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..2227874766580.75 rows=8753850 width=879)  Filter: (SubPlan 1)  SubPlan 1   -> Result (cost=0.56..237458.59 rows=6817202 width=23)      One-Time Filter: (aj.d_slrq = '2001-06-14'::date)      -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr dsr (cost=0.56..237458.59 rows=6817 202 width=23) (6 rows (3). -- not in不能提升子鏈接 db_jcxxzypt=# explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm not in (select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                           QUERY PLAN                           ------------------------------------------------------------------------- Seq Scan on t_jcxxzy_tjaj (cost=0.56..2875921362927.06 rows=8753850 width=879)  Filter: (NOT (SubPlan 1))  SubPlan 1   -> Materialize (cost=0.56..311489.60 rows=6817202 width=23)      -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 width=23) (5 rows) --not in與>all含義相同

in子句存在不被優化的可能、當in子句中包含了主查詢的表字段,和主查詢有相關性時不能提升子鏈接。

exists子鏈接

--exists子鏈接

db_jcxxzypt=# explain
db_jcxxzypt-# select * from t_jcxxzy_tjaj aj where exists (select c_ajbm from t_jcxxzy_ajdsr dsr where aj.c_ajbm = dsr.c_ajbm);                            QUERY PLAN                           ------------------------------------------------------------------------- Hash Semi Join (cost=362618.61..5537768.07 rows=7957409 width=879)  Hash Cond: (aj.c_ajbm = dsr.c_ajbm)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1077034.00 rows=17507700 width=879)  -> Hash (cost=237458.59..237458.59 rows=6817202 width=23)     -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr dsr (cost=0.56..237458.59 rows=681720 2 width=23) (5 rows) -- 當加入where aj.c_xzdm = '150622'條件在子鏈接時,仍然支持上拉 db_jcxxzypt=# explain db_jcxxzypt-# select * from t_jcxxzy_tjaj aj where exists (select c_ajbm from t_jcxxzy_ajdsr dsr where aj.c_xzdm = '150622');                          QUERY PLAN                          ------------------------------------------------------------------------- Nested Loop Semi Join (cost=0.56..1361779.20 rows=5436 width=879)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1120803.25 rows=5436 width=879)     Filter: ((c_xzdm)::text = '150622'::text)  -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr dsr (cost=0.56..237458.59 rows=6817202 widt h=0) (4 rows) --exists子鏈接 db_jcxxzypt=# explain db_jcxxzypt-# select * from t_jcxxzy_tjaj aj where exists (select c_ajbm from t_jcxxzy_ajdsr dsr where dsr.c_ajbm='1101120300000120030101') db_jcxxzypt-# ;                        QUERY PLAN                        ------------------------------------------------------------------------- Result (cost=4.58..1077038.57 rows=17507700 width=879)  One-Time Filter: $0  InitPlan 1 (returns $0)   -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr dsr (cost=0.56..4.58 rows=1 width=0)      Index Cond: (c_ajbm = '1101120300000120030101'::bpchar)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1077034.00 rows=17507700 width=879) (6 rows) 

子查詢只執行了一次,作為aj表的參數。

--not exists子鏈接 db_jcxxzypt=# explain db_jcxxzypt-# select * from t_jcxxzy_tjaj aj where not exists (select c_ajbm from t_jcxxzy_ajdsr dsr);                   QUERY PLAN                   ------------------------------------------------------------------------- Result (cost=0.04..1077034.04 rows=17507700 width=879)  One-Time Filter: (NOT $0)  InitPlan 1 (returns $0)   -> Seq Scan on t_jcxxzy_ajdsr dsr (cost=0.00..281210.02 rows=6817202 width=0)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1077034.00 rows=17507700 width=879) (5 rows) 

從執行計劃上看,not exists子查詢并沒有被消除,子查詢只是執行了一次,將結果作為aj表的參數。

in和exists都存在不被優化的可能,對于in和exists的選擇,當父查詢結果集小于子查詢結果集則選擇exists,如果父查詢結果集大于子查詢結果集選擇in。

所有的all子鏈接都不支持上拉

db_jcxxzypt=# explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm >all(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                           QUERY PLAN                      ------------------------------------------------------------------------- Seq Scan on t_jcxxzy_tjaj (cost=0.56..2875921362927.06 rows=8753850 width=879)  Filter: (SubPlan 1)  SubPlan 1   -> Materialize (cost=0.56..311489.60 rows=6817202 width=23)      -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 width=23) (5 rows) ​ db_jcxxzypt=# explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm =all(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                           QUERY PLAN                          ------------------------------------------------------------------------- Seq Scan on t_jcxxzy_tjaj (cost=0.56..2875921362927.06 rows=8753850 width=879)  Filter: (SubPlan 1)  SubPlan 1   -> Materialize (cost=0.56..311489.60 rows=6817202 width=23)      -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 width=23) (5 rows) ​ db_jcxxzypt=# explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm all(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                           QUERY PLAN                          ------------------------------------------------------------------------- Seq Scan on t_jcxxzy_tjaj (cost=0.56..2875921362927.06 rows=8753850 width=879)  Filter: (SubPlan 1)  SubPlan 1   -> Materialize (cost=0.56..311489.60 rows=6817202 width=23)      -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 width=23) (5 rows) 

關于all的查詢都都是以子查詢的形式,不會上拉

some/any

--some和any是等效的

db_jcxxzypt=#explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm >some(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                         QUERY PLAN                         ------------------------------------------------------------------------- - Nested Loop Semi Join (cost=0.56..11316607.35 rows=5835900 width=879)  -> Seq Scan on t_jcxxzy_tjaj (cost=0.00..1077034.00 rows=17507700 width=879)  -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..64266.97 rows=2272401 width=23)     Index Cond: (c_ajbm  t_jcxxzy_tjaj.c_ajbm) (4 rows) ​ db_jcxxzypt=#explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm =some(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                           QUERY PLAN                          ------------------------------------------------------------------------- Hash Semi Join (cost=362618.61..5537768.07 rows=7957409 width=879)  Hash Cond: (t_jcxxzy_tjaj.c_ajbm = t_jcxxzy_ajdsr.c_ajbm)  -> Seq Scan on t_jcxxzy_tjaj (cost=0.00..1077034.00 rows=17507700 width=879)  -> Hash (cost=237458.59..237458.59 rows=6817202 width=23)     -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..237458.59 rows=6817202 wi dth=23) (5 rows) ​ db_jcxxzypt=#explain select * from db_jcxx.t_jcxxzy_tjaj where c_ajbm some(select c_ajbm from db_jcxx.t_jcxxzy_ajdsr);                         QUERY PLAN                         ------------------------------------------------------------------------- ​ Nested Loop Semi Join (cost=0.56..11316607.35 rows=5835900 width=879)  -> Seq Scan on t_jcxxzy_tjaj (cost=0.00..1077034.00 rows=17507700 width=879)  -> Index Only Scan using idx_tajdsr_cajbm on t_jcxxzy_ajdsr (cost=0.56..64266.97 rows=2272401 width=23)     Index Cond: (c_ajbm > t_jcxxzy_tjaj.c_ajbm) (4 rows) --some中未出現子查詢,dsr表都被上拉到父查詢中,與aj表進行嵌套半連接和hash半連接

這些查詢中all是完全不支持上拉子子鏈接的,而in和exists存在不被上拉的可能。

不可上拉的子查詢

不支持帶有with子句的格式,集合操作、聚集函數(aggregates、group、distinct)、cte、having、limit/offset等子句格式 ​

db_jcxxzypt=# explain select * from t_jcxxzy_tjaj aj ,(select * from t_jcxxzy_ajdsr limit 10) dsr where dsr.c_ajbm = '1301020400000120090101';                     QUERY PLAN                     ------------------------------------------------------------------------- Nested Loop (cost=0.00..1252111.54 rows=17507700 width=1098)  -> Subquery Scan on dsr (cost=0.00..0.54 rows=1 width=219)     Filter: (dsr.c_ajbm = '1301020400000120090101'::bpchar)     -> Limit (cost=0.00..0.41 rows=10 width=219)        -> Seq Scan on t_jcxxzy_ajdsr (cost=0.00..281210.02 rows=6817202 width=219)  -> Seq Scan on t_jcxxzy_tjaj aj (cost=0.00..1077034.00 rows=17507700 width=879) (6 rows) ​ Time: 0.958 ms

上拉子查詢后,父級的多個表之間的連接順序是怎么樣的呢?會有什么變化嗎?

對于被上拉的子查詢,abase把子查詢的關系并入主from-list中,這樣關系的個數會增加,按照多表連接順序算法就會產生更多的連接路徑比如A、B、C三張表的關聯就有{A,B}、{A,C}、{B,A}、{B,C}、{C,A}、{C,B}六種連接方式

join與子查詢固化或rewrite

join或子查詢的優化,屬于優化器優化JOIN的范疇。 ​

當用戶的QUERY涉及到多個JOIN對象,或者涉及到多個子查詢時,優化器可以選擇是否改變當前的SQL,產生更多的plan選擇更優的執行計劃。

postgresql.conf文件中:

#from_collapse_limit = 8

當from列表的對象少于from_collapse_limit時,優化器可以將子查詢提升到上層進行JOIN,從而可能選擇到更優的執行計劃。

#join_collapse_limit = 8        # 1 disables collapsing of explicit
                    # JOIN clauses 當使用顯示的JOIN時(除了full join),例如a join b join c join d,優化器可以重排JOIN的順序,以產生更多的PLAN選擇更優的執行計劃。 如果join_collapse_limit=1,則不重排,使用SQL寫法提供的順序。 ​ 如果用戶要固化JOIN順序,請使用顯示的JOIN,同時將join_collapse_limit設置為1。 如果用戶不打算提升子查詢,同樣的,將from_collapse_limit 設置為1即可。

等價改寫

子查詢中沒有group by子句,也沒有聚集函數,則可使用下面的等價轉換

val>all(select...) to val>max(select...)
valall(select...) to valmin(select...)
val>any(select...) to val>min(select...) valany(select...) to valmax(select...) val>=all(select...) to val>=max(select...) val=all(select...) to val=min(select...) val>=any(select...) to val>=min(select...) val=any(select...) to val=max(select...) 

通常,聚集函數min(),max()的執行效率要比any、all效率高

相關子查詢和非相關子查詢

相關子查詢子查詢的執行依賴于外層父查詢的一些屬性值。子查詢因依賴于父查詢的參數,當父查詢的參數改變時,子查詢需要根據新參數值重新執行(查詢優化器對相關子查詢進行優化有一定意義),如:

select * from t_jcxxzy_tjaj aj where c_ajbm in (select c_ajbm from t_jcxxzy_ajdsr dsr where dsr.c_ajbm = aj.c_ajbm)/* 子查詢語句中存在父查詢的列 */

非相關子查詢子查詢的執行,不依賴于外層父查詢的任何屬性值。這樣子查詢具有獨立性,可獨自求解,形成一個子查詢計劃先于外層的查詢求解,如:

select * from t_jcxxzy_tjaj aj where c_ajbm in (select c_ajbm from t_jcxxzy_ajdsr dsr where dsr.c_xzdm = '150622')/* 子查詢語句中不存在父查詢的屬性 */

結束語

1.postgresql子查詢的優化思路,子查詢不用執行多次

2.優化器可以根據統計信息來選擇不同的連接方法和不同的連接順序

3.子查詢中的連接條件,過濾條件分別變成了父查詢的連接條件、過濾條件、優化器可以對這些條件進行下推、提高執行效率

4.將子查詢優化為表連接后,子查詢只需要執行一次、而優化器可以根據統計信息來選擇不同的連接方式和連接順序、子查詢的連接條件和過濾條件分別變成父查詢的條件。

5.這些查詢中all是完全不支持上拉子子鏈接的,in和exists存在不被優化的可能

6.not exists雖然沒有被上拉,但是被優化為只執行一次,相對于not in稍好

7.可使用等價改寫的方式優化

8.可根據配置文件,固化子查詢,以及表的連接順序

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

您可能感興趣的文章:
  • postgresql varchar字段regexp_replace正則替換操作
  • PostgreSQL 正則表達式替換-使用變量方式
  • PostgreSQL LIKE 大小寫實例
  • Postgresql中LIKE和ILIKE操作符的用法詳解
  • PostgreSQL regexp_matches替換like模糊查詢的操作

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

巨人網絡通訊聲明:本文標題《postgresql關于like%xxx%的優化操作》,本文關鍵詞  postgresql,關于,like%xxx%,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《postgresql關于like%xxx%的優化操作》相關的同類信息!
  • 本頁收集關于postgresql關于like%xxx%的優化操作的相關信息資訊供網民參考!
  • 推薦文章
    av漫画在线观看| 青娱乐精品视频在线| 日韩免费电影一区二区| 黑人精品xxx一区| 国产美女www| r级无码视频在线观看| 一区二区成人av| 国产一区二区伦理片| www.色天使| 国产精品露出视频| 欧美日本在线观看| 天天综合在线视频| 成人高清在线观看视频| 欧美中文字幕视频在线观看| 中文字幕成人在线观看| 久久精品视频免费在线观看| 亚洲激情一区二区三区| 亚洲欧美日韩中文在线| 91一区在线观看| 免费在线一区二区三区| 欧美美女黄色网| 欧美大码xxxx| 亚洲电影激情视频网站| av中文在线观看| 香蕉视频xxxx| 精品国产一区二区三区久久久久久| 欧美日韩国产成人在线91| 久久9热精品视频| √天堂中文官网8在线| 超级碰在线观看| 久久久久女教师免费一区| 亚洲国产综合在线| 欧美 日韩 国产 成人 在线| 六月婷婷七月丁香| 一区二区三区四区免费观看| 国模视频一区二区三区| 在线观看亚洲一区| 成人av影院在线| 在线免费观看av片| a级在线观看视频| 手机成人av在线| 91精品国产高清久久久久久| 欧美浪妇xxxx高跟鞋交| 91视频在线观看免费| 亚洲天堂国产精品| 亚洲天堂久久新| 亚洲色成人www永久在线观看 | 亚洲第一视频区| 欧美视频在线观看网站| 成人免费观看网站| 久久影视电视剧免费网站| 日韩欧美中文在线| 91理论电影在线观看| 亚洲精华国产精华精华液网站 | 国产精品美女在线| 亚洲精选中文字幕| 日本高清不卡视频| 欧美经典一区二区| 国产原创一区二区三区| 国产精品亚洲lv粉色| 欧美第一页在线观看| 污免费在线观看| 欧美高清中文字幕| 女女同性女同一区二区三区91| 欧美亚洲国产日本| 中文国产成人精品久久一| 欧美日韩精品一区二区三区四区| 国产日韩精品一区二区三区在线| 久久婷婷av| 国产麻豆免费观看| 青青草手机视频在线观看| 亚洲麻豆一区二区三区| 天天碰免费视频| 二级片在线观看| 女女同性女同一区二区三区91| 国产成人精品视频在线观看| 国产亚洲免费的视频看| 精品欧美一区二区在线观看| 欧美亚洲动漫精品| 欧美色xxxx| 亚洲午夜在线观看视频在线| 中文字幕av资源一区| 99国内精品久久| 国产精品香蕉一区二区三区| 久久三级视频| 日韩精品电影在线观看| 天天干视频在线| 国产91免费在线观看| av男人天堂av| 好吊色视频一区二区| 国产乱码久久久久| 国产精品无码在线播放| 亚洲怡红院av| 久久中文字幕免费| 成人公开免费视频| 一本色道久久综合亚洲| 亚洲图片欧美日韩| 一区二区三区在线免费观看视频| 久久人人爽人人爽人人片av免费| 日韩欧美不卡视频| 亚洲图片欧美日韩| 中文字幕 欧美激情| 国产男女无套免费网站| 国产成人精品白浆久久69| 99国产精品久久久久99打野战| 国产人妖一区二区| 亚洲国产精品国自产拍久久| 亚洲人妻一区二区| 国产精品亚洲专一区二区三区| 懂色av一区二区夜夜嗨| www国产成人| 久久久亚洲高清| 一区二区三区在线高清| 色丁香久综合在线久综合在线观看| 色婷婷精品大在线视频| 日韩午夜在线影院| 亚洲精品第一页| 九色精品免费永久在线| 青青草成人在线| 成人在线视频电影| 国产大尺度在线观看| 国产区二区三区| 这里只有久久精品| 日本黄色免费观看| 国产无套在线观看| 日本视频在线观看免费| 在线观看中文字幕码| 蜜桃一区二区三区在线观看| 久久久99免费| 久久免费偷拍视频| 亚洲成人精品影院| 亚洲电影天堂av | 亚洲在线第一页| 国产精品香蕉视屏| 欧美精品自拍视频| 中文字幕第20页| 国产精品无码一区二区桃花视频| 久久精品国产亚洲a| 国产精品色呦呦| 在线播放中文一区| 久久久久国产精品一区| 精品国产综合区久久久久久| 亚洲精品中文字幕无码蜜桃| 高清国产在线观看| 国产高潮流白浆喷水视频| 91麻豆国产福利精品| 91 com成人网| 91精品国产91久久久久久久久| 欧美精品一区在线| 日本黄色大片在线观看| 自拍偷拍校园春色| 久久久久久久久久久黄色| 制服.丝袜.亚洲.另类.中文| 国a精品视频大全| 中文字幕色一区二区| 自拍视频一区二区| 欧美一级视频免费| 亚洲三级在线看| 上原亚衣av一区二区三区| 国产精品推荐精品| 无码国产69精品久久久久网站 | www.亚洲成人| 一区二区三区av在线| 中文字幕在线观看免费高清| 亚洲欧洲国产综合| 欧美特级www| 日本欧美国产在线| 草草草在线视频| 欧美男人天堂网| 国产精品国产三级国产aⅴ中文| 日韩av在线免费| 欧美日韩亚洲免费| 五月婷婷婷婷婷| 日本人妖一区二区| 在线不卡中文字幕| 91精品免费| 一区二区三区少妇| 精品在线视频一区| 亚洲成人精品久久| 日本日本精品二区免费| 久久一级免费视频| 99精品国产99久久久久久白柏| 亚洲第一色中文字幕| 婷婷久久伊人| 四虎成人精品永久免费av| 国产亚洲精品福利| 久久久久女教师免费一区| 国产精品一区二区免费在线观看| 精品乱码一区内射人妻无码| 一区二区三区在线影院| 欧日韩不卡在线视频| 俄罗斯女人裸体性做爰| 久久精品二区亚洲w码| 日韩av最新在线| 欧美又粗又长又爽做受| 国产毛片久久久久| 欧美精品乱码久久久久久按摩| 麻豆精品传媒视频| 精品成人久久久| 欧美日韩一区二区在线| 亚洲一区精品电影| 黄色一级视频在线观看| 亚洲在线中文字幕| 国产传媒一区二区| 日韩精品成人一区| 欧美日韩免费网站| 日韩精品一区二区三区色偷偷 | 美洲天堂一区二卡三卡四卡视频| 亚洲精品国产成人| 另类小说色综合| 狠狠久久亚洲欧美| 高清欧美性猛交xxxx黑人猛交| 18深夜在线观看免费视频| 国产宾馆实践打屁股91| 韩国欧美亚洲国产| 国产精久久一区二区三区| 国产精品欧美久久久久无广告| 国产精品视频白浆免费视频| 二区三区四区视频| 中文字幕中文字幕一区| 高清国产一区| 国产乱人乱偷精品视频| 日韩毛片在线看| 亚洲最大天堂网| 国产视频一区在线观看 | 欧美激情视频免费看| 久久99久久99| 国产精品情侣自拍| 成年人免费高清视频| 欧美一区二区三区在线| 免费观看成人网| 2023国产精品视频| 免费观看成人高| 久久激情婷婷| 91av在线看| 天天干天天干天天| 亚洲欧洲日韩国产| 瑟瑟视频在线观看| 欧美在线观看一区二区| 欧美a在线视频| 久久久美女毛片| 欧美综合77777色婷婷| 日韩国产欧美在线视频| 国产精品久久久久久一区二区| 黄色av网站免费观看| 中文字幕日本精品| 香蕉成人在线视频| 精品国精品国产| 久久久久久国产精品无码| 欧美日韩视频专区在线播放| 午夜视频在线网站| 亚洲国产日产av| 在线视频日韩一区| 亚洲一区二区三区不卡国产欧美| 国产精品入口芒果| 国产精品国产三级国产普通话99| 日本三级福利片| 久久久欧美精品sm网站| 午夜欧美一区二区三区免费观看| 国产一区视频在线看| 精品视频在线观看| 国产a久久麻豆| 日本一区二区在线视频观看| 成人久久18免费网站麻豆| 亚洲欧美在线网| 久久亚洲一级片| 欧美在线一区视频| 玉米视频成人免费看| av动漫免费看| 91影院未满十八岁禁止入内| 国产人成一区二区三区影院| 波多野结衣一本| 国产主播在线一区| 久久久久久久久久久黄色| www.av毛片| 国产精品网站在线播放| 五级黄高潮片90分钟视频| 欧美精品精品精品精品免费| 韩国三级在线一区| 久久成人福利视频| 一区二区三区四区av| 国产精久久久久| 精品亚洲男同gayvideo网站| 国产99久久久国产精品潘金网站| 国产精品亚洲无码| 国产精品久久九九| 亚洲三级理论片| 丰满少妇一区二区| 成人精品在线观看| 亚洲欧美一区二区在线观看| 日韩中文在线字幕| 亚洲欧美国产高清va在线播| 天天操天天操天天操| www国产精品内射老熟女| 97激碰免费视频| 欧美特黄级在线| 香蕉视频成人在线| 国产v亚洲v天堂无码久久久| 日韩免费电影网站| 92久久精品一区二区| 欧美裸体网站| 日韩精品一区二区三区视频在线观看 | 欧美久久久久久久久久久久久| 久久久av电影| 国产麻豆成人传媒免费观看| 性高潮免费视频| 成人日韩在线电影| 在线欧美日韩精品| 亚洲欧美日韩中文字幕在线观看| 97国产成人精品视频| 久久久一区二区三区捆绑**| 国产盗摄x88av| 一区二区精品在线观看| 欧洲一区在线观看| 久久国产日韩欧美精品| 翔田千里88av中文字幕| 欧美性猛交xxxx乱大交91| 精品国产亚洲一区二区三区在线观看| 久久精品国产一区二区三区免费看| 99视频在线免费| 亚洲一区999| 久久婷婷麻豆| 国产精品嫩草av| 国产福利久久精品| 日韩一本二本av| 国产suv精品一区二区69| 精品欧美一区免费观看α√| 日韩一区二区精品葵司在线| 韩国三级电影一区二区| 中文字幕+乱码+中文乱码www | 欧美中文娱乐网| 亚洲国产欧美在线成人app | 美国黑人一级大黄| 久久国产精品高清| 一本色道亚洲精品aⅴ| 国产精品亚洲第一区在线暖暖韩国| 日本黄色网址大全| 国产精品8888| 国产精品区一区二区三在线播放 | 久久综合精品一区| 亚洲国产一区自拍| 国产日韩欧美高清| 欧美在线视频精品| 中文字幕第36页| 国产精品国产精品国产专区蜜臀ah| 91一区二区在线| 亚洲黄色在线播放| 香蕉免费毛片视频| 又大又硬又爽免费视频| 97精品久久久中文字幕免费| 色婷婷亚洲婷婷| 久久免费午夜影院| 婷婷丁香一区二区三区| 国产99免费视频| 欧美国产日韩激情| 国产精品视频白浆免费视频| 91精品国产综合久久婷婷香蕉| 欧美国产综合一区二区| 神马午夜一区二区| 亚洲国产精品三区| 日韩亚洲欧美精品| 国产精品v片在线观看不卡| 亚洲精品国产综合久久| 丰满白嫩尤物一区二区| 超碰97人人干| 视频在线一区二区三区| 一区二区三区国产视频| 国产精品色婷婷久久58| 国产情侣激情自拍| 粉色视频免费看| 国产国产精品人在线视| 精品久久久国产| 婷婷综合激情网| 欧美性生交大片| 亚洲中文字幕无码不卡电影| 国产99久久精品一区二区 夜夜躁日日躁 | 91中文字幕在线播放| 黄色a一级视频| av无码久久久久久不卡网站| 国产成人在线一区二区| 精品日本一线二线三线不卡| 亚洲国产精品精华液2区45| 动漫av一区二区三区| 网站免费在线观看| 日韩精品在线观看av| 57pao成人国产永久免费| 日韩一区二区三区视频在线| 国产欧美日本一区二区三区| 亚洲精品久久久久avwww潮水| 3d动漫精品啪啪一区二区下载| av 日韩 人妻 黑人 综合 无码| 成人h片在线播放免费网站| 久久国产精品电影| 激情成人在线视频| 成人一区二区在线观看| 亚洲国产精品二区| 国产精品suv一区二区三区| 色欲欲www成人网站| 精品一区二区三区国产| 久久精品久久久久电影| 欧美性欧美巨大黑白大战| 亚洲欧洲精品一区二区三区不卡| 四虎免费在线观看| 麻豆一区二区三区精品视频| 日本wwwwwww| 欧美日韩一区二区三区69堂| 男人的天堂视频在线| 精品视频第一区| 日本高清不卡在线| 欧美大码xxxx|