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