Estoy trabajando en un sistema de informes que requerirá grandes consultas de selección, pero se basa en una base de datos que solo se llena una vez. El sistema de administración de bases de datos es Microsoft SQL Server 2017. Probablemente haya una mejor manera de diseñar un sistema como este, pero abordemos esto teóricamente.
Teóricamente hablando:
- Si tenemos una base de datos muy grande (más de 150 millones de filas en varias tablas)
- Y podemos suponer que la base de datos solo se completará una vez.
¿Podría indexar cada combinación de columna posible tener un impacto negativo en el rendimiento de una consulta de selección?
sql-server
t-sql
index-tuning
sql-server-2017
Desequilibrado
fuente
fuente
Respuestas:
Sí, influirá en el tiempo de compilación del plan inicial ya que el optimizador tendrá muchas rutas de acceso adicionales a los datos a considerar.
Dado que está en SQL Server 2017, cargando una vez y ejecutando informes, ¿por qué no usar un índice de almacén de columnas en su lugar?
Esa parece ser la solución ideal para su necesidad de indexar todas las combinaciones posibles de columnas.
Índices de almacén de columnas: descripción general
fuente
Si tiene N columnas en una tabla, cada combinación de columnas posible es 2 ^ N-1 (eliminando el conjunto vacío). Para 10 columnas que significarían 1023 índices, para 20 columnas terminamos con la friolera de 1048575 índices. La mayoría de los índices nunca se utilizarán, pero el optimizador deberá tenerlos en cuenta. Es posible que el optimizador elija un índice subóptimo en lugar de uno mejor. No tomaría el camino de generar todo tipo de índices, en lugar de tratar de averiguar qué índices serían realmente beneficiosos.
EDITAR el número corregido de índices posibles
Como Jeff señala, es incluso peor que 2 ^ N (conjunto de potencia) ya que (3,2,1) es claramente diferente de (1,2,3). Para N columnas podemos elegir la primera posición en un índice que contiene todas las columnas en N formas. Para la segunda posición en N-1, etc. ¡Por lo tanto, terminamos con N! diferentes índices de tamaño completo. Ninguno de estos índices está incluido en otro índice de este conjunto. Además, no podemos agregar otro índice más corto para que no esté cubierto por ningún índice completo. El número de índices es, por lo tanto, N !. ¡El ejemplo para 10 columnas, por lo tanto, se convierte en 10! = 3628800 índices y para 20 (rollroll) 2432902008176640000 índices. Este es un número ridículamente grande, si ponemos un punto para cada índice un mm por parte, tomará un haz de luz 94 días para pasar todos los puntos. Todos y todas, no ;-)
fuente
No.
No es práctico indexar "todo", pero puede indexar "la mayoría" de él.
Aquí está la cosa. Si una tabla tiene
N
columnas, entonces el número de índices posibles esN!
. Digamos que una tabla tiene 10 columnas, entonces no solo tiene10
índices posibles, sino también10!
. Eso es ... 3,628,800 ... en una sola mesa. Eso es mucho espacio en disco, E / S de disco, caché y tiempos de búsqueda.¿Por qué? Algunas razones:
Los índices de Lightwwight generalmente se almacenan en caché, algo que los hace encenderse rápidamente. Si tiene 3 millones de ellos, NO se almacenarán en caché.
El optimizador de SQL puede tomar mucho tiempo para decidir cuál es mejor usar, especialmente cuando se usan combinaciones.
El optimizador de SQL puede renunciar al uso del algoritmo integral e intentar un algoritmo heurístico. Esto puede ser "menos que óptimo". PostgreSQL, por ejemplo, tiene diferentes opciones para "consultas de tabla de menos de 8" y "consultas de tabla de más de 8".
Se supone que los índices son más ligeros que el montón. Si está indexando todo, entonces el índice se vuelve tan pesado como el montón ... algo que anula el propósito del índice.
fuente
No, probablemente no tendrá un impacto negativo en las
SELECT
consultas, peroINSERT
costos.WHERE
expresiones de condición aún no usarán índices, principalmente las más complejas.fuente