postgresql關於in和exists使用


1.當父查詢結果集小於子查詢結果集則選擇exists,如果父查詢結果集大於子查詢結果集選擇in。(可嘗試等價改寫)
in和exists都有子查詢優化,提升子查詢,有時候這兩的執行計划一樣。需要注意的是如果子查詢包含了父查詢里面的條件,in不會被優化。

2.in里面的值一般不超過100個
3.單表abase的in和個數關系不大,都可以走索引。
4.當有連表並且有in的個數很多,count的時候需要解析這些值很慢,所以可以封裝成any valuse的形式來求count,而分頁還是使用in。此例主要是in和any(values)的等價改寫
any values:c_bh=any(values('53'),('530001'),('530002'),...)

abase在查詢的時候會自動做表連接。將兩張表做hash join操作:
1.EXPLAIN SELECT * FROM X WHERE x_num IN(SELECT y_num FROM y);
2. QUERY PLAN
3.----------------------------------------------------------------------
4. Hash Join (cost=23.25..49.88 rows=350 width=86)
5. Hash Cond: (x.x_num = y.y_num)
6. -> Seq Scan on x (cost=0.00..17.00 rows=700 width=86)
7. -> Hash (cost=20.75..20.75 rows=200 width=4)
8. -> HashAggregate (cost=18.75..20.75 rows=200 width=4)
-> Seq Scan on y (cost=0.00..17.00 rows=700 width=4)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM