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
完全没有必要。
我正在尝试分析一个大型查询以提高效率。我先 运行 就 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
完全没有必要。