您需要提供版本详细信息,以及jmz说EXPLAIN ANALYZE输出以获取任何有用的建议。
弗朗兹 - 不要以为是否可能,测试和知道。
这是9.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
你看到的将取决于您的版本,并且计划看到统计数据。
发布您现在的查询(和计划),以便我们可以分析它并更好地回答问题。可以使用BHS,因为它更高效,但也可能是左连接的结果,可以避免。你可以对查询的不同变体做一个'EXPLAIN ANALYZE',比如'NOT EXISTS','SELECT ... EXCEPT'等等。 – jmz 2011-03-11 18:57:08
这仍然是理论上的。我认为这是不可能的,因为Postgres无法确定索引反连接不会错过某些信息。这就是为什么必须尽早检查表格的原因。 – 2011-03-11 19:03:30
如果是理论上的,为什么你认为PostgreSQL不能做索引扫描? Richard Huxton已经展示了一个使用索引扫描的例子。 – 2011-03-12 09:57:59