pgsql 對於 IN 條件的給力支援

2021-08-26 04:02:17 字數 1237 閱讀 9996

因為pgsql的查詢規劃器可以智慧型地分解條件,比如

select * from tk where tk.id = 1 or tk.id = 2
規劃器可以智慧型地分解成兩條針對有索引的id欄位的查詢,然後作union。

那in的情況如何呢?

select * from tk where tk.id in (1,2,3)
explain 結果居然不是想象中的分解而是使用了pgsql的陣列型別來處理

bitmap heap scan on tk  (cost=12.77..21.82 rows=3 width=72)

recheck cond: (id = any (''::integer))

-> bitmap index scan on tk_pkey (cost=0.00..12.77 rows=3 width=0)

index cond: (id = any (''::integer))

time: 0.015s

效率比手動分解還要高!

select * from tk where tk.id = 1 or tk.id = 2 or tk.id =3
bitmap heap scan on tk  (cost=12.78..21.83 rows=3 width=72)

recheck cond: ((id = 1) or (id = 2) or (id = 3))

-> bitmapor (cost=12.78..12.78 rows=3 width=0)

-> bitmap index scan on tk_pkey (cost=0.00..4.26 rows=1 width=0)

index cond: (id = 1)

-> bitmap index scan on tk_pkey (cost=0.00..4.26 rows=1 width=0)

index cond: (id = 2)

-> bitmap index scan on tk_pkey (cost=0.00..4.26 rows=1 width=0)

index cond: (id = 3)

time: 0.047s

對於mysql來說兩種方式沒區別,它的查詢優化器沒那麼智慧型和強大,連or都不能分解的。所以叫優化器而不是規劃器——要靠人肉來做優化 :p

pgsql的sql語句時間條件轉換

postgresql資料庫,寫sql語句時涉及到根據時間查詢的條件,需要把表中字段的時間轉化成年 年月或者年月日。第一種 把時間欄位都轉化成字串型別來比較 to char table time,yyyy between and startyear endyear為查詢條件,string型別 第二種 ...

對於「條件競爭」的利用

條件競爭漏洞是一種伺服器端的漏洞,是由於開發者設計應用程式併發處理時操作邏輯不合理而造成。當應用面臨高併發的請求時未能同步好所有請求,導致請求與請求之間產生等待時出現邏輯缺陷。該漏洞一般出現在與資料庫系統頻繁互動的位置,例如金額同步 支付等較敏感操作處。另外條件競爭漏洞也會出現在其他位置,例如檔案的...

根據某條件給GridView符合條件的值畫上刪除線

如博文標題,根據某些條件對gridview控制項中,對符合條件的值畫上刪除線效果。實現這些要求,隻人捕獲到哪些符合要求的資料即可。gridview控制項是在templatefield模版顯示資料,insus.net並沒有使用任一控制項,如label或literal等控制項來呈現資料。稍後在寫onro...