【发布时间】:2018-12-10 02:15:55
【问题描述】:
从这个 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 JOINs,还有几个CASE 指令来清理数据。
我怎样才能弄清楚问题是什么,或者我需要用什么来完成这个问题才能回答这个问题?
更新 1:
- SQL Server 版本:12.0.4436.0
- 视图查询计划:https://pastebin.com/RY40Ab0k
- 选择查询计划:https://pastebin.com/gwahhgpu
【问题讨论】:
-
第 1 步是查询计划。性能很多还取决于在哪里/如何这个查询被执行;普通的 SSMS 查询可能会通过常量选择来提升(这不适用于参数化查询或作为 SP 参数)。不断的选择可能会导致“非常不同/更好”的计划。
-
无论如何,tldr:虽然 MSSQL 将视图内的 SQL 视为原始查询/计划的一部分,但它确实不保证与所述的逐字副本相同的计划选择视图 - 这是不同计划和性能配置文件的来源。
-
添加了 SQL 版本和查询计划
-
搜索 970435,它应该会显示“问题”。在快速/非视图情况下,它用于搜索(SeekPredicate)。
-
嗯,你能不能帮我把它拼出来。我确实看到视图的执行计划具有“参数化”参数,但我不知道为什么这是不好的或我应该怎么做。
标签: sql-server tsql sql-server-2014