从这个答案中,视图应该提供与直接使用相同查询相同的性能。
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:
您的查询计划不再可见,但是如果您查看计划,您很可能会看到一个三角形抱怨基数估计和/或隐式声明。这意味着您的联接表的键难以猜测。
当您直接从查询中运行时,这是即时的,可能是因为它不需要猜测键的大小是]
例如:
k.Id = 970435
SQLSERVER已经知道它正在寻找970435的6位数字。它可以消除所有以9开头且没有6位数字的键。 :)
但是,在某种程度上,它必须以解决未知数的方式来构建计划。因为它不知道它可能持有什么样的钥匙。
请参阅Microsoft的各种示例和方案,可能会对您有所帮助。