2017-03-23 241 views
0

使用SQL Server 2008 R2,以下选择在3秒内使用IN和20分钟在NOT IN中工作。在SQL Server 2012上执行相同的选择,IN和NOT IN都需要3秒钟。有没有人有过这种情况发生过,如果有的话,是否有不同的查询可以减少这种延迟?SQL查询选择,执行超时

背景:总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] + '%') 

您的帮助将不胜感激。

+0

尝试使用存在而不是IN /不在 –

回答

0

您可以通过sp_configure增加你的执行时间了。

获取更多信息,您可以Read this

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. 使用exists或在主not exists那里,在我的例子中,我使用exists但您可以将其更改为not exists,这将比您的曲线更快ERY,试试吧

代码:

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]+'%') 
0

感谢您的答复,不胜感激。已排序。 我在NOT IN条件下没有正确地计入NULL。在SQL2012中使用NOT IN是可以的,但在SQL2008R2中不起作用。 要解决我做了一个LEFT JOIN ... ON ... WHERE ... IS NULL。 这个伎俩。

再次感谢您的回复。

BMV