【问题标题】:How to optimize SELECT MaxDate如何优化 SELECT MaxDate
【发布时间】:2013-03-20 14:04:19
【问题描述】:

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

【问题讨论】:

  • 可以显示执行计划吗?
  • @Bender 。 . .这些桌子有多大?我怀疑您使用的是视图而不是表,这就是性能问题所在。
  • 您在tableA 上是否有超过(TimeStamp, CodeName) 的覆盖索引? tableB 上的覆盖索引是否超过 (POSITION, PLACE)
  • 这些表真的很大,因为数据每 2 分钟更新一次,这就是为什么我在选择只包含特定条件的情况下进行查询。
  • 你可以试试多快:SELECT YourPrimaryKey, TimeStamp FROM tableA WHERE CodeName IN (SELECT Tag FROM TableB WHERE POSITION = 'UP' AND PLACE = 'Shelf')

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


【解决方案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'

【讨论】:

  • 你说得对,'UP' AND 'Shelf' 并不常见,我猜它之所以这么慢是因为它会检查表中的所有行。
  • 这个查询完成得相当快,但现在我有点困惑,因为我没有得到任何结果,我只收到一条查询成功完成的消息,我应该把剩下的选择查询在这个执行之后?
  • 我猜你应该对你的变量做点什么,试着选择或打印这些值?我添加到答案中。
  • 这个很酷,我接受它作为答案,因为它很有帮助,感谢您的时间
猜你喜欢
  • 2018-05-10
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2016-07-27
  • 2011-12-01
  • 2013-01-03
  • 1970-01-01
  • 2020-05-29
相关资源
最近更新 更多