使用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] + '%')
非常感谢您的帮助。
答案 0 :(得分:0)
您可以按sp_configure
增加执行时间。
您可以Read this
了解更多信息答案 1 :(得分:0)
您的第二个查询
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
过剩
在您的主要地方使用exists
或not exists
,在我的示例中我使用exists
,但您可以将其更改为not exists
,这样会更快比你的查询,试试
代码:
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