O que é um "Índice de correspondência parcial"?

27

Estou tentando aprender mais sobre o operador de plano de consulta "verificação de referências de chave estrangeira" introduzido no SQL Server 2016. Não há muitas informações sobre isso por aí. A Microsoft anunciou aqui e eu escrevi sobre isso aqui . O novo operador pode ser visto excluindo uma linha de uma tabela pai com 254 ou mais referências de chave estrangeira recebidas: dbfiddle link .

Existem três contagens diferentes exibidas nos detalhes do operador:

Detalhes da verificação FK

  • Referências de chaves estrangeiras Contagem é o número de chaves estrangeiras recebidas.
  • Nenhuma contagem de índices correspondente é o número de chaves estrangeiras recebidas sem um índice adequado. A verificação de que a tabela atualizada ou excluída não violará essa restrição exigirá uma verificação de uma tabela filha.
  • Não sei o que a Contagem Parcial de Índices Correspondentes representa.

O que é um índice de correspondência parcial nesse contexto? Não consegui fazer funcionar nenhum dos seguintes itens:

  • Índices filtrados
  • Colocando a coluna de chave estrangeira como uma INCLUDEcoluna para um índice
  • Indexa com a coluna de chave estrangeira como a segunda coluna de chave
  • Índices de coluna única para chaves estrangeiras de várias colunas
  • Criando vários índices de cobertura para permitir um plano de "junção de índice" para uma chave estrangeira de várias colunas

Dan Guzman apontou que as chaves estrangeiras de várias colunas podem corresponder aos índices, mesmo que as chaves de índice estejam em uma ordem diferente das colunas de chaves estrangeiras. Seu código está aqui , caso alguém possa usá-lo como ponto de partida para descobrir mais sobre índices de correspondência parcial.

Joe Obbish
fonte

Respostas:

13

Conversei com pessoas muito mais espertas do que eu e estaremos documentando isso em breve ™.

A definição real disso, nesse ínterim, é:

PartialMatchingIndexCount reflete o número de referências que podem ser verificadas usando buscas de índice, mas a chave de índice não cobre todas as colunas que estão sendo verificadas. Por exemplo, os elementos ForeignKeyReferenceCheck correspondentes contêm um elemento Seek Predicates e Predicate.

Além do que, além do mais:

Se esse número for maior que 0, há um problema de desempenho em potencial, caso as correspondências parciais resultem em um grande número de linhas.

Sean diz Remover Sara Chipps
fonte
6
Um exemplo de trabalho ou documentação real seria glorioso. Recompensa oferecida
Tom V - Team Monica
3

Depois de pesquisar um pouco mais no Google, consegui publicar uma postagem que menciona "Índices de correspondência parcial" e Chaves estrangeiras

A postagem do blog de 1º de março de 2013 no Code Blog de Carlos Klapp intituladaForeign Keys without Indexes tem o procedimento armazenado chamado, Util_FKsWithoutIndexesque procura chaves estrangeiras que não possuem índices adequados para os relacionamentos do FK. (Parece que este blogueiro tirou isso do SQL Server Central The Ultimate Index-Less Foreign-Key Finder(15 de outubro de 2009) ) O blog diz o seguinte:

Pesquisa restrições de chave estrangeira que não possuem índices totalmente correspondentes.

Os melhores índices de correspondência parcial são gerados com MatchCounts e comparações de coluna

Gera um modelo CREATE INDEX para cada chave estrangeira sem nenhum índice correspondente ou um índice parcial correspondente.

Personalize conforme necessário (inclua inclusões, se você desejar que ele seja armazenado em cluster ou se faça parte da chave primária ou se você deseja mesclar com outro índice)

As FKs com falta de índices de correspondência completa podem prejudicar gravemente o desempenho de DELETES na tabela referenciada devido a varreduras de tabela para verificar a integridade referencial, bem como SELECTS nas tabelas de referência nas quais as colunas de chave estrangeira estão nos predicados WHERE ou JOIN (Isso afetará você se uma restrição existe ou não). Isso verifica apenas as primeiras N colunas do índice, em que N é o número de colunas na restrição de chave estrangeira.

A ordem da coluna do índice não é verificada além disso (um FK de duas colunas com 1 coluna correspondente na 2ª coluna de um índice de 3 colunas será gerado como uma correspondência parcial)

Se o seu banco de dados não tiver restrições de chave estrangeira, essa ferramenta será inútil para você.

Muitos bancos de dados têm cobertura parcial de restrição de chave estrangeira. Isso funciona apenas em tabelas relacionadas nas quais restrições são declaradas.

Se eu entendi isso corretamente, se um relacionamento FK não tiver um índice que corresponda a todas as colunas em algum índice necessário, pode haver alguns índices que contenham algumas das colunas. Por exemplo, se uma relação FK tem três colunas ( a, b, c), mas não existe um índice com as mesmas três colunas, pode existir um índice que tem ( a, b) ou ( a, c) ou ( b, c) e podem ajudar com consultas mas será requer algumas verificações de índice em linhas com a coluna ausente.

Se não houver índices que possam suportar uma restrição de FK, a "Contagem de índices de correspondência parcial" será zero ( 0) ou pelo menos não aumentará essa contagem.

RolandoMySQLDBA
fonte
É isso que você tinha em mente? Ainda não consigo fazê-lo funcionar ... dbfiddle.uk/…
Joe Obbish
Não exatamente. Tente fazer um FK com (FKey2,FKey3)e crie um índice FKey2. Por favor, tente isso.
RolandoMySQLDBA
Lembre-se de que eu não sou do tipo SQL Server, mas só estou tentando ajudar.
RolandoMySQLDBA
Compreendo e aprecio todas as idéias para tentar. Também não consigo fazer com que as duas colunas funcionem.
Joe Obbish
Você pode abandonar create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), manter o índice FKey2e tentar novamente.
RolandoMySQLDBA