Pessoal, sempre lembrando, vamos evitar "top posting" com este meu comentário aqui, isto atrapalha muito!!!
Em 14 de outubro de 2016 01:55, Fernando Franquini 'capin' < fernando.franqu...@gmail.com> escreveu: > Euler, > > Eu trabalhei bastante com Oracle e SQL Server, posso afirmar que faziam > diferença e concordo com os pontos (i) e (ii). > > Porém em relação a junção fiquei em dúvida no item (iii): > > Se a PK da tabela A é FK na tabela B, ao realizar a junção de A com B e > usar a coluna FK vai usar o indice da PK na A e na B nada?? > > Obrigado pelas colocações. > Abraços. > > 2016-10-13 11:16 GMT-03:00 Euler Taveira <eu...@timbira.com.br>: > >> On 13-10-2016 08:37, Fernando Franquini 'capin' wrote: >> > Mas em princípio ele deve fazer mais bem que mal, porque? Porque toda >> > junção com as chaves (FKs) que forem realizadas irão utilizar esse >> índice. >> > >> Isso pode ser verdade em outros bancos (que criam índice para cada FK); >> no postgres isso não é. É uma prática comum (criar esses índices) mas eu >> particularmente não recomendo porque (i) ocupa espaço, (ii) torna >> operações de INSERT, UPDATE e DELETE lentas (porque é necessário manter >> os índices atualizados) e (iii) junções vão usar o índice da chave >> primária e não o índice da FK. Quando esses índices são úteis? Em >> consultas que não fazem a junção com a tabela da chave primária e a >> cláusula WHERE inclui o campo da FK (e os valores utilizados são >> seletivos). >> >> Nos diversos modelos que trabalhei atrevo a dizer que menos de 2% das >> consultas vão se beneficiar de um índice em um campo que é FK. Portanto, >> eu prefiro ir criando esses índices em FK sob demanda. Em modelos >> consolidados, faz-se uma análise de todas as consultas e os planos de >> execução vão dizer se o índice na FK é benéfico ou não. >> >> Em modelos migrados de outros SGBDs, após uma análise de uso, observa-se >> que a maioria dos índices candidatos a remoção são em FK. > > Com relação a questão de se criar indices para restrições de chave estrangeira, como o Eula já colocou isso é desnecessário na maioria dos casos. Onde seria interessante se criar? Cito aqui 3 situações que ajudam: - Quando você tem operações em cascata. Isso vai ajudar na melhoria de performance e de fato pode ser dramática a diferença de performance. - Quando a junção é no sentido da tabela pai para a tabela filha. Como já dito também, nem toda junção vai fazer uso do índice na tabela filha. Por exemplo quando a junção é no sentido da tabela filha para a tabela pai vai fazer uso do índice de chave na tabela pai pois os registros da tabela filha já foram pré-selecionados. No caso de uma junção onde se busca no sentido da tabela pai para a filha o otimizador pode fazer a escolha por utilizar o índice em casos onde haja um bom nível de seletividade o que melhora a performance. Como as operações acima não são frequentes, por exemplo é muito mais comum pesquisar um produto e fazer a junção dele com a categoria do que pesquisar a categoria e trazer todos os produtos vinculados. Aqui mesmo com índice dependendo da seletividade o otimizador pode escolher não fazer uso do índice. Portanto, se você altera com frequência a chave primária, remove os registros da tabela pai com frequência ou seleciona os registros partindo da tabela pai pra tabela filha com frequência e o índice possui índice de seletividade suficiente então um índice faria sentido. Lembro que operações em cascata são perigosas e, EU (opinião pessoal aqui) particularmente não recomendo. Sem contar que são raros os casos onde realmente são necessárias. Charly Batista
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral