使用哪个索引

时间:2017-12-11 17:56:56

标签: sql postgresql indexing database-indexes

我有两个经常使用的查询,所以索引是我应该真正使用的东西,在查看所有索引后,我仍然无法确定哪个更适合以下查询:

select distinct F.nif, F.nome
from fornecedor F, produto P
where F.nif = P.forn_primario
and P.categoria = 'Frutos'

select ean, count(nif)
from produto P, fornece_sec F
where P.ean = F.ean
group by P.ean

由于第一个查询是多列的,我认为它应该是一个B树,但是在文档中他们再也没有提到来自不同表的列。

2 个答案:

答案 0 :(得分:1)

对于此查询(注意:使用正确的现代语法编写):

select distinct F.nif, F.nome
from fornecedor F join
     produto P
     on F.nif = P.forn_primario
where P.categoria = 'Frutos';

您可能想要produto(categoria, forn_primario)fornecedor(nif, nome)上的索引。我会怀疑你是否真的需要select distinct,并且有更多信息可能会建议另一个版本的查询。

对于此查询(注意:正确编写以避免语法错误):

select P.ean, count(F.nif)
from produto P join
     fornece_sec F
     on P.ean = F.ean
group by P.ean;

您希望每个表中ean上的索引。我建议您使用count(*)代替count(nif),除非您特别想要计算该列的非NULL值。

答案 1 :(得分:1)

你这样做的方式,当你不确定时,你会对潜在的候选人进行测试(希望在你的开发环境中)。所以你用b-tree创建它然后运行

explain analyse select ...

并使用结果制作矩阵

b-tree(select whatever)     hash (select whatever)
time 0.0001 ms              time 9999 ms
plan ...                    plan ...

这就是你如何确切地知道你需要的那个,因为我们不知道你的表的大小,列的选择性和其他东西的批次

可能btree你的连接和谓词虽然:)