我有一个查询,用来从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'发布于 2013-03-20 23:09:03
子查询看起来很可疑,您冒着对tableA中的每一行都进行表扫描的风险。您也只需要一个查询,并且无论如何都不应该将该变量重用于其他东西。
确保Codename、Tag、Position和Tag索引正确。如果“up”/“搁置”标签不是很常见,你应该能够通过一个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'https://stackoverflow.com/questions/15525776
复制相似问题