gpt4 book ai didi

sql - 使用带索引的实际非规范化表而不是索引 View 对 SQL 查询性能更好?

转载 作者:行者123 更新时间:2023-12-01 12:00:40 24 4
gpt4 key购买 nike

为了提高查询性能,我创建了一个非规范化索引 View ,其中包含一些我需要报告的信息。当我没有获得我希望的性能提升时,我创建了一个带有索引的 View 的表版本,并获得了明显更好的性能。

我应该注意到,当我创建 View 时,SELECT 中有很多 ISNULL。我知道如果这些列在常规 View 中加入,这些可能会损害性能,但我的印象是如果 View 被索引就可以了。 ISNULL 可能是问题所在吗?

最佳答案

您是否为实际选择的列编制了索引?如果您的查询在索引 View 上没有覆盖索引,那么您肯定会发现表更快。但是,如果你这样做,应该没有真正的区别。示例:

CREATE VIEW dbo.denormalized
WITH SCHEMABINDING
AS
SELECT A.id,
A.col1,
A.col2,
ISNULL(B.col3, '') col3
FROM dbo.A LEFT JOIN dbo.B ON A.Bid = B.id
GO

CREATE UNIQUE CLUSTERED INDEX UIX_denormlaized
ON dbo.denormalized (id)

到目前为止一切顺利。现在,我们尝试从这个 View 中选择如下:

SELECT id, col3 FROM denormalized

此 View 唯一持久化的数据是 ID 列上的索引 - 其余数据必须即时计算。因此,为每一行再次计算 ISNULL。然而,如果我们添加这个索引:

CREATE INDEX IX_denormalized
ON dbo.denormalized (id, col3)

然后完全从持久化索引提供相同的查询 - 快得多,实际上与从表中进行选择的性能相当。

关于sql - 使用带索引的实际非规范化表而不是索引 View 对 SQL 查询性能更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2021968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com