数据库 – Postgres ANTI-JOIN需要表扫描吗?

我需要在同一个表上的ANTI-JOIN(不存在来自表的SELECT东西… /左连接表WHERE table.id IS NULL).实际上我有一个索引来提供不存在的问题,但查询规划器选择使用位图堆扫描.

该表有1亿行,因此进行堆扫描时搞砸了……

如果Postgres可以与指标进行比较,那将会非常快. Postgres是否必须访问此ANTI-JOIN的表格?

我知道必须在某个时候访问该表以服务MVCC,但为什么这么早呢?不能只用桌子来固定,因为它可能会遗漏一些东西吗?

您需要提供版本详细信息,并且正如jmz所说的EXPLAIN ANALYZE输出以获得任何有用的建议.

弗兰兹 – 不要以为是否可能,测试和了解.

这是v9.0:

CREATE TABLE tl (i int, t text);
CREATE TABLE tr (i int, t text);
INSERT INTO tl SELECT s, 'text ' || s FROM generate_series(1,999999) s;
INSERT INTO tr SELECT s, 'text ' || s FROM generate_series(1,999999) s WHERE s % 3 = 0;
ALTER TABLE tl add primary key (i);
CREATE INDEX tr_i_idx ON tr (i);
ANALYSE;
EXPLAIN ANALYSE SELECT i,t FROM tl LEFT JOIN tr USING (i) WHERE tr.i IS NULL;
                                                         QUERY PLAN                                                      
-----------------------------------------------------------------------------------------------------------------------------
 Merge Anti Join  (cost=0.95..45611.86 rows=666666 width=15) (actual time=0.040..4011.970 rows=666666 loops=1)
   Merge Cond: (tl.i = tr.i)
   ->  Index Scan using tl_pkey on tl  (cost=0.00..29201.32 rows=999999 width=15) (actual time=0.017..1356.996 rows=999999 lo
   ->  Index Scan using tr_i_idx on tr  (cost=0.00..9745.27 rows=333333 width=4) (actual time=0.015..439.087 rows=333333 loop
 Total runtime: 4602.224 ms

您看到的内容取决于您的版本以及规划人员看到的统计数据.

相关文章
相关标签/搜索