2017-03-23 197 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