从该SO答案中,视图应提供与直接使用相同查询相同的性能。
Is querying over a view slower than executing SQL directly?
我认为这是不正确的。
此查询以视图为目标
SELECT
*
FROM
[Front].[vw_Details] k
WHERE
k.Id = 970435
需要10秒才能完成。从视图复制查询并向其中添加WHERE k.Id = 970435
不到1秒即可完成。该视图没什么特别的,它有4个LEFT JOIN
和一些CASE
指令来清理数据。
我如何找出问题所在,或者需要什么完成该问题才能使之负责?
更新1:
答案 0 :(得分:1)
您的查询计划不再可见,但是如果您查看计划,您很可能会看到一个三角形抱怨基数估计和/或隐式声明。这意味着您以一种难以猜测SQL引擎键的方式连接表。
当您直接从查询中运行时,这是即时的,可能是因为它不需要猜测密钥的大小是
例如:
k.Id = 970435
SQLSERVER已经知道它正在寻找970435的6位数字。 它可以消除所有以9开头且没有6位数字的键。 :)
但是,从某种角度来说,它必须以解决未知的方式来构建计划。因为它不知道它可能持有什么样的钥匙。
有关可以帮助您的各种示例和方案,请参阅Microsoft。