EXPLAIN ANALYZE Not 运行 查询

EXPLAIN ANALYZE Not Running on Query

我正在尝试分析一个大型查询以提高效率。我先 运行 就 EXPLAIN:

 EXPLAIN 
    SELECT * FROM pop_allocation_sql.main_parcels_cb_intersects
    WHERE parcel_id NOT IN (SELECT DISTINCT parcel_id::int 
    FROM pop_allocation_sql.main_bldgs_cb_intersects)

它在几秒钟内返回了以下内容:

Gather  (cost=20506897.97..3330358572517.40 rows=40283932 width=89)
Workers Planned: 7
->  Parallel Seq Scan on main_parcels_cb_intersects  (cost=20505897.97..3330354543124.20 rows=5754847 width=89)
    Filter: (NOT (SubPlan 1))
    SubPlan 1
      ->  Materialize  (cost=20505897.97..21069329.24 rows=6107669 width=4)
            ->  Unique  (cost=20505897.97..21014931.89 rows=6107669 width=4)
                  ->  Sort  (cost=20505897.97..20760414.93 rows=101806784 width=4)
                        Sort Key: ((main_bldgs_cb_intersects.parcel_id)::integer)
                        ->  Seq Scan on main_bldgs_cb_intersects  (cost=0.00..5334454.80 rows=101806784 width=4)

但这不会告诉我确切的瓶颈发生在哪里,所以我尝试 运行 只是:

EXPLAIN ANALYZE
  SELECT * FROM pop_allocation_sql.main_parcels_cb_intersects
  WHERE parcel_id NOT IN (SELECT DISTINCT parcel_id::int 
  FROM pop_allocation_sql.main_bldgs_cb_intersects)

我让这个 运行 放了一个多小时,但没有任何回报。我检查了 PG ADMIN 并注意到等待事件说 Lock: t运行sactionid 并给出了 119698 的阻塞 PID(我不确定这是什么意思)。为什么我的查询无法完成?

进程 ID 为 119698 的会话打开了一个事务,该事务在您的查询中的一个表上持有 ACCESS EXCLUSIVE 锁。如有必要,使用

结束该交易
SELECT pg_cancel_backend(119698);

如果您希望查询执行得更好,请将其重写为

SELECT *
FROM pop_allocation_sql.main_parcels_cb_intersects AS p
WHERE NOT EXISTS (
    SELECT FROM  pop_allocation_sql.main_bldgs_cb_intersects AS pb
    WHERE p.parcel_id = pb.parcel_id::integer
);

DISTINCT完全没有必要。