Índices de almacén de columnas en clúster y claves externas


18

Estoy ajustando el rendimiento de un almacén de datos usando índices. Soy bastante nuevo en SQL Server 2014. Microsoft describe lo siguiente:

"Vemos el índice de almacén de columnas en clúster como el estándar para almacenar grandes tablas de hechos de almacenamiento de datos, y esperamos que se use en la mayoría de los escenarios de almacenamiento de datos. Dado que el índice de almacén de columnas en clúster es actualizable, su carga de trabajo puede realizar una gran cantidad de inserción, actualización, y eliminar operaciones ". http://msdn.microsoft.com/en-us/library/gg492088.aspx

Sin embargo, si sigue leyendo la documentación, encontrará limitaciones y restricciones:

"No puede tener restricciones únicas, restricciones de clave principal o restricciones de clave externa".

Esto me confunde mucho! Es una buena práctica (no obligatoria) tener claves externas en el almacén de datos por una variedad de razones (integridad de datos, relaciones visibles para la capa semántica ...)

Por lo tanto, Microsoft aboga por los índices de almacén de columnas agrupados para escenarios de almacenamiento de datos; sin embargo, ¿no puede manejar relaciones de claves externas?

¿Estoy en lo correcto en esto? ¿Qué otros enfoques recomendarías? En el pasado, he usado un índice de almacén de columnas no agrupado en escenarios de almacenamiento de datos, con caída y reconstrucción para cargas de datos. Sin embargo, SQL Server 2014 no agrega ningún valor real nuevo para los almacenes de datos.


A medida que la característica madure, verá que cada vez se admitirán más de estas características (¡diablos, en 2012, los índices del almacén de columnas eran de solo lectura!). Mientras tanto, se le ofrece una compensación: un gran rendimiento con limitaciones, o el mismo de siempre. Tampoco creo que pretendan que eso signifique que cada tabla en su DW debería tener índices de almacén de columnas agrupados y que ninguna tabla debería tener restricciones; probablemente haya un número limitado de tablas en cualquier DW que le brinde una gran explosión para el dólar.
Aaron Bertrand

3
Cuidado, puede manejar uniones. Una relación FK no es necesaria para una unión. Está allí para manejar la integridad referencial, lo cual es bueno tener pero en un almacén de datos PUEDE omitirse. A riesgo, sí, pero también con un aumento de rendimiento.
TomTom

8
Además, "¿no hay un nuevo valor real"? ¿Quieres decir que escribir y agrupar no te parece una mejora? ¿Hacer que los usuarios puedan consultar datos en tiempo real en lugar de esperar una caída y reconstruir para obtener datos más actuales no parece algo bueno para sus usuarios y menos mantenimiento para usted? encogimiento de hombros
Aaron Bertrand

Puede tener índices (únicos) creando una vista indizada. Parece que la infraestructura para el mantenimiento del índice ya está allí. Es solo que los índices normales no están (todavía) implementados.
Usr

@AaronBertrand En un escenario DWH con tablas de hechos con claves externas, el índice Clumtered Columnstore no funciona. Esto en gran contraste con Microsoft espera que esto sea el estándar para almacenar grandes tablas de hechos. Espero que puedas demostrar que estoy equivocado ... Porque me gusta SQL Server.
OverflowStack

Respuestas:


13

Tienes muchas preguntas aquí:

P: (La falta de claves foráneas) me confunde mucho. Es una buena práctica (no obligatoria) tener Fk's en el DWH por una variedad de razones (integridad de datos, relaciones visibles para la capa semántica, ...)

R: Correcto, normalmente es una buena práctica tener claves foráneas en un almacén de datos. Sin embargo, los índices de almacén de columnas agrupados aún no lo admiten.

P: Por lo tanto, MS aboga por los índices de almacén de Columna agrupada para escenarios DWH. ¡Sin embargo, no puede manejar las relaciones FK?

A: Microsoft te da herramientas. Depende de usted cómo usa esas herramientas.

Si su mayor desafío es la falta de integridad de datos en su almacén de datos, entonces la herramienta que desea son las tablas convencionales con claves foráneas.

Si su mayor desafío es el rendimiento de las consultas, y está dispuesto a verificar su propia integridad de datos como parte del proceso de carga, entonces la herramienta que desea son los índices de almacén de columnas agrupados.

P: ¿Sin embargo, SQL 2014 no agrega ningún valor real nuevo para DWH?

R: Afortunadamente, el almacén de columnas en clúster no fue la única característica nueva en SQL Server 2014. Por ejemplo, consulte el nuevo estimador de cardinalidad.

P: ¿Por qué estoy tan enojado y amargado por la forma en que se implementó mi función favorita?

R: Me atrapaste, realmente no hiciste esa pregunta, pero la responderé de todos modos. Bienvenido al mundo del software de terceros, donde no todo está construido de acuerdo con sus especificaciones exactas. Si le apasiona un cambio que le gustaría ver en un producto de Microsoft, consulte Connect.Microsoft.com . Es su proceso de comentarios donde puede enviar un cambio, otras personas pueden votarlo, y luego el equipo del producto lo lee y le dice por qué no lo implementarán. A veces. La mayoría de las veces simplemente lo marcan como "no se arregla, funciona en mi máquina" pero bueno, a veces obtienes algunas respuestas.


"Correcto, normalmente es una buena práctica tener claves externas en un almacén de datos" -> SQLCAT - Las 10 mejores prácticas para construir un almacén de datos relacionales a gran escala ... "Crear índices no agrupados para cada clave externa". -> Nada sobre hacer cumplir la relación FK mencionada en el enlace, y el no CI es redundante debido al almacén de columnas, por lo que no señalaría la necesidad de FK en la tabla de hechos, ¿estaría de acuerdo? Interesado en tus pensamientos sobre esto.
Adrian Torrie

1
... y para dimensiones: "Evite forzar relaciones de clave externa entre el hecho y las tablas de dimensiones, para permitir cargas de datos más rápidas. Puede crear restricciones de clave externa con NOCHECK para documentar las relaciones; pero no las haga cumplir. Asegure la integridad de los datos a través de Transformar búsquedas, o realizar las verificaciones de integridad de datos en la fuente de los datos "
Adrian Torrie

6

Puedo entender que sientes que faltan algunas piezas a las que estás acostumbrado. Pero eso es solo porque faltan.

Sin embargo, SQL Server se estaba utilizando con éxito cuando las claves externas eran solo un concepto (que implementamos a través de desencadenantes en esos días), no una implementación física como una restricción. La integridad referencial declarativa estaba allí al menos por SQL Server 7.0, pero mucho más débil que la implementación actual.

En cuanto al valor del índice ColumnStore agrupado, proporciona un índice y las filas son actualizables. Puede encontrar valiosa esta discusión: http://sqlwithmanoj.com/2014/07/24/maintaining-uniqueness-with-clustered-columnstore-index-sql-server-2014/

Manoj señala que hay una manera de crear una Vista indexada / materializada en la parte superior de esta tabla, con Clustering Key como PK (primera columna de la tabla / vista). Si eso le conviene, por supuesto, es una decisión que debe tomar.

Pero, como comentaron Aaron Bertrand y TomTom, se trata de un mejor rendimiento. Si puede manejar los otros problemas que le preocupan (y creo que son manejables), obtendrá bastantes beneficios. Por lo tanto, use ColumnStore para lo que puede hacer y administre las características que faltan usted mismo.


2

Esta pregunta se refiere a SQL 2014, pero quiero proporcionar información adicional a la luz de los cambios realizados en SQL 2016 en los índices de almacén de columnas, ya que puede ser difícil resolver las limitaciones en diferentes versiones y esta pregunta aún es bastante alta en Google:

Para SQL 2016, Microsoft describe un método para usar índices btree no agrupados (que ahora se pueden agregar como índices secundarios en una tabla de almacén de columnas en clúster) para aplicar restricciones de clave externa, siempre que la restricción se agregue antes del índice de almacén de columnas: https: // docs .microsoft.com / es-es / sql / relational-database / indexes / columnastore-indexes-design-guide

Niko Neugebauer también tiene una publicación de blog sobre esto; En realidad, es posible crear restricciones únicas / externas en las tablas del almacén de columnas (he estado aplicando este enfoque en mi trabajo): http://www.nikoport.com/2015/09/15/columnstore-indexes-part-66- more-clustered-columnastore-mejoras-en-sql-server-2016 /

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.