SQL查询选择,执行超时

时间:2017-03-23 02:37:27

标签: sql sql-server sql-server-2008

使用SQL Server 2008 R2,以下选项在3秒内使用IN,20分钟使用NOT IN。对于IN和NOT IN,在SQL Server 2012上执行相同的选择需要3秒。有没有人之前发生这种情况,如果有的话会有不同的查询来减少这种延迟?

背景:MessageIndentifier记录总数约为9000。 IN返回~1400,NOT IN返回~7600。我正在使用SQL Server 2008 R2。

SELECT 
    AA.[MessageIdentifier]
FROM 
    (SELECT 
         CAST(AD.[Contract Number] AS VARCHAR) + '.' + 
            CAST(AD.[Installation ID] AS VARCHAR) + '.'+ 
            CAST(AD.[System ID] AS VARCHAR) AS MessageIdentifier
     FROM 
         CDCS_FAMS.dbo.SiteParamBaseTable AD) AS AA
WHERE 
    AA.[MessageIdentifier] IN (SELECT DISTINCT AB.[MessageIdentifier]
                               FROM 
                                   (SELECT cast(AC.[Contract Number] as varchar) + '.' + cast(AC.[Installation ID] as varchar) + '.'+ cast(AC.[System ID] as varchar) AS MessageIdentifier
                                    FROM CDCS_FAMS.dbo.SiteParamBaseTable AC) AS AB,
                                   CDCS_FAMS.dbo.EventTable as DA
                               WHERE 
                                  (DA.[Message] LIKE '%ISO MODE:%' 
                                   OR DA.[Message] LIKE '%TEST MODE:%') 
                                  AND DA.[Message] LIKE '%Alarm%' 
                                  AND DA.[Event time] > DATEADD(DAY,-10, GETDATE())
                                  AND DA.[Message] LIKE '%' + AB.[MessageIdentifier] + '%')

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您可以按sp_configure增加执行时间。

您可以Read this

了解更多信息

答案 1 :(得分:0)

  1. 您的第二个查询

    SELECT 
        cast(AC.[Contract Number] as varchar) + '.' + cast(AC.[Installation ID] as varchar) + '.'+ cast(AC.[System ID] as varchar) AS MessageIdentifier
    FROM 
        CDCS_FAMS.dbo.SiteParamBaseTable AC
    

    过剩

  2. 在您的主要地方使用existsnot exists,在我的示例中我使用exists,但您可以将其更改为not exists,这样会更快比你的查询,试试

  3. 代码:

    SELECT AA.[MessageIdentifier]
    FROM 
        (SELECT 
             cast(AD.[Contract Number] as varchar) + '.' + cast(AD.[Installation ID] as varchar) + '.'+ cast(AD.[System ID] as varchar) AS MessageIdentifier
         FROM 
             CDCS_FAMS.dbo.SiteParamBaseTable AD) AS AA
         WHERE 
             EXISTS (SELECT 1
                     FROM CDCS_FAMS.dbo.EventTable as DA
                     WHERE (DA.[Message] like '%ISO MODE:%' or DA.[Message] like '%TEST MODE:%') 
                       AND DA.[Message] like '%Alarm%' 
                       AND DA.[Event time] > DATEADD(DAY,-10,GETDATE())
                       AND DA.[Message] like '%'+AA.[MessageIdentifier]+'%')
    

答案 2 :(得分:0)

感谢您的回复,非常感谢。已经排序。 我在NOT IN条件下没有正确计算NULL。使用带有SQL2012的NOT IN是可以的,但在SQL2008R2中没有相同的功能。 为了解决这个问题,我做了LEFT JOIN ...... ON ... WHERE ... IS NULL。 这就行了。

再次感谢您的回复。

BMV