Está utilizando una exploración de índice principalmente porque también está utilizando una combinación de fusión. El operador Combinar combinación requiere dos flujos de entrada que están ordenados en un orden que es compatible con las condiciones de Unión.
Y está utilizando el operador Merge Join para realizar su INNER JOIN porque cree que será más rápido que el operador de unión de bucle anidado más típico. Y probablemente sea correcto (generalmente lo es), al usar los dos índices que ha elegido, tiene flujos de entrada que están ordenados previamente según su condición de unión (LocationID). Cuando los flujos de entrada se clasifican previamente de esta manera, las uniones combinadas son casi siempre más rápidas que las otras dos (uniones en bucle y hash).
Lo malo es lo que ha notado: parece que está escaneando todo el índice, entonces, ¿cómo puede ser más rápido si está leyendo tantos registros que quizás nunca se utilicen? La respuesta es que los escaneos (debido a su naturaleza secuencial) pueden leer de 10 a 100 veces más registros por segundo que búsquedas.
Ahora las búsquedas generalmente ganan porque son selectivas: solo obtienen las filas que usted solicita, mientras que las exploraciones no son selectivas: deben devolver cada fila en el rango.Pero debido a que los escaneos tienen un mucho mayor tasa de lectura, con frecuencia pueden vencer a las búsquedas siempre que la relación de Filas descartadas a Filas coincidentes sea inferior que la relación de Filas de escaneo/seg VS. Busca filas/seg.
Preguntas?
bien, me han pedido que explique la última frase más:
A "desechados Fila" es uno que el Scan lee (porque tiene que leer todo en el índice), pero eso será rechazado por el operador Combinar combinación, porque no tiene una coincidencia en el otro lado, posiblemente porque la condición de la cláusula WHERE ya lo ha excluido.
"Filas coincidentes" son las que se leen que coinciden con algo en la Combinación de combinación. Estas son las mismas filas que una Seek habría leído si el escaneo hubiera sido reemplazado por una búsqueda.
Puede averiguar lo que hay mirando las estadísticas en el Plan de consulta. ¿Ves esa enorme y gruesa flecha a la izquierda del Index Scan? Eso representa cuántas filas cree que el optimizador leerá con el Escaneo. El cuadro de estadísticas del Análisis de índice que ha publicado muestra que las filas reales devueltas son aproximadamente 5,4 millones (5 394 402). Esto es igual a:
TotalScanRows = (MatchingRows + DiscardedRows)
(En mis términos, de todos modos). Para obtener las Filas coincidentes, consulte las "Filas reales" informadas por el operador Fusionar combinación (puede que tenga que quitar las 100 principales para obtener esto con precisión). Una vez que sepa esto, puede obtener las filas descartadas por:
DiscardedRows = (TotalScanRows - MatchingRows)
Y ahora puede calcular la relación.
Probablemente no relacionados pero tengo curiosidad, ¿por qué no tienen una orden por la parte superior, mientras que el uso de '100' –
Fuera de interés (pero no pretende ser una solución de cualquier tipo) hace cambiar el 'INNER JOIN' para' INNER LOOP JOIN' acelerar las cosas o ralentizar las cosas? –
¿Están sus llaves principales agrupadas por casualidad? – JStead