SQL Server语言 - 反规范化连接表以提高性能



目前我有一个巨大的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个usertype。

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

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

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

或者是否有一种方法可以创建索引视图而不使用左连接,但仍然返回所有行?这绝对是一种更简单的方法,因为我不需要修改大量的代码。

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

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

最新更新