在小表和大表之间的内部联接期间,索引将被忽略

我在Postgresql中有两个简单的表,第一个有 170万

CREATE TABLE f_occ(
id_data integer,dur integer
);

第二个表具有 365

CREATE TABLE d_data(
id_data serial,full_data date,month SMALLINT,);

为了优化两个表之间的联接,我尝试在id_data上创建一个哈希索引,但这完全被忽略了。为什么会发生这种情况,如何优化查询?当我在表d_data的where处插入条件时,也会发生这种情况。

CREATE INDEX f_occ_id_data ON public.f_occ USING hash (id_data)
EXPLAIN ANALYZE
SELECT d.month,s.dur
FROM d_data d,f_occ s
WHERE d.id_data = s.id_data;

"Hash Join  (cost=10.21..34133.23 rows=1705429 width=6) (actual time=1.479..9158.424 rows=1705429 loops=1)"
"  Hash Cond: (s.id_data = d.id_data)"
"  ->  Seq Scan on f_occ s  (cost=0.00..29594.29 rows=1705429 width=8) (actual time=0.096..2992.577 rows=1705429 loops=1)"
"  ->  Hash  (cost=5.65..5.65 rows=365 width=6) (actual time=1.352..1.353 rows=365 loops=1)"
"        Buckets: 1024  Batches: 1  Memory Usage: 23kB"
"        ->  Seq Scan on d_data d  (cost=0.00..5.65 rows=365 width=6) (actual time=0.030..0.656 rows=365 loops=1)"
"Planning Time: 0.919 ms"
"Execution Time 11727.436 ms"
clmmd996755680 回答:在小表和大表之间的内部联接期间,索引将被忽略

如果表很小,则某些查询优化器更喜欢在内存中使用表的完全访问权限,以避免索引访问

在您使用旧隐式联接sintax的情况下,另一个元素是对主/导表的假设,根据您似乎建议在哪里查询优化器将f_occ用作主/导表
尝试更改采用d_data作为主表的表的顺序,并采用基于JOIN和ON clase的显式联接sintax

SELECT d.month,s.dur
FROM d_data d
INNER JOIN  f_occ s  ON  d.id_data = s.id_data;

为了获得更好的性能,您应该使用允许索引优化器使用的复合索引来按索引直接解析与f_occ表相关的所有查询信息

 CREATE INDEX f_occ_id_data ON public.f_occ USING hash (id_data,dur)
本文链接:https://www.f2er.com/3070746.html

大家都在问