SQL Server - 对连接表进行非规范化以提高性能

时间:2014-07-08 11:02:30

标签: sql sql-server join denormalization

目前我有一个庞大的User表,我认为有几百万行,而且用户表通过UserTypeJoin表链接到UserType表。由于UserType表的所有连接,搜索和过滤需要很长时间。

我已经研究过使用索引视图,这看起来很棒,但是当我尝试创建聚簇索引时,我被告知聚簇索引不能应用于具有左连接的视图。并非所有用户都有UserType,因此我需要进行左连接。

所以现在我认为非规范化是我最好的方法。

我当前的表结构如下所示:

USER
UserId
UserName
Sex
Description

USER TYPE JOIN
UserId
UserTypeId

USER TYPE
UserTypeId
Name

我正在考虑将结构改为:

USER
UserId
UserName
IsUserTypeX bit
IsUserTypeY bit
IsUserTypeZ bit
etc...

用户可以拥有0到11个用户类型。

我针对我的数据运行的典型查询是使用他们的姓名,性别,描述或用户类型或这些属性的组合搜索用户。

这些表主要用于搜索,而不是用于写入,我最近一直在做的所有研究都告诉我,读密集表应该非规范化。

在这种情况下,这是我最好的选择吗?

或者有没有办法在不使用左连接但仍返回所有行的情况下创建索引视图?这肯定是更简单的方法,因为我不必更改大量代码。

1 个答案:

答案 0 :(得分:2)

在这种情况下,您可能希望做的一件事是添加一个UserType,让我们调用它" Untyped"。插入新用户时将其设为默认类型。现在您可以使用内部联接而不会丢失任何行。它是一种笨重的数据管理,但在您的情况下,权衡可能是值得的。

您是否正在检索所有行然后进行过滤?在很多情况下,首先进行过滤,然后进行连接会更好。如果将过滤条件放在与连接相同的查询中,查询优化器通常会使用此策略。