Olá pessoal Agradeço Cleiton e Euler pelas explicações, tanto do tipos de dados que devem ser iguais nas chaves pk e fk, tanto de que o postgresql permite criar vários indices sobre a mesma coluna. Concordo que não criar índice para cada fk ajuda muito, pois com certeza diminuirá o overhead nas atualizações.
[]`s Neto <div id="DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2"><br /> <table style="border-top: 1px solid #D3D4DE;"> <tr> <td style="width: 55px; padding-top: 18px;"><a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail" target="_blank"><img src="https://ipmcdn.avast.com/images/icons/icon-envelope-tick-round-orange-animated-no-repeat-v1.gif" alt="" width="46" height="29" style="width: 46px; height: 29px;" /></a></td> <td style="width: 470px; padding-top: 17px; color: #41424e; font-size: 13px; font-family: Arial, Helvetica, sans-serif; line-height: 18px;">Livre de vírus. <a href="https://www.avast.com/sig-email?utm_medium=email&utm_source=link&utm_campaign=sig-email&utm_content=webmail" target="_blank" style="color: #4453ea;">www.avast.com</a>. </td> </tr> </table> <a href="#DAB4FAD8-2DD7-40BB-A1B8-4E2AA1F9FDF2" width="1" height="1"></a></div> Em 20 de agosto de 2017 11:09, Euler Taveira <eu...@timbira.com.br> escreveu: > 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 _______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral