【发布时间】:2018-06-09 04:43:26
【问题描述】:
如果包含列,查询性能会受到影响,但奇怪的是,如果包含列,它会影响积极的(减少执行时间)。
查询包括几个到视图的连接、一些表和表值函数,如下所示:
SELECT
v1.field1, t2.field2
FROM
view v1 WITH (nolock)
INNER JOIN
table t1 WITH (nolock) ON v.field1 = t1.field1
INNER JOIN
table2 t2 WITH (nolock) ON t2.field2 = t1.field2
INNER JOIN
function1(@param) f1 ON f1.field3 = t2.field3
WHERE
(v.date1 = @param OR v.date2 = @param)
问题是,如果我在 select 中包含一个 varchar(200) not null 列,它是视图的一部分(它没有在原始表或视图中编制索引,也不是约束的一部分),查询性能是 X 秒,但如果我不包含它,那么性能会提高到 4X 秒,这对于包含一列来说有很大的不同;所以性能最好的查询是这样的:
SELECT
v1.field1, t2.field2, v1.fieldWhichAffectsPerformance
view v1 WITH (nolock)
INNER JOIN
table t1 WITH (nolock) ON v.field1 = t1.field1
INNER JOIN
table2 t2 WITH (nolock) ON t2.field2 = t1.field2
INNER JOIN
function1(@param) f1 ON f1.field3 = t2.field3
WHERE
(v.date1 = @param OR v.date2 = @param)
必须删除提高查询性能的列,但不会对实际性能产生负面影响。有什么想法吗?
编辑:正如我所建议的,我已经查看了执行计划,并且没有列的查询运行额外的哈希匹配(左外连接)并使用索引扫描,这会消耗大量 CPU,而不是索引查找,这是包含列的查询。如何在不影响性能的情况下删除列?有什么想法吗?
【问题讨论】:
-
发布执行计划与选择列。确保统计数据是最新的..
-
设置Bad Habits to kick - putting NOLOCK everywhere - 不建议在任何地方使用它 - 恰恰相反!
-
不使用排序
标签: sql sql-server performance sql-server-2008