Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何优化选择MaxDate_Sql_Sql Server_Database_Performance_Sql Server 2008 - Fatal编程技术网

Sql 如何优化选择MaxDate

Sql 如何优化选择MaxDate,sql,sql-server,database,performance,sql-server-2008,Sql,Sql Server,Database,Performance,Sql Server 2008,我有一个查询,用于从表a中选择与表B中的某些行相匹配的数据。尽管它工作得很慢,但返回几百行大约需要20分钟。这里是查询,希望你有一些建议在哪里改进或改变什么 我正在使用SQLServer2008 DECLARE @MaxDate DATETIME SELECT @MaxDate = MAX(TimeStamp) -- I know it's not the best column name FROM tableA WHERE CodeName IN (SELECT Tag FROM Table

我有一个查询,用于从表a中选择与表B中的某些行相匹配的数据。尽管它工作得很慢,但返回几百行大约需要20分钟。这里是查询,希望你有一些建议在哪里改进或改变什么

我正在使用SQLServer2008

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'

子查询看起来可疑,您可能会对tableA中的每一行进行表扫描。您还只需要一个查询,并且无论如何都不应该将变量用于其他用途

确保代码名、标记、位置和标记已正确索引。如果up/shelf标签不是非常常见,那么您应该可以通过table seek或table a来摆脱这种情况

    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' 

子查询看起来可疑,您可能会对tableA中的每一行进行表扫描。您还只需要一个查询,并且无论如何都不应该将变量用于其他用途

确保代码名、标记、位置和标记已正确索引。如果up/shelf标签不是非常常见,那么您应该可以通过table seek或table a来摆脱这种情况

    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' 


你能出示执行计划吗?@Bender。这些桌子有多大?我怀疑您使用的是视图而不是表,这就是性能问题所在。您在表a上有覆盖时间戳、代码名的索引吗?表B上的位置、位置是否有覆盖索引?表非常大,因为其中的数据每2分钟更新一次,这就是为什么我要执行一个查询,其中选择仅包括特定条件。您可以尝试:选择您的PrimaryKey,表A中的时间戳,其中表B中的SELECT标记中的代码名,其中位置='UP'和位置='Shelf',您可以显示执行计划吗?@Bender。这些桌子有多大?我怀疑您使用的是视图而不是表,这就是性能问题所在。您在表a上有覆盖时间戳、代码名的索引吗?表B上的位置、位置是否有覆盖索引?表非常大,因为其中的数据每2分钟更新一次,这就是为什么我要执行一个查询,其中选择仅包括特定条件。您可以尝试:选择您的PrimaryKey,来自tableA的时间戳,其中TableB的SELECT标记中的CodeName,其中POSITION='UP'和PLACE='Shelf'你说得对,“UP”和“Shelf”不是很常见,我想它之所以这么慢是因为它检查表中的所有行。这个查询完成得相当快,但现在我有点困惑,因为我没有得到任何结果,我只收到一条消息,表示查询已成功完成,我是否应该在执行此查询后放置其余的select查询?我想您应该对变量做些什么,尝试选择或打印值?我添加了答案。这个答案很酷,我接受它作为答案,因为它很有帮助,谢谢你的时间。你说得对,“UP”和“Shelf”不太常见,我想它之所以这么慢是因为它检查表中的所有行。这个查询完成得很快,但现在我有点困惑,因为我没有得到任何结果,我只收到一条消息,表示查询已成功完成,我是否应该在执行此查询后放置其余的select查询?我想您应该对变量做些什么,尝试选择或打印值?我补充了答案。这个很酷,我接受它作为一个答案,因为它很有帮助,谢谢你的时间