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; @ 解决方案: |
|
|
|
|
|