Tengo una consulta que se está tomando un tiempo muy serio para ejecutar en algo más antiguo que el pasado, por ejemplo, las horas de datos. Esto creará una vista que se utilizará para la minería de datos, por lo que las expectativas son que podría buscar semanas o meses de datos y regresar en un tiempo razonable (incluso un par de minutos está bien ... funcionó para un rango de fechas de 10/3/2011 12:00pm
a 10/3/2011 1:00pm
y tomó 44 minutos!)acelerar SQL Query
El problema es con los dos LEFT OUTER JOIN
s en la parte inferior. Cuando los saco, puede funcionar en unos 10 segundos. Sin embargo, esos son el pan y la mantequilla de esta consulta.
Todo esto proviene de una sola tabla. Lo ÚNICO que esta consulta devuelve de manera diferente a la tabla original es la columna xweb_range
. xweb_range
es una columna de campo calculado (gama), que sólo utilizará los valores de [LO,LC,RO,RC]_Avg
donde su correspondiente [LO,LC,RO,RC]_Sensor_Alarm = 0
(no se incluyen en el cálculo de la distancia si la alarma del sensor = 1)
WITH Alarm (sub_id,
LO_Avg, LO_Sensor_Alarm, LC_Avg, LC_Sensor_Alarm, RO_Avg, RO_Sensor_Alarm, RC_Avg, RC_Sensor_Alarm) AS (
SELECT sub_id, LO_Avg, LO_Sensor_Alarm, LC_Avg, LC_Sensor_Alarm, RO_Avg, RO_Sensor_Alarm, RC_Avg, RC_Sensor_Alarm
FROM dbo.some_table
where sub_id <> '0'
)
, AddRowNumbers AS (
SELECT rowNumber = ROW_NUMBER() OVER (ORDER BY LO_Avg)
, sub_id
, LO_Avg, LO_Sensor_Alarm
, LC_Avg, LC_Sensor_Alarm
, RO_Avg, RO_Sensor_Alarm
, RC_Avg, RC_Sensor_Alarm
FROM Alarm
)
, UnPivotColumns AS (
SELECT rowNumber, value = LO_Avg FROM AddRowNumbers WHERE LO_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, LC_Avg FROM AddRowNumbers WHERE LC_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, RO_Avg FROM AddRowNumbers WHERE RO_Sensor_Alarm = 0
UNION ALL SELECT rowNumber, RC_Avg FROM AddRowNumbers WHERE RC_Sensor_Alarm = 0
)
SELECT rowNumber.sub_id
, cds.equipment_id
, cds.read_time
, cds.LC_Avg
, cds.LC_Dev
, cds.LC_Ref_Gap
, cds.LC_Sensor_Alarm
, cds.LO_Avg
, cds.LO_Dev
, cds.LO_Ref_Gap
, cds.LO_Sensor_Alarm
, cds.RC_Avg
, cds.RC_Dev
, cds.RC_Ref_Gap
, cds.RC_Sensor_Alarm
, cds.RO_Avg
, cds.RO_Dev
, cds.RO_Ref_Gap
, cds.RO_Sensor_Alarm
, COALESCE(range1.range, range2.range) AS xweb_range
FROM AddRowNumbers rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = MAX(value) - MIN(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) > 1) range1 ON range1.rowNumber = rowNumber.rowNumber
LEFT OUTER JOIN (SELECT rowNumber, range = AVG(value) FROM UnPivotColumns GROUP BY rowNumber HAVING COUNT(*) = 1) range2 ON range2.rowNumber = rowNumber.rowNumber
INNER JOIN dbo.some_table cds
ON rowNumber.sub_id = cds.sub_id
creo que esto es una cuestión aceptable. Sin embargo, debe publicar su esquema de tabla e información sobre los índices que ha configurado. – jadarnel27
La primera pregunta más obvia: ** ¿Hay un índice en 'Rownumber INCLUDE (value)'? ** – JNK
Además, sabes que 'CTE's son solo vistas desechables, ¿no? No hay beneficio de rendimiento? Básicamente tiene 3 niveles de vistas anidadas que está agregando aquí ... – JNK