【发布时间】: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
如果我有陈述
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
简单 的答案是没有表访问权限就无法获得执行计划。
执行计划是优化器生成的:它根据索引、统计信息等找出满足查询的最佳方式。
您上面的内容是微不足道的,并且没有表访问权限。为什么需要计划?
编辑:
根据 Lucero 在 cmets 中的示例,派生表是表访问
编辑 2:
“普通”表访问提供持续扫描,而不是真正的扫描或搜索:
SELECT * FROM sys.tables WHERE 1=0【讨论】:
SELECT v.d FROM (SELECT @d d) v;(那里有“表访问”吗?)
SELECT v.d FROM MyDerivedTable v;。
SELECT v.d FROM (VALUES (123)) v(d);
SELECT v.d FROM (VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9)) v(d) WHERE v.d<5;
你的意思是什么会触发执行计划?另外我不明白我包含实际的执行计划并运行此查询,我没有得到执行计划。希望此链接对您有所帮助。
【讨论】:
Ctrl + L查看的计划
我假设每当需要执行基于集合的操作时都会生成一个查询计划。
【讨论】:
SELECT * FROM sys.tables WHERE 1=0 提供恒定扫描而不是表扫描。这是基于 SET 的,但仍然表现得像您的派生表示例
是的,你需要一个 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)">
【讨论】: