Índices con columnas incluidas, ¿cuál es la diferencia?

papá

Nunca he entendido realmente la diferencia entre estos dos índices, ¿alguien puede explicar cuál es la diferencia (en cuanto al rendimiento, cómo se verá la estructura del índice en db, en cuanto al almacenamiento, etc.)?

Entiendo que esta pregunta es amplia, por favor tengan paciencia conmigo. Realmente no sé cómo buscarlo. Tal vez, si comienzan a explicar sus conocimientos, obtendré sugerencias en la dirección correcta que me permitirán hacer la pregunta más estrecha.

Índice incluido

CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
ON Person.Address (PostalCode) 
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); 

Índice 'normal'

CREATE NONCLUSTERED INDEX IX_Address_PostalCode  
ON Person.Address (PostalCode, AddressLine1, AddressLine2, City, StateProvinceID);
Desilusionado

El almacenamiento interno de índices utiliza una estructura de árbol B y consta de "páginas de índice" (la raíz y todas las páginas intermedias) y "páginas de datos de índice" (sólo las páginas hoja).

Tenga en cuenta que no confunda "páginas de datos de índice" con las "páginas de datos" (páginas hoja de índices agrupados) que almacenan la mayoría de las columnas de datos reales.

  • Solo las columnas de índice se almacenan en las páginas de índice.
  • Al colocar algunas columnas en la INCLUDEsección, se almacenan menos datos por clave de índice en cada página.
  • Lo que significa que se necesitan menos páginas para contener las claves de índice. ( Facilitando el almacenamiento en caché de estas páginas de uso frecuente en la memoria durante más tiempo ) .
  • Y posiblemente menos niveles en el árbol. ( En tal caso, los beneficios de rendimiento pueden ser mucho mayores porque cada recorrido de nivel de árbol es otro acceso al disco ) .

Cuando se usa un índice, la tecla de índice se usa para navegar a través de las páginas de índice hasta la página de datos de índice correcta.

  • Si el índice tiene INCLUDEcolumnas, esos datos están disponibles de inmediato si la consulta los necesita.
  • Si la consulta requiere columnas que no están disponibles ni en las claves de índice ni en las INCLUDEcolumnas, entonces se requiere una "búsqueda de marcadores" adicional para la fila correcta en el índice agrupado (o montón si no hay un índice agrupado definido).

Algunas cosas a tener en cuenta que, con suerte, resuelven parte de su confusión:

  • Si las claves de su índice y los filtros en su consulta no son lo suficientemente selectivos , entonces el índice será ignorado (independientemente de lo que haya en sus INCLUDEcolumnas).
  • Cada índice que crea tiene una sobrecarga para las instrucciones INSERT y UPDATE; más aún para índices "más grandes". (Más grande también se aplica a las INCLUDEcolumnas).
  • Entonces, si bien en teoría podría crear una multitud de índices grandes con columnas de inclusión para que coincidan con todas las permutaciones de las rutas de acceso, sería muy contraproducente.

Vale la pena señalar que antes de INCLUDEque se agregaran columnas como característica:

  • Era un 'truco' común de ajuste de índice expandir las claves de un índice para incluir columnas que no eran necesarias en el índice / filtro. (Conocido como índice de cobertura).
  • Estas columnas se requerían comúnmente en columnas de salida o como columnas de referencia para uniones a otras tablas.
  • Esto evitaría las infames "búsquedas de marcadores", pero tenía la desventaja de hacer que el índice fuera más "más ancho" de lo estrictamente necesario.
  • De hecho, muy a menudo, las columnas anteriores del índice ya identificarían una fila única, lo que significa que las columnas adicionales incluidas serían completamente redundantes si no fuera por el beneficio de "evitar búsquedas de marcadores".
  • INCLUDE las columnas básicamente permiten el mismo beneficio de manera más eficiente.

NB Algo muy importante a destacar. Por lo general, no obtiene ningún beneficio de las INCLUDEcolumnas de sus índices si tiene el hábito perezoso de escribir siempre sus consultas como SELECT * .... Al devolver todas las columnas , básicamente se asegura de que se requiera una búsqueda de marcadores en cualquier caso.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

¿Cuál es la diferencia de la consulta con IN?

¿Cuál es la diferencia entre UseWindowsAzureActiveDirectoryBearerAuthentication con UseOpenIdConnectAuthentication?

¿Cuál es la diferencia entre un hash con => y:

¿Cuál es la diferencia con linkWithCredential y linkWithPopup?

¿Cuál es la diferencia entre || = y | = con booleanos

¿Cuál es la diferencia entre un hash con => y:

CoreData. ¿Cuál es la diferencia entre índices e indexados?

¿Cuál es la diferencia?

¿Cuál es la diferencia?

¿Cuál es la diferencia?

¿Cuál es la diferencia?

¿Cuál es la diferencia?

En ggplot2, ¿cuál es la diferencia entre las asignaciones estéticas incluidas en la función ggplot y la primera función geom?

LibGDX: ¿Cuál es la diferencia entre dibujar con Sprite y dibujar con SpriteBatch?

¿Cuál es la diferencia entre inicializar con = e inicializar con {}?

¿Cuál es la diferencia entre el uso de operadores & vs MOD para calcular índices (implementación de tabla hash)?

¿Cuál es la diferencia entre func con paréntesis y uno sin él?

¿Cuál es la diferencia entre findBy con guión bajo y findBy sin él?

¿Cuál es la diferencia entre la compatibilidad con Android TensorFlow y TensorFlow Lite para Android?

¿Cuál es la diferencia entre usar o no usar la cláusula 'where' con genéricos?

¿Cuál es la diferencia entre acceder a la relación directamente y usar con en Laravel?

ksql ¿cuál es la diferencia entre la clave principal y con KEY?

¿Cuál es la diferencia entre ö y ö?

¿Cuál es la diferencia entre / * ... * / y / ** ... * /

¿Cuál es la diferencia entre + = y = +?

¿Cuál es la diferencia entre $ * y $ @

¿Cuál es la diferencia entre {} ()) y {}) ()

¿Cuál es la diferencia entre '$ (this)' y 'this'?

¿Cuál es la diferencia entre # {} $ {} y% {}?

TOP Lista

  1. 1

    ¿Cómo ocultar la aplicación web de los robots de búsqueda? (ASP.NET)

  2. 2

    Pandas의 CSV 파일을 Pandas 데이터 프레임으로 가져 오기

  3. 3

    uitableview delete button image in iOS

  4. 4

    Manera correcta de agregar referencias al proyecto C # de modo que sean compatibles con el control de versiones

  5. 5

    Swift / Firebase : Facebook 사용자가 계정을 만들 때 Firebase 데이터베이스에 제대로 저장하려면 어떻게해야합니까?

  6. 6

    caída condicional de filas desde un marco de datos de pandas

  7. 7

    Link library in Visual Studio, why two different ways?

  8. 8

    Pagination class not getting applied in html

  9. 9

    Que signifie Decimal (-1)?

  10. 10

    UIButton textLabel with different fonts

  11. 11

    WPF pleine largeur DataGridColumn sur la largeur de DataGrid

  12. 12

    Opción de máquina virtual no reconocida 'MaxPermSize = 512m' cuando se ejecuta Zeppelin

  13. 13

    matplotlib로 그래프를 그리는 동안 커서 위치에서 날짜 / 시간을 볼 수 없습니다. "DateFormatter에서 x = 0 값을 찾았습니다"라는 오류가 발생합니다.

  14. 14

    ¿Es posible en Windows evitar que otras aplicaciones se enganchen en las DLL del sistema?

  15. 15

    Error de la base de datos de Android Firebase: Permiso denegado al depurar en un teléfono

  16. 16

    Pandas: suma filas de DataFrame para columnas dadas

  17. 17

    ggplot2: gráfico con líneas y puntos para problemas de leyenda de dos conjuntos de datos

  18. 18

    ¿Cómo especificar el puerto en el que se aloja una aplicación ASP.NET Core?

  19. 19

    Recherche de la position d'index d'une valeur dans r dataframe

  20. 20

    GPU를 사용하여 ffmpeg 필터의 처리 속도를 가속화하는 방법은 무엇입니까?

  21. 21

    nested observables executed one after the other after termination

CalienteEtiquetas

Archivo