1

我有一个查询要从 tableA 中选择一些与 tableB 中的某些行匹配的数据。尽管它的工作原理很慢,但返回几百行大约需要 20 分钟。这是查询,希望您有一些建议可以改进或更改。

我正在使用 SQL Server 2008

DECLARE @MaxDate DATETIME

SELECT @MaxDate = MAX(TimeStamp) -- I know it's not the best column name
FROM tableA
WHERE CodeName IN
(SELECT Tag FROM TableB 
WHERE POSITION = 'UP' AND PLACE = 'Shelf') 

IF @MaxDate > '2011-08-08'
BEGIN

 SELECT @MaxDate = MAX(TimeStamp) -- I know it's not the best column name
FROM tableA
WHERE CodeName IN
(SELECT Tag FROM TableB 
WHERE POSITION = 'UP' AND PLACE = 'Shelf')AND TimeStamp >= '2008-12-24' AND TimeStamp < '2010-12-24'

END
ELSE 
PRINT 'Date out of range'
4

1 回答 1

1

子查询看起来很可疑,您冒着对 tableA 中的每一行进行表扫描的风险。您也只需要一个查询,并且无论如何都不应该将变量重用于其他东西。

确保代号、标签、位置和标签已正确编入索引。如果“up”/“shelf”标签不是很常见,你应该可以通过 tableA 的 table seek 逃脱。

    SELECT
        @MaxDate  = MAX(TimeStamp),
        @MaxDate2 = MAX(                
            CASE WHEN 
                TimeStamp >= '2008-12-24' AND
                TimeStamp < '2010-12-24'
                THEN TimeStamp END)
    FROM
        tableA A
    JOIN
        Tag T ON 
            T.CodeName=A.Tag 
    WHERE   
        T.POSITION = 'UP' AND
        T.PLACE = 'Shelf' 

并对结果做一些适当的事情

IF @MaxDate > '2011-08-08'
BEGIN
    SELECT @MaxDate2
END
ELSE 
PRINT 'Date out of range'
于 2013-03-20T15:09:02.700 回答