简体   繁体   English

优化SQL SERVER 2005查询

[英]Optimizing SQL SERVER 2005 query

Good morning, 早上好,

I got this part of a SQL query: 我得到了SQL查询的这一部分:

WITH HC AS (
    SELECT Dia, Mes, Anyo, Hora, Energia AS HidroConv 
    FROM Calendar 
    LEFT OUTER JOIN OMP_PDBC_STOTA O 
        ON Calendar.Y = O.Anyo AND Calendar.M = O.Mes 
        AND Calendar.D = O.Dia AND Calendar.H = O.Hora 
    WHERE (Codigo = 1) AND Calendar.dt BETWEEN '12/31/2013' AND '01/01/2014')

SELECT Calendar.dt AS Fecha, Calendar.Y, Calendar.M, Calendar.D, Calendar.H, 
       HC.HidroConv
FROM Calendar 
LEFT OUTER JOIN HC 
     ON Calendar.Y = HC.Anyo AND Calendar.M = HC.Mes 
     AND Calendar.D = HC.Dia AND Calendar.H = HC.Hora 
WHERE dt BETWEEN '12/31/2013' AND '01/01/2014' 
ORDER by dt, h

On the WITH part, I have got another 12 queries. 在WITH部分,我还有另外12个查询。 Then, on the SELECT part, I retrieve one column per SELECT on the WITH part. 然后,在SELECT部分​​,我在WITH部分的每个SELECT检索一列。 On the FROM part, there is a LEFT OUTER JOIN for each one of them, always having Calendar on the left side of the join. 在“ FROM”部分,每个成员都有一个“左外部”联接,在联接的左侧始终具有“日历”。

The execution of this big query is taking more than 2 minutes, and I desperately need to reduce that time to, maybe 15 seconds or less. 这个大查询的执行耗时超过2分钟,而我非常需要将时间减少到15秒或更短。 Some of the tables, like OMP_PDBC_STOTA have 3 million rows. 其中一些表(例如OMP_PDBC_STOTA)具有300万行。

Do you have any idea about how to optimize this query?? 您对如何优化此查询有任何想法吗?

Thank you so much for your help. 非常感谢你的帮助。

Ricardo 里卡多

Does this query give the same output ? 此查询是否提供相同的输出?

SELECT Calendar.dt AS Fecha, Calendar.Y, Calendar.M, Calendar.D, Calendar.H, Energia AS HidroConv
FROM Calendar 
    LEFT OUTER JOIN OMP_PDBC_STOTA O 
        ON Calendar.Y = O.Anyo AND Calendar.M = O.Mes 
        AND Calendar.D = O.Dia AND Calendar.H = O.Hora 
WHERE  
    Calendar.dt BETWEEN '12/31/2013' AND '01/01/2014' 
    AND Codigo = 1
ORDER by dt, h

If so, it will be faster, tell me if i'm wrong i'll help you. 如果是这样,它会更快,请告诉我如果我错了,我会帮助您。

I found out I don't really need Calendar to get to the same results. 我发现我并不需要日历来获得相同的结果。

What do you think about this way of doing it? 您如何看待这种做法?

SELECT  anyo, mes, dia, hora, Energia AS HidroConv
FROM OMP_PDBC_STOTA
WHERE  
    CAST(CAST(mes AS VARCHAR) + '/' + CAST(dia AS VARCHAR) + '/' + CAST(anyo AS VARCHAR) as datetime) BETWEEN '12/31/2013' AND '01/01/2014' 
    AND Codigo = 1
ORDER by mes,dia, hora

Can't find a proper way of converting the smallints (mes,dia,anyo) to a datetime though. 虽然找不到将smallints(mes,dia,anyo)转换为日期时间的正确方法。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM