【问题标题】:SQL Server: what will trigger execution plan?SQL Server:什么会触发执行计划?
【发布时间】:2011-04-10 09:24:14
【问题描述】:

如果我有陈述

DECLARE @i INT;
DECLARE @d NUMERIC(9,3);
SET @i = 123;
SET @d = @i;
SELECT @d;

我包含实际的执行计划并运行此查询,但我没有得到执行计划。只有当批处理中有FROM语句时,查询才会触发执行计划?

【问题讨论】:

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


    【解决方案1】:

    简单 的答案是没有表访问权限就无法获得执行计划。

    执行计划是优化器生成的:它根据索引、统计信息等找出满足查询的最佳方式。

    您上面的内容是微不足道的,并且没有表访问权限。为什么需要计划?

    编辑:

    根据 Lucero 在 cmets 中的示例,派生表是表访问

    编辑 2:

    “普通”表访问提供持续扫描,而不是真正的扫描或搜索:

    • SELECT * FROM sys.tables WHERE 1=0
    • Lucero 在 cmets 中的示例

    【讨论】:

    • 好吧,下面的内容同样简单,但它确实产生了一个查询计划:SELECT v.d FROM (SELECT @d d) v;(那里有“表访问”吗?)
    • @Lucero:是的。是一个派生内联表。所以无论多么微不足道,这都是SELECT v.d FROM MyDerivedTable v;
    • 好的。当我们在做的时候,你知道像这样的值的名称是什么吗? SELECT v.d FROM (VALUES (123)) v(d);
    • @Lucero:一样。请注意,该计划只是“持续扫描”而不是正确的表访问(“索引搜索”等)
    • @gbn,最后一个问题,为什么说持续扫描不是真正的扫描?查询计划给出了一个 9 行的持续扫描和一个过滤器:SELECT v.d FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)) v(d) WHERE v.d<5;
    【解决方案2】:

    你的意思是什么会触发执行计划?另外我不明白我包含实际的执行计划并运行此查询,我没有得到执行计划。希望此链接对您有所帮助。

    1. SQL Tuning Tutorial - Understanding a Database Execution Plan (1)

    【讨论】:

    • 我的意思是,如果我在这个查询中包含执行计划(按 Ctrl+M)并运行这个查询,我看不到这个查询的执行计划。感谢您的链接!
    • 我认为这是因为查询中没有使用数据库对象。但是你可以看到一个估计的执行计划。
    • +1 我要指出的是,它确实会生成一个可以通过Ctrl + L查看的计划
    【解决方案3】:

    我假设每当需要执行基于集合的操作时都会生成一个查询计划。

    【讨论】:

    • 注意:SELECT * FROM sys.tables WHERE 1=0 提供恒定扫描而不是表扫描。这是基于 SET 的,但仍然表现得像您的派生表示例
    • 对。但问题是何时生成执行计划,即使计划中只有一个不断扫描,它仍然是一个执行计划,不是吗?
    【解决方案4】:

    是的,你需要一个 from 子句。

    你可以这样做

    declare @i int
    declare @d numeric(9,3)
    set @i = 123
    
    select @d = @i
    from (select 1) as x(x)
    
    select @d
    

    在执行计划中你会看到这个

    <ScalarOperator ScalarString="CONVERT_IMPLICIT(numeric(9,3),[@i],0)">
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2011-04-12
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多