回答

收藏

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

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

我有两个功能相同的查询。一个表现好,另一个表现差。我看不出性能差异从何而来。( z2 P9 v% D% ]; _" x) V; S
查询1:4 z2 {4 u" X' }! A0 P- N
SELECT id FROM subsource_positionWHERE  id NOT IN (SELECT position_id FROM subsource)回到以下计划:
/ \% r1 T. P( 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 ~1 H# [9 Z, T
SELECT id FROM subsource_positionEXCEPTSELECT position_id FROM subsource;计划:* P* P5 b6 A& V) d& R
                                                                                                                                                                            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性能问题问题,还是有理由不在这里优化?( |; n& Y0 \* h5 Z0 q: h4 D
附加数据:3 o- c4 ~. e1 e; [) L
=> select count(*) from subsource; count ------- 85158(1 row)=> select count(*) from subsource_position; count ------- 93261(1 row)编辑    :我现在已经修复了下面提到的内容AB!= BA问题。但是我所说的问题仍然存在:查询1仍然比查询2严重得多。我相信,这是由于两个表的行数相似。8 M/ f# y( T' x  r# \
编辑2    :我在用PostgresQL 9.0.4.我不能用EXPLAIN
5 ?# T1 V; @; T6 n- d9 U, ]! lANALYZE,因为查询#时间太长了。所有这些列都不是空的,所以没有区别。% N. |& v6 c: s: L5 f
编辑3    :我在这两列都有索引。我还没有完成查询。#1(约10分钟后放弃)。#2立即返回。
/ k3 S# J1 s0 j: M% D7 M9 o2 b; |                                                                ! Q1 U, i7 h$ w6 k5 Y
    解决方案:
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则