应该为此查询创建什么索引?

时间:2017-12-08 20:12:04

标签: sql postgresql

所以我需要帮助来弄清楚我需要创建哪些索引才能提高此查询的性能:

SELECT DISTINCT F.nif, F.nomef
FROM fornecedor F, produto P
WHERE F.nif = P.forn_primario AND P.categoria = 'Fruta';

表格fornecedor和produto以这种方式创建:

Fornecedor

create table fornecedor (
nif char(9) not null unique,
nomef varchar(80) not null,
constraint nif_size CHECK (Length(nif)=9),
constraint pk_fornecedor primary key(nif));

Produto

create table produto (
ean char(13) not null unique,
design varchar(255) not null,
categoria varchar(80) not null,
forn_primario char(9) not null,
data date not null,
constraint ean_size CHECK (Length(ean)=13),
constraint pk_produto primary key(ean),
constraint fk_produto_categoria foreign key(categoria) references categoria(nome) ON DELETE CASCADE,
constraint fk_produto_fornecedor foreign key(forn_primario) references fornecedor(nif));

我不知道是否需要创建一个多键索引,如:

CREATE INDEX multiple_idx ON produto (forn_primario,categoria);

或其他什么???

3 个答案:

答案 0 :(得分:0)

您肯定需要一个以categoria开头的索引。最好的是forn_primario

 create index ix_producto_categoria on producto(categoria, forn_primario)

进一步支持您的查询,您可能想要创建

 create index ix_fornecedor_nif on fornecedor(nif, nomef)

答案 1 :(得分:0)

您的查询最好写成:

SELECT DISTINCT F.nif, F.nomef
FROM fornecedor F JOIN
     produto P
     ON F.nif = P.forn_primario AND P.categoria = 'Fruta';

对于此版本,您需要product(categoria, forn_primario)fornecdor(nif)上的索引。

然后,如果nif / nomef在第一个表中是唯一的,则应表示为:

SELECT F.nif, F.nomef
FROM fornecedor F 
WHERE EXISTS (SELECT 1
              FROM produto P
              WHERE F.nif = P.forn_primario AND P.categoria = 'Fruta'
             );

对于此版本,您需要produto(forn_primario, categoria)上的索引。

答案 2 :(得分:0)

在fornecedor上,属性nif是主键...我认为你不应该在PK上使用索引