Em 19 de agosto de 2017 18:24, Neto pr <neto...@gmail.com> escreveu:
> Segundo alguns autores, ao se criar uma chave primaria, na verdade o
> SGBD cria um índice primário/único no caso de chave primaria. Mas e no
> caso da chave estrangeira, o SGBD indexa a coluna Fk também?
>
Alguns SGBDs criam/criavam índices para cada chave estrangeira criada;
o PostgreSQL, não. Na minha opinião foi uma decisão sábia do
PostgreSQL porque (i) nem todo índice de chave estrangeira é utilizado
(é útil para remover registro que é referenciado por chave estrangeira
e as tabelas referenciadas são grandes) e (ii) não incha o modelo com
índices desnecessários.

> Pergunto isso pois criei a seguinte chave estrangeira em um banco de
> testes (do benchmark TPCH):
>
> ALTER TABLE ORDERS ADD FOREIGN KEY (O_CUSTKEY) REFERENCES CUSTOMER(C_CUSTKEY);
>
> Apos tentei criar um índice secundário btree na tabela ORDERS desta forma:
> CREATE INDEX indice_custkey_customer on ORDERS (O_CUSTKEY);
>
> Achei que o PostgreSQL  Não iria permitir isso, pois pensei que a
> coluna O_CUSTKEY já estava indexada (pela chave estrangeira), mas o
> PostgreSQL aceitou o índice secundário.
>
Como eu disse, o PostgreSQL não cria índice ao criar chave
estrangeira. Fica a critério do AD/DBA criar tais índices. Além disso,
você pode criar quantos índices quiser em uma mesma coluna.

euler=# create table foo (a int primary key, b int not null);
CREATE TABLE
euler=# create index foo1 on foo(b);
CREATE INDEX
euler=# create index foo2 on foo(b);
CREATE INDEX
euler=# \d foo
       Tabela "public.foo"
 Coluna |  Tipo   | Modificadores
--------+---------+---------------
 a      | integer | não nulo
 b      | integer | não nulo
Índices:
    "foo_pkey" PRIMARY KEY, btree (a)
    "foo1" btree (b)
    "foo2" btree (b)

Isso é últil para descartar um índice inchado (é claro que essa
técnica envolve parada. Use CONCURRENTLY para diminuir o tempo de
bloqueio.).

> Alguém saberia explicar SE ao criar uma chave estrangeira, é criado ou
> não um índice.
> Outro dia estava vendo um plano de execução, e no plano tinha o uso de
> uma chave estrangeira para recuperar registros, por isso também a
> dúvida.
>
O plano pode considerar o uso de índice em uma chave estrangeira (em
junções o planejador é esperto em utilizar o índice da chave
primária). Algo como:

SELECT x, y, z FROM orders WHERE o_custkey = 1234;


-- 
   Euler Taveira                                   Timbira -
http://www.timbira.com.br/
   PostgreSQL: Consultoria, Desenvolvimento, Suporte 24x7 e Treinamento
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a