Estoy usando MS SQL y tengo que ejecutar varias consultas en la misma tabla con diferentes criterios. Al principio ejecuté cada consulta en la tabla original, aunque todas comparten algo de filtrado (es decir, Fecha, estado). Esto tomó mucho tiempo (alrededor de 2 minutos).
Hay duplicados en las filas de datos y todos los índices NO ESTÁN AGRUPADOS. Solo estoy interesado en 4 columnas para mis criterios y el resultado debería mostrar solo el recuento, para todas las consultas.
columnas necesarias: TABLE
, FIELD
, AFTER
, DATE
, y hay un índice en cada uno de DATE
y TABLE
.
Después de crear una tabla temporal con solo los campos que necesito, se redujo a 1:40 minutos, lo que sigue siendo muy malo.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Ejecutando esto -> (216598 filas afectadas)
Como no todas las consultas dependen del intervalo de fechas, no lo incluí en la consulta. El problema es que solo lleva más de 1 minuto insertarlo . El inserto anterior tomó 1:19 minutos
Quiero ejecutar algo como esto para varias consultas:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Es un problema con la inserción más que el de la selección, pero la temperatura tiene muchas menos filas que la tabla original, lo que podría ser mejor que recorrer la tabla varias veces.
¿Cómo puedo optimizar esto?
EDITAR
He eliminado el ID de clasificación, pensé que el problema era principalmente con la selección y no con la inserción. Fue una suposición.
No puedo crear un único en ningún índice ya que no hay campos o filas únicos.
Estoy usando SQL Server 2012.
Información de la tabla : es un montón y tiene el siguiente uso de espacio:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, ¿por qué no intenta optimizar cada (consulta) por separado? ¿No está permitido agregar índices a la tabla?
TABLE
y FIELD
de la #temp
tabla (después de todo, todas las filas tienen TABLE = 'OTB' AND FIELD = 'STATUS'
para la tabla temporal específica).
CREATE TABLE
declaración). El voto negativo fue porque la pregunta no estaba clara.