Jen*_*nsB 6 t-sql sql-server sql-server-2014
从这个 SO 答案来看,视图应该提供与直接使用相同查询相同的性能。
我有一个观点,这是不正确的。
此查询针对视图
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:
您的查询计划不再可见,但如果您查看该计划,您很可能会看到一个三角形,抱怨基数估计和/或隐式声明。这意味着您以 SQL 引擎很难猜测键的方式连接表。
当您直接从查询运行时,它是即时的,可能是因为它不需要猜测密钥的大小
例如:
k.Id = 970435
Run Code Online (Sandbox Code Playgroud)
SQLSERVER 已经知道它正在寻找 970435 一个 6 位数字。它可以消除所有不以9开头且不包含6位数字的密钥。:)
然而,从某种角度来看,它必须以一种考虑到未知因素的方式制定计划。因为它不知道它可能持有什么样的密钥。
请参阅 Microsoft 以获取可能对您有帮助的各种示例和场景。
如果您总是寻找 int,一种解决方法是使用强制转换或转换子句强制该类型。根据您的数据,这可能会导致性能损失,但这是工具箱中的一个技巧,可以告诉 sql 不要尝试将查询计划设置为 varchar(max) 或类似的内容。
SELECT *
FROM [Front].[vw_Details] k
WHERE TRY_CONVERT(INT,k.Id) = 970435
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2408 次 |
| 最近记录: |