如何优化SELECT MaxDate

时间:2013-03-20 14:04:20

标签: sql sql-server database performance sql-server-2008

我有一个查询来从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'

1 个答案:

答案 0 :(得分:1)

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

确保正确编制代码,标记,位置和标记。如果“up”/“shelf”标签不是非常常见的,那么你应该可以使用tableA的表格查找。

    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'