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