在没有索引视图的情况下,在 SQL Server 中创建复杂视图的最佳方法是啥?

Posted

技术标签:

【中文标题】在没有索引视图的情况下,在 SQL Server 中创建复杂视图的最佳方法是啥?【英文标题】:Whats the best way to create a complex view in SQL Server, without an Indexed view?在没有索引视图的情况下,在 SQL Server 中创建复杂视图的最佳方法是什么? 【发布时间】:2018-08-14 21:31:12 【问题描述】:

我有一个简单的 Customer、Setting 和 CustomerSetting 结构。

大约有 60 种设置,都使用 UNIQUEIDENTIFIER 作为键,因为这些设置可以在多个系统之间共享并且可以按任意顺序创建,因此不保证 Id 相同)

每个客户都可以拥有这些设置,但不一定是其中的任何一个或全部。

我正在尝试找到列出所有客户和所有设置的最快(性能方面)方式。

我尝试过使用函数、表值函数、连接、交叉应用……而且速度非常慢。仅对于下面的示例,我的本地 SQL 服务器需要 35 秒才能列出 2,000 个用户及其设置。在现实生活中我有超过 250 万。

FN 和 TVF 对于单个用户来说非常快 - 但一旦达到多行,它就会停止。

写一个快速版本有什么诀窍吗?

注意:我很高兴在视图中硬编码设置 GUID,因为它们很少更改。

注意:数据可能会非常频繁地更改,因此(我认为)索引视图已被淘汰。

Sample Database Tables, Indexes, View, Data and Select * I am trying to acheive

重要提示 - 这是显示结构的数据样本,而不是完整的数据库。

【问题讨论】:

重新性能:需要给CustomerSetting表添加索引。我建议使用复合 (Id_Customer, Setting),但您应该尝试一下。见sqlskills.com/blogs/kimberly/… 看看这个:***.com/questions/1336449/eav-over-sql-server 【参考方案1】:

真实的结构有索引吗?而不是 20 个关节,您只需 PIVOT 将 SettingValue 行放入列中

【讨论】:

以上是关于在没有索引视图的情况下,在 SQL Server 中创建复杂视图的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 中检查索引视图的大小?

在不添加/删除聚集索引的情况下减少 SQL Server 表碎片?

Sql server 创建索引后,只有查询后重建才会生效,不知为啥?

在这种情况下,在 SQL Server 中对三个 nchar 列进行索引的最有效方法是啥?

SQL Server 索引视图:无法创建聚集索引,因为选择列表包含聚合函数结果的表达式

理解SQL Server中索引的概念,原理