【问题标题】:Including column improves query performance SQL Server 2008包含列可提高查询性能 SQL Server 2008
【发布时间】: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,而不是索引查找,这是包含列的查询。如何在不影响性能的情况下删除列?有什么想法吗?

【问题讨论】:

标签: sql sql-server performance sql-server-2008


【解决方案1】:

优化器很复杂。没有查询计划,只有猜测。 您需要查看查询计划以获得真正的答案。

一种可能性是处理顺序。 select 可以等效地写成:

SELECT t1.field1, t2.field2

因为on 条件指定两个表中的列相同。优化器我认识到or 阻止在视图上使用索引(这可能无论如何都不适用)。因此,它决定不扫描视图,而是扫描table1,然后引入视图。

通过在select 中包含一个额外的列,您正在推动优化器扫描视图——这可能是更好的执行计划。

这都是假设,但它提供了一种机制,说明您观察到的时间是如何发生的。

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2015-05-13
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多