2013-01-15 83 views
0

现在我有这个,它检索16K左右的记录:我怎样才能优化这个SQL查询?

DECLARE @LINE_ID INT 
SET @LINE_ID = 37 
SELECT 
    a.eventType as 'evento', 
    a.tipo as 'tipo', 
    a.nroSoldadura as 'nro soldadura', 
    a.cuentaOdometrica as 'Distancia Absoluta [m]', 
    a.x as 'x', 
    a.y as 'y', 
    a.z as 'z', 
    a.zonaGeografica as 'Zona geografica', 
    a.orientacionSoldadura as 'orientacion', 
    a.prof * 100 as 'prof maxima [%]', 
    a.longitud as 'long. [mm]', 
    a.ancho as 'ancho [mm]', 
    a.IntExt as 'INT o EXT', 
    a.cluster as 'Cluster', 
    a.espesorPared as 'espesor de pared nominal', 
    a.longitudEfectiva as 'longitud efectiva', 
    a.anchoEfectivo as 'Ancho efectivo', 
    a.areaEfectiva as 'Area efectiva', 
    a.factorSeguridad as 'Factor de seguridad', 
    a.MAOP as 'MAOP (kPa)', 
    a.ruptura as 'Ruptura 0.85dL (kPa)', 
    a.FER as 'FER', 
    NULL as 'Diametro maximo', 
    NULL as 'Diametro minimo', 
    NULL as 'Ovalizacion', 
    NULL as 'Ovalizacion axial', 
    a.orientacionSoldadura as 'Orientacion soldadura', 
    a.velocidadHerramienta as 'Velc Herr', 
    a.comentarios as 'comentarios' 
FROM ILI_IMPORT_MFL as a 
JOIN ILI_INSPECTION as b ON a.ILI_INSPECTION_ID = b.ILI_INSPECTION_ID 
WHERE 
    a.ID IN (
     SELECT TOP 1 c.ID 
     FROM ILI_IMPORT_MFL as c 
     JOIN ILI_INSPECTION as d ON c.ILI_INSPECTION_ID = d.ILI_INSPECTION_ID 
     WHERE a.nroSoldadura = c.nroSoldadura 
      AND d.LINE_ID = @LINE_ID 
     ORDER BY d.BEGIN_DATE 
    ) 
    AND b.LINE_ID = @LINE_ID 
ORDER BY a.nroSoldadura, b.BEGIN_DATE 

的和ILI_IMPORT_MFL之间的连接ILI_INSPECTION是存在的,因为ILI_INSPECTION包含日期和线路ID,我需要。
现在这个查询大约需要6分钟才能执行,因为子查询。子查询在那里,因为每个nroSoldadura可能有多于一行,而我只想要它们中最老的一行。

我正在使用SQL Server 2008.
我该如何解决这个问题?谢谢。

编辑:试图将索引添加到nroSoldadura和BEGIN_DATE列,并将查询时间缩短到30秒。仍然会很高兴看到可能的优化,以学习。

+0

你是否尝试通过数据库引擎优化顾问运行它? – Narnian

回答

1

你可以尝试使用ROW_NUMBER() ... PARTITION BY取代您的子查询:

DECLARE @LINE_ID INT 
SET @LINE_ID = 37 
SELECT 
    a.eventType as 'evento', 
    a.tipo as 'tipo', 
    a.nroSoldadura as 'nro soldadura', 
    a.cuentaOdometrica as 'Distancia Absoluta [m]', 
    a.x as 'x', 
    a.y as 'y', 
    a.z as 'z', 
    a.zonaGeografica as 'Zona geografica', 
    a.orientacionSoldadura as 'orientacion', 
    a.prof * 100 as 'prof maxima [%]', 
    a.longitud as 'long. [mm]', 
    a.ancho as 'ancho [mm]', 
    a.IntExt as 'INT o EXT', 
    a.cluster as 'Cluster', 
    a.espesorPared as 'espesor de pared nominal', 
    a.longitudEfectiva as 'longitud efectiva', 
    a.anchoEfectivo as 'Ancho efectivo', 
    a.areaEfectiva as 'Area efectiva', 
    a.factorSeguridad as 'Factor de seguridad', 
    a.MAOP as 'MAOP (kPa)', 
    a.ruptura as 'Ruptura 0.85dL (kPa)', 
    a.FER as 'FER', 
    NULL as 'Diametro maximo', 
    NULL as 'Diametro minimo', 
    NULL as 'Ovalizacion', 
    NULL as 'Ovalizacion axial', 
    a.orientacionSoldadura as 'Orientacion soldadura', 
    a.velocidadHerramienta as 'Velc Herr', 
    a.comentarios as 'comentarios' 
    ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY d.BEGIN_DATE) As row 
FROM ILI_IMPORT_MFL as a 
JOIN ILI_INSPECTION as b ON a.ILI_INSPECTION_ID = b.ILI_INSPECTION_ID 
WHERE 
    row = 1 
    AND b.LINE_ID = @LINE_ID 
ORDER BY a.nroSoldadura, b.BEGIN_DATE 
+0

+1。 。 。你比我做得更快。 –

0

你想用row_number()这一点。你需要把它放在一个子查询中。我认为这是你想要的:

select * from (
SELECT 
    a.eventType as 'evento', 
    a.tipo as 'tipo', 
    a.nroSoldadura as 'nro soldadura', 
    a.cuentaOdometrica as 'Distancia Absoluta [m]', 
    a.x as 'x', 
    a.y as 'y', 
    a.z as 'z', 
    a.zonaGeografica as 'Zona geografica', 
    a.orientacionSoldadura as 'orientacion', 
    a.prof * 100 as 'prof maxima [%]', 
    a.longitud as 'long. [mm]', 
    a.ancho as 'ancho [mm]', 
    a.IntExt as 'INT o EXT', 
    a.cluster as 'Cluster', 
    a.espesorPared as 'espesor de pared nominal', 
    a.longitudEfectiva as 'longitud efectiva', 
    a.anchoEfectivo as 'Ancho efectivo', 
    a.areaEfectiva as 'Area efectiva', 
    a.factorSeguridad as 'Factor de seguridad', 
    a.MAOP as 'MAOP (kPa)', 
    a.ruptura as 'Ruptura 0.85dL (kPa)', 
    a.FER as 'FER', 
    NULL as 'Diametro maximo', 
    NULL as 'Diametro minimo', 
    NULL as 'Ovalizacion', 
    NULL as 'Ovalizacion axial', 
    a.orientacionSoldadura as 'Orientacion soldadura', 
    a.velocidadHerramienta as 'Velc Herr', 
    a.comentarios as 'comentarios', 
    ROW_NUMBER() over (partition by a.nroSoldadura order by begin_date desc) as seqnum 
FROM ILI_IMPORT_MFL as a 
JOIN ILI_INSPECTION as b ON a.ILI_INSPECTION_ID = b.ILI_INSPECTION_ID 
where b.line_id = @line_id 
) 
where seqnum = 1 
相关问题