SQL Server:查看比单独查询慢得多

Jen*_*nsB 6 t-sql sql-server sql-server-2014

从这个 SO 答案来看,视图应该提供与直接使用相同查询相同的性能。

查询视图比直接执行 SQL 慢吗?

我有一个观点,这是不正确的。

此查询针对视图

SELECT 
    * 
FROM 
    [Front].[vw_Details] k
WHERE 
    k.Id = 970435
Run Code Online (Sandbox Code Playgroud)

需要 10 秒才能完成。从视图复制查询并将其添加WHERE k.Id = 970435到其中的操作不到 1 秒即可完成。视图没什么特别的,4LEFT JOIN秒,还有一些CASE清理数据的指令。

我怎样才能弄清楚问题是什么,或者我需要用什么来完成这个问题才能回答这个问题?

更新 1:

e-F*_*gus 7

您的查询计划不再可见,但如果您查看该计划,您很可能会看到一个三角形,抱怨基数估计和/或隐式声明。这意味着您以 SQL 引擎很难猜测键的方式连接表。

当您直接从查询运行时,它是即时的,可能是因为它不需要猜测密钥的大小

例如:

k.Id = 970435 
Run Code Online (Sandbox Code Playgroud)

SQLSERVER 已经知道它正在寻找 970435 一个 6 位数字。它可以消除所有不以9开头且不包含6位数字的密钥。:)

然而,从某种角度来看,它必须以一种考虑到未知因素的方式制定计划。因为它不知道它可能持有什么样的密钥。

请参阅 Microsoft 以获取可能对您有帮助的各种示例和场景。

https://learn.microsoft.com/en-us/sql/relational-databases/query-processing-architecture-guide?view=sql-server-ver15

如果您总是寻找 int,一种解决方法是使用强制转换或转换子句强制该类型。根据您的数据,这可能会导致性能损失,但这是工具箱中的一个技巧,可以告诉 sql 不要尝试将查询计划设置为 varchar(max) 或类似的内容。

SELECT * 
FROM  [Front].[vw_Details] k
WHERE TRY_CONVERT(INT,k.Id) = 970435
Run Code Online (Sandbox Code Playgroud)