Extendiendo @gbn's la respuesta.
Para una tabla de este tamaño, definitivamente necesita un índice que cubra todas las columnas seleccionadas.
Sin embargo, para cada columna debe decidir si desea que sea una columna clave o una columna incluida en el índice.
Para ello, ejecute esta consulta:
SELECT SUM(CASE D1 WHEN 8 THEN 0 ELSE 1 END)/COUNT(*) AS D1Card,
SUM(CASE D2 WHEN 2 THEN 0 ELSE 1 END)/COUNT(*)/COUNT(DISTINCT D2) AS D2Card,
SUM(CASE D3 WHEN 5 THEN 0 ELSE 1 END)/COUNT(*)/COUNT(DISTINCT D3) AS D3Card,
SUM(CASE d4 WHEN 8 THEN 1 ELSE 0 END)/COUNT(DISTINCT D4) AS D4Card,
SUM(CASE d5 WHEN 2 THEN 1 ELSE 0 END)/COUNT(DISTINCT D5) AS D5Card,
SUM(CASE d6 WHEN 5 THEN 1 ELSE 0 END)/COUNT(DISTINCT D6) AS D6Card,
SUM(CASE d7 WHEN 5 THEN 1 ELSE 0 END)/COUNT(DISTINCT D7) AS D7Card,
SUM(CASE d8 WHEN 3 THEN 1 ELSE 0 END)/COUNT(DISTINCT D8) AS D8Card,
SUM(CASE d9 WHEN 4 THEN 1 ELSE 0 END)/COUNT(DISTINCT D9) AS D9Card,
SUM(CASE a WHEN 0 THEN 1 ELSE 0 END)/COUNT(DISTINCT A) AS ACard,
SUM(CASE Hb WHEN 0 THEN 1 ELSE 0 END)/COUNT(DISTINCT Hb) AS HbCard
FROM Mytable
Debe crear una lista de las columnas selectivas menos avanzados (aquellos con los más altos valores de *Card
), que (junto) comprenden más de 25%
de sus registros.
Say, el gráfico de la selectividad de las columnas es el siguiente:
Column Selectivity Cumulative selectivity
D4 0.96 0.96
D8 0.87 0.84
D9 0.85 0.70
D7 0.72 0.51
D6 0.65 0.33 -- here
D5 0.20 0.07
A 0.02 0.00
Hb 0.01 0.00
Esto significa que las condiciones en las columnas d4, d8, d9, d7, d6
juntos coinciden sobre 33%
de sus registros.
En este caso, no hay necesidad de usarlos como columnas clave. Debe crear un índice en las otras columnas selectivas e incluir las no selectivas en el índice.
CREATE INDEX ix_mytable_filter ON (Hb, A, D5) INLCUDE (D1, D2, D3, D4, D6, D7, D8, D9)
Las columnas con el filtro no igualdad siempre van a la sección INCLUDE
.
Tenga en cuenta que solo mejorará la consulta actual, con los valores dados de los filtros. Si sus filtros son arbitrarios, deberá usar todas las columnas con filtro de igualdad como las claves del índice.
También puede ser que las condiciones como [D1] <> 8
involucren números mágicos, y hay pocos registros que cumplan esta condición.
En este caso, se puede añadir una columna calculada en la definición de la tabla:
ALTER TABLE mytable ADD d1_ne_8 AS CASE D1 WHEN 8 THEN 0 ELSE 1 END
y añadir esta expresión para el índice (con respecto a las reglas anteriores).
Si hace esto, tendrá que usar d1_ne_8 = 1
en lugar de d1 <> 8
.
¿Qué proporción de filas tiene hb = 0 y Dx igual a cada número? – Mark
¿Cuál es la distribución de valores para las columnas? ¿Los valores se actualizan con frecuencia? ¿Alguna de las columnas (además de la columna de ID) tiene valores incrementales (y, por lo tanto, será candidata para un índice agrupado)? ¿Hay algún patrón en la forma de consultar los datos? Si pudieras darnos alguna información de dominio, eso también nos ayudaría a darte una respuesta. –
La tabla está ordenada por d1, d2, d3, ...- d9 ejemplo: primera fila - de d1 a d9: 1, 1, 1, 1, 1, 1, 1, 1. Segunda fila: 1, 1, 1, 1, 1, 1, 1, 1, 2. ... y así sucesivamente ... en este momento, el índice agrupado es ID. La tabla nunca actualizará – Shay