回答

收藏

PostgreSQL:NOT IN与EXCEPT性能差异(编辑#2)

技术问答 技术问答 114 人阅读 | 0 人回复 | 2023-09-13

我有两个功能相同的查询。一个表现好,另一个表现差。我看不出性能差异从何而来。6 V+ p, [  {3 Y  {' J- w- \# L
查询1:( a+ h) ^) N7 k, P, A9 C
SELECT id FROM subsource_positionWHERE  id NOT IN (SELECT position_id FROM subsource)回到以下计划:
* }! n' x5 {( n8 N. G% \$ W                                                                                                                                        QUERY PLAN                                   ------------------------------------------------------------------------------- Seq Scan on subsource_position  (cost=0.00..362486535.10 rows=128524 width=4)   Filter: (NOT (SubPlan 1)  SubPlan 1     ->  Materialize  (cost=0.00..2566.50 rows=101500 width=4)           ->  Seq Scan on subsource  (cost=0.00..1662.00 rows=101500 width=4)查询2:
7 }! w5 H, K- _, ZSELECT id FROM subsource_positionEXCEPTSELECT position_id FROM subsource;计划:0 b2 _% b# H5 |: f4 [9 d
                                                                                                                                                                            QUERY PLAN                                            ------------------------------------------------------------------------------------------------- SetOp Except  (cost=24760.35..25668.66 rows=95997 width=4)   ->  Sort  (cost=24760.35..25214.50 rows=181663 width=4)          Sort Key: "*SELECT* 1".id         ->  Append  (cost=0.00..6406.26 rows=181663 width=4)                ->  Subquery Scan on "*SELECT* 1"  (cost=0.00..4146.94 rows=95997 width=4)                      ->  Seq Scan on subsource_position  (cost=0.00..3186.97 rows=95997 width=4)                ->  Subquery Scan on "*SELECT* 2"  (cost=0.00..2259.32 rows=85666 width=4)                      ->  Seq Scan on subsource  (cost=0.00..1402.66 rows=85666 width=4)(8 rows)我觉得我在查询中失去了一些明显不好的东西,或者我错误地配置了它PostgreSQL服务器。我以为可以。NOT IN优化得很好NOTIN性能问题问题,还是有理由不在这里优化?8 e) [" ]: g1 X- t: w- V+ M. x
附加数据:
% j2 V1 h6 Z* f" [& i- l=> select count(*) from subsource; count ------- 85158(1 row)=> select count(*) from subsource_position; count ------- 93261(1 row)编辑    :我现在已经修复了下面提到的内容AB!= BA问题。但是我所说的问题仍然存在:查询1仍然比查询2严重得多。我相信,这是由于两个表的行数相似。
* q" _4 R- F% j: h2 o) _, P* K编辑2    :我在用PostgresQL 9.0.4.我不能用EXPLAIN6 G, j( W5 f  F# S& ?
ANALYZE,因为查询#时间太长了。所有这些列都不是空的,所以没有区别。
9 v) \5 X- i5 `/ ]5 A编辑3    :我在这两列都有索引。我还没有完成查询。#1(约10分钟后放弃)。#2立即返回。
' P9 |0 ?/ Q8 l7 |! U0 D9 i1 u                                                               
) D- O3 u: }: M( c( ]6 e; @    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则