Comprender el plan de ejecución de SQL

Para comprender el plan de ejecución, primero debe comprenderlo, luego todo tipo de sustantivos. Dado que no lo sé muy bien. Este artículo está destinado a ser escrito solo si se entiende, pero no se entiende.

  Al principio, debemos explicar que la primera vez que miramos el plan de ejecución, debemos tener en cuenta que el plan de ejecución de SQL Server se ve de derecha a izquierda.

  Análisis sustantivo:

  Escanear: recorre los datos línea por línea.

  Primero crea una tabla y muestra cómo se ve.

Código de copia
  CREAR  TABLA Persona ( 
      Id int  IDENTITY ( 1 , 1 ) NOT  NULL , 
      Name nvarchar ( 50 ) NULL , 
      Age int  NULL , 
      Height int  NULL , 
      Area nvarchar ( 50 ) NULL , 
      MarryHistory nvarchar ( 10 ) NULL , 
      EducationalBackground nvarchar ( 10) NULL , 
      Dirección nvarchar ( 50 ) NULL , 
      InSiteId int  NULL 
  ) ON  [ PRIMARIO ]
Código de copia

  Los datos en la tabla son aproximadamente 140,000, que es similar a lo siguiente:

  

  No hay índice para esta tabla.

1. Operaciones de acceso a datos

 1. Escaneo de tabla

  Exploración de tabla: cuando se produce una tabla de montón y no hay índices disponibles, se realiza una exploración de tabla, lo que indica que toda la tabla se analiza una vez.

  Ahora, ejecutemos una declaración de consulta simple en esta tabla:

  SELECCIONAR  *  De la persona DONDE Nombre =  ' 公子'

  Vea el plan de ejecución de la siguiente manera:

  

  El escaneo de tablas, como su nombre lo indica, es escanear toda la tabla para encontrar los datos que necesita.

 2. Escaneo de índice agrupado

  Exploración de índice agrupado: ocurre en una tabla agrupada, que también es equivalente a una operación de exploración de tabla completa, pero cuando las condiciones para la columna agrupada son (WHERE Id> 10) y otras operaciones, la eficiencia será mejor.

  A continuación, agregamos un índice agrupado a esta tabla en la columna Id.

  CREAR  CLUSTERED  ÍNDICE IX_Id EN Persona (Id)

  Ejecute la misma consulta nuevamente:

  SELECCIONAR  *  De la persona DONDE Nombre =  ' 公子'

  El plan de ejecución es el siguiente:

  

  ¿Por qué el índice agrupado creado en la columna Id afecta el escaneo? ¿Sin mencionar que no tiene nada que ver con la condición de Nombre?

  De hecho, después de agregar un índice agrupado, la tabla cambia de una tabla de montón a una tabla agrupada. Sabemos que los datos de la tabla agrupada existen en los nodos a nivel de hoja del índice agrupado. Por lo tanto, la exploración de agregación no es muy diferente de la exploración de la tabla. Si hay una gran diferencia, depende de lo que esté en la condición where y los datos devueltos más tarde. En lo que respecta a esta declaración SQL, no hay mucha diferencia en la eficiencia.

  Puede ver las estadísticas de E / S:

  Escaneo de tabla:

  

  Escaneo de índice agrupado:

  

  Esto está más allá del alcance de este artículo, y la eficiencia no está dentro del alcance de este artículo. Este artículo solo considera las diferencias entre varios escaneos y por qué ocurren.

 3. Búsqueda de índice agrupado

  Búsqueda de índice agrupado: escanee un rango específico de filas en el índice agrupado.

  Mire la ejecución de la siguiente instrucción SQL:

  SELECCIONAR  *  DE la persona DONDE Id =  ' 73164 '

  El plan de ejecución es el siguiente:

  

 4. Escaneo de índice

  Escaneo de índice: escanea el índice no agrupado en su conjunto.

  Agreguemos un índice agrupado y ejecutemos una declaración de consulta:

  CREAR  ÍNDICE NO AGRUPADO  IX_Name ON Person (Name)     -crea un índice no agrupado SELECT Name FROM Person

  

  Vea el plan de ejecución de la siguiente manera:

  

  ¿Por qué elegir el análisis de índice (índice no agrupado) aquí?

  Porque este índice no agrupado puede cubrir los datos requeridos. ¿Qué sucede si el índice no agrupado no se puede cubrir? Por ejemplo, cambiamos SELECT a SELECT * y echamos un vistazo.

  

  Obviamente, hay demasiados registros en el resultado devuelto, y no es rentable usar un índice no agrupado. Por lo tanto, se utiliza un índice agrupado.

  Si eliminamos el índice agrupado en este momento, ejecute SELECT * para ver.

 ÍNDICE DE   GOTA Person.IX_Id

  

  No hay índice agrupado en este momento, por lo que solo se utiliza el escaneo de tabla.

 5. Búsqueda de marcadores

  En el estudio anterior de indexación, ya sabemos que cuando el índice no agrupado no cubre ni contiene todas las columnas requeridas, SQL Server elegirá realizar directamente una exploración de índice agrupado para obtener datos, o ir al índice no agrupado para encontrar la clave del índice agrupado, Luego use el índice agrupado para encontrar los datos.

  Veamos un ejemplo de búsqueda de marcadores:

  SELECT  *  FROM Person WHERE Name =  ' Fatty ' --La columna de nombre tiene un índice no agrupado

  El plan de ejecución es el siguiente:

  

  El proceso anterior se puede entender como: primero encuentre la fila solicitada a través de un índice no agrupado, pero este índice no contiene todas las columnas, por lo que debe ir a la tabla básica para encontrar estas columnas, por lo que debe realizar una búsqueda de clave, si la tabla básica es Organizado por montón, entonces esta búsqueda de clave (Búsqueda de clave) se convertirá en búsqueda de RID (Búsqueda de RID), la búsqueda de clave y la búsqueda de RID se denominan colectivamente búsqueda de marcador. Sin embargo, a veces, cuando el número de filas devueltas por un índice no agrupado es demasiado grande, SQL Server puede optar por realizar una exploración de índice agrupado directamente.

En segundo lugar, la operación de agregación de flujo.

 1. Agregación de flujo

  Agregación de flujo: calcule el valor de resumen de varios conjuntos de filas en el flujo ordenado correspondiente.

  Todas las funciones de agregación (como COUNT (), MAX ()) tendrán agregación de flujo, pero no consumirán IO, solo CPU.

  Por ejemplo, ejecute la siguiente instrucción:

  SELECCIONE  MÁXIMO (Edad) DE Persona

  Vea el plan de ejecución de la siguiente manera:

  

 2. Calcular escalar

  Calcular escalar: calcula un nuevo valor basado en el valor existente en la fila. Por ejemplo, la función COUNT (), si hay una línea más, el número de líneas aumentará en 1.

  Las funciones de agregación distintas de las funciones MIN y MAX requieren operaciones de agregación de flujo seguidas de un escalar calculado.

  SELECCIONE  EL CONTEO ( * ) DE Persona

  Vea el plan de ejecución de la siguiente manera:

  

3. Agregación de hash (coincidencia de hash)

  Para la cláusula con Agrupar por agregado, dado que los datos deben ordenarse de acuerdo con las columnas detrás de agrupar por, se requiere Ordenar para garantizar la ordenación. Tenga en cuenta que la operación Ordenar es una operación que ocupa memoria. Cuando la memoria es insuficiente, también ocupará tempdb. SQL Server siempre elegirá el costo más bajo entre las operaciones de clasificación y la coincidencia hash .

  SELECCIONAR Altura, CONTAR (Id) DESDE Persona:     averiguar la altura del 
  grupo  POR Altura

  El plan de ejecución es el siguiente:

  

  Para volúmenes de datos más grandes, SQL Server elige la coincidencia de hash.

  Después de crear la tabla hash en la memoria, el valor que sigue al grupo by se usará como clave, y luego cada pieza de datos de la colección se procesará a su vez. Cuando la clave no exista en la tabla hash, agregue una entrada a la tabla hash. Cuando la clave ya esté en la tabla hash Cuando existe la lista, el valor en la tabla hash se calcula de acuerdo con las reglas (las reglas son funciones agregadas, como Sum, avg, etc.).

 4. Clasificación

  Cuando la cantidad de datos es baja, por ejemplo, ejecute la siguiente instrucción para crear una nueva tabla con solo decenas de registros y lo mismo que Person.

  SELECCIONE  *  EN Persona2  DE Persona2
  DONDE Id <  100

  Luego ejecute la misma instrucción de consulta:

  SELECT Height, COUNT (Id) FROM Person2     -pero la tabla se reemplaza por una tabla con una menor cantidad de datos 
  GROUP  BY Height

  El plan de ejecución es el siguiente:

  

3. Conexión

  Cuando se unen varias tablas (incluida la búsqueda de marcadores y las uniones entre índices), SQL Server utiliza tres tipos diferentes de combinaciones: combinaciones anidadas en bucle, combinaciones de combinación y combinaciones hash. Estos diversos formatos de conexión tienen sus propios escenarios, y no hay mejor manera de decirlo.

  Cree dos tablas nuevas de la siguiente manera

  

  Esta es una noticia simple, estructura de columnas.

 1. lazo anidado

  Primero mire una simple declaración de consulta Inner Join

  SELECCIONE  *  DESDE Nx_Column COMO C
  INNER  ÚNASE Nx_Article AS A
  ON A.ColumnId = C.ColumnId

  El plan de ejecución es el siguiente:

  

  El icono de la conexión de anidación de bucle también es muy vívido, que se encuentra en la entrada externa superior (entrada externa), que también es un escaneo de índice agrupado. Y la entrada interna (Entrada interna) a continuación, que es la búsqueda de índice agrupado. La entrada externa se ejecuta solo una vez, y la entrada interna se busca de acuerdo con cada línea donde la entrada externa cumple la condición de unión. Como hay 7 líneas aquí, la entrada interna se ejecuta 7 veces.

  

  De acuerdo con el principio de los bucles anidados, no es difícil ver que debido a que la entrada externa es un escaneo y la entrada interna es una búsqueda, cuando el conjunto de resultados de la entrada externa de las dos tablas de unión es relativamente pequeño y la entrada interna busca una tabla muy grande, el optimizador de consultas está más inclinado Para seleccionar el método de anidación de bucle.

 2. Combinar conexión

  A diferencia de los bucles anidados, las combinaciones de combinación solo realizan un acceso desde cada tabla. Desde este principio, la fusión de combinaciones es mucho más rápida que la anidación de bucles.

  No es difícil imaginar desde el principio de fusionar conexiones. Primero, fusionar conexiones requiere que ambas partes estén en orden. Y la condición para unirse es igual al signo. Debido a que las dos condiciones de entrada ya están en orden, tome una fila de cada conjunto de entrada para comparar, devuelva igual, descarte desigual, no es difícil ver por qué la combinación de combinación solo permite unirse después del signo igual Podemos ver este principio desde el ícono en la Figura 11.

  SELECCIONAR  *  DESDE Nx_Column COMO C
  INNER  JOIN     Nx_Article AS A
  ON A.ColumnId = C.ColumnId
  OPTION (MERGE join )

  El plan de ejecución es el siguiente:

  

  Si ambos lados de los datos de entrada están fuera de orden, el analizador de consultas no elegirá una conexión de fusión. También podemos usar el indicador de fusión para forzar la conexión de fusión. Para lograr esto, el plan de ejecución debe agregar un paso de clasificación para lograr el orden. Esta es la razón por la que la declaración SQL anterior debería agregar OPCIÓN (combinación MERGE). La columna ColumnId de la tabla Artículo se ordena como se describe anteriormente.

 3. Conexión hash

  La conexión de hash también solo necesita acceder a los datos de ambas partes solo una vez. Hash join se logra creando una tabla hash en la memoria. Esto requiere más memoria y tempdb también se puede usar si no hay suficiente memoria. Pero no es tan ordenado como la conexión fusionada.

  Para realizar las siguientes dos implementaciones, el índice agrupado de las dos columnas no se debe generar en la columna ColumnId, de lo contrario no se utilizará la combinación hash.

  El ALTER  TABLE PK_Nx_Column DROP  CONSTRAINT PK_Nx_Column     - gota primaria 
  DROP  ÍNDICE Nx_Column.PK_Nx_Column    - dejar caer el índice agrupado 
  CREATE  CLUSTERED  ÍNDICE IX_ColumnName EN Nx_Column (ColumnName)     - crear un índice agrupado 
  - aquí y luego de vuelta a la llave primaria en él, con el índice agrupado, No se puede construir de forma predeterminada con la clave primaria

  También elimine el índice agrupado de otra tabla Artículo.

  Luego ejecute la siguiente consulta:

  SELECCIONE  *  DESDE Nx_Column COMO C
  INNER  ÚNASE     Nx_Article AS A
  ON A.ColumnId = C.ColumnId

  El plan de ejecución es el siguiente:

  

    Para eliminar el índice agrupado, de lo contrario, las dos entradas ordenadas de SQL Server elegirán una conexión de fusión de menor costo. SQL Server usa las dos entradas anteriores para generar una tabla hash, y las siguientes entradas para detectar, puede ver esta información en la ventana de propiedades, como se muestra en la Figura 15.

    En términos generales, cuando los datos solicitados se cumplen cuando una o ambas partes no están ordenadas, se utilizará la comparación de hash.

Cuatro, paralelo

  Cuando se conectan varias tablas, SQL Server también permite el paralelismo de consultas en el caso de múltiples CPU o múltiples núcleos, lo que sin duda mejora la eficiencia.

Reimpreso la explicación de un gran dios, el texto original proviene de: http://www.cnblogs.com/kissdodog/p/3160560.html

 

 

Publicado 22 artículos originales · elogiado 7 · 100,000+ visitas

Supongo que te gusta

Origin blog.csdn.net/qyx0714/article/details/70161400
Recomendado
Clasificación