Em 19 de agosto de 2017 18:24, Neto pr <[email protected]> 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
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral