¿Qué es un "índice de coincidencia parcial"?

27

Estoy tratando de obtener más información sobre el operador del plan de consulta "comprobación de referencias de clave externa" introducido en SQL Server 2016. No hay mucha información al respecto. Microsoft lo anunció aquí y escribí un blog al respecto aquí . El nuevo operador se puede ver eliminando una fila de una tabla primaria con 254 o más referencias de claves externas entrantes: enlace dbfiddle .

Hay tres recuentos diferentes que se muestran en los detalles del operador:

Detalles de verificación de FK

  • El recuento de referencias de clave externa es el número de claves externas entrantes.
  • El número de índices coincidentes es el número de claves externas entrantes sin un índice adecuado. La verificación de que la tabla actualizada o eliminada no viola esa restricción requerirá un análisis de una tabla secundaria.
  • No sé qué representa el recuento de índices de coincidencia parcial .

¿Qué es un índice de coincidencia parcial en este contexto? No pude hacer funcionar ninguno de los siguientes:

  • Índices filtrados
  • Poner la columna de clave externa como una INCLUDEcolumna para un índice
  • Índices con la columna de clave externa como la segunda columna de clave
  • Índices de una sola columna para claves externas de múltiples columnas
  • Crear múltiples índices de cobertura para habilitar un plan de "unión de índice" para una clave externa de múltiples columnas

Dan Guzman señaló que las claves externas de varias columnas pueden coincidir con los índices, incluso si las claves del índice están en un orden diferente al de las columnas de claves externas. Su código está aquí en caso de que alguien pueda usarlo como punto de partida para descubrir más sobre índices de coincidencia parcial.

Joe Obbish
fuente

Respuestas:

13

Hablé con personas mucho más inteligentes que yo y lo documentaremos pronto ™.

La definición real de esto, mientras tanto, es:

PartialMatchingIndexCount refleja el número de referencias que podrían verificarse mediante búsquedas de índice, pero la clave de índice no cubre todas las columnas que se verifican. Por ejemplo, los elementos ForeignKeyReferenceCheck correspondientes contienen un elemento Predicados de búsqueda y un elemento Predicado.

Adicionalmente:

Si este número es mayor que 0, existe un posible problema de rendimiento, en caso de que las coincidencias parciales den como resultado un gran número de filas.

Sean dice Eliminar Sara Chipps
fuente
66
Un ejemplo de trabajo o documentación real sería glorioso. Recompensa ofrecida
Tom V - Equipo Mónica
3

Después de buscar más en Google, logré crear una publicación que menciona "Índices de coincidencia parcial" y claves extranjeras

La publicación de blog del 1 de marzo de 2013 en el blog de Carlos Klapp CodeForeign Keys without Indexes tiene el Procedimiento almacenado llamado Util_FKsWithoutIndexesque busca claves externas que no tienen índices adecuados para las relaciones FK. (Parece que este blogger sacó esto de SQL Server Central's The Ultimate Index-Less Foreign-Key Finder(15 de octubre de 2009) ) El blog dice lo siguiente:

Busca restricciones de clave externa que no tienen índices totalmente coincidentes.

Los mejores índices de coincidencia parcial se generan con MatchCounts y comparaciones de columnas

Genera una plantilla CREATE INDEX para cada clave externa sin índice coincidente o índice de coincidencia parcial.

Personalice según sea necesario (agregue incluye, si lo desea agrupado, o si debería ser parte de la clave principal, o si desea fusionarse con otro índice)

Los FK que faltan índices de coincidencia completa pueden afectar gravemente el rendimiento de DELETES en la tabla referenciada debido a escaneos de tabla para verificar la integridad referencial, así como SELECCIONAR en las tablas de referencia donde las columnas de clave externa están en los predicados WHERE o JOIN (Esto le afectará si existe una restricción o no). Esto solo verifica las primeras N columnas del índice donde N es el número de columnas en la restricción de clave externa.

El orden de la columna de índice no se verifica más allá de esto (un FK de dos columnas que tiene 1 columna coincidente en la segunda columna de un índice de 3 columnas se generará como una coincidencia parcial)

Si su base de datos no tiene restricciones de clave externa, entonces esta herramienta no tendrá valor para usted.

Muchas bases de datos tienen cobertura de restricción de clave externa parcial. Esto solo funciona en tablas relacionadas donde se declaran restricciones.

Si entiendo esto correctamente, si una relación FK no tiene un índice que coincida con cada columna en algún índice necesario, puede haber algunos índices que tengan algunas de las columnas. Por ejemplo, si una relación FK tiene tres columnas ( a, b, c), pero no existe un índice con esos mismos tres columnas, puede existir un índice que tiene ( a, b) o ( a, c) o ( b, c) y puede ayudar con las consultas pero Will requieren algunos escaneos de índice a filas con la columna que falta.

Si no hay ningún índice que pueda soportar una restricción FK, entonces el "Recuento de índices de coincidencia parcial" será cero ( 0), o al menos no incrementará este recuento.

RolandoMySQLDBA
fuente
¿Es esto lo que tenías en mente? Todavía no puedo hacerlo funcionar ... dbfiddle.uk/…
Joe Obbish
No exactamente. Intenta hacer un FK con (FKey2,FKey3)y crea un índice FKey2. Por favor intente eso.
RolandoMySQLDBA
Recuerde que no soy un chico de SQL Server, pero solo estoy tratando de ayudar.
RolandoMySQLDBA
Entiendo y aprecio cualquier idea para probar. Tampoco puedo hacer que las dos columnas funcionen.
Joe Obbish
Podrías deshacerte create unique index FULL_IX_UNIQUE ON FK_PARENT_TABLE (FKey, Fkey2, Fkey3), mantener el índice FKey2y volver a intentarlo.
RolandoMySQLDBA