【问题标题】:Execution plan over query with temp tables使用临时表查询的执行计划
【发布时间】:2012-02-08 00:32:01
【问题描述】:

我有一个执行如下操作的存储过程:

SELECT Id
INTO #temp
FROM table
WHERE ...

DELETE FROM #temp
INNER JOIN table2 ON a=b
WHERE ...

但它运行缓慢。当我尝试查看执行计划时,我无法查看,因为 SQL Server Management Studio 显示“消息 208,级别 16,状态 0,第 31 行无效的对象名称 '#temp'。”

有没有办法查看此类脚本的执行计划(或执行细节(不是计划))?

【问题讨论】:

标签: sql-server sql-server-2008-r2 sql-execution-plan


【解决方案1】:

我只是先选择了“select into”子句,然后按 F5 执行它。这创建了 tmp 表。

然后我选择了其余的查询并单击“显示计划”(或按 Ctrl+L)。

【讨论】:

    【解决方案2】:

    SET SHOWPLAN_TEXT ON(或点击显示估计的执行计划是 SSMS)创建一个计划而不是执行 SQL

    因为这会创建#temp

    SELECT Id
    INTO #temp
    FROM table
    WHERE ...
    

    这会失败

    DELETE FROM #temp
    INNER JOIN table2 ON a=b
    WHERE ...
    

    因此解决方案是将其添加到顶部(或通过 SSMS 执行等效操作)

    SET SHOWPLAN_TEXT OFF
    GO
    
    SET STATISTICS PROFILE ON
    GO
    

    【讨论】:

      【解决方案3】:

      您可以在运行查询之前使用此语句

         SET STATISTICS PROFILE ON
         SELECT Id
         INTO #temp
         FROM table
         WHERE ...
      
         DELETE FROM #temp
        INNER JOIN table2 ON a=b
        WHERE ...
      

      【讨论】:

        【解决方案4】:

        它应该可以让您看到第一条语句的估计执行计划。

        对于第二条语句,您需要首先创建并填充 #temp 表(填充很重要,它会向您显示将用于正确行数的计划)。

        (或者,如果您不是特别想查看估计的计划,当然也可以在 SSMS 中打开“包括实际执行计划”选项并运行整个过程)

        【讨论】:

          【解决方案5】:

          用于生成估计执行计划的优化器不执行 T-SQL。它确实通过 algebrizer 运行语句,前面概述的过程负责验证数据库对象的名称。

          由于查询尚未执行,临时表还不存在。这是错误的原因。


          解决此问题(并测试执行计划)的一种方法是在之前创建#temp 表并在存储过程中创建insert into 而不是select ... into

          【讨论】:

            猜你喜欢
            • 2022-01-26
            • 1970-01-01
            • 2012-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-30
            • 1970-01-01
            相关资源
            最近更新 更多