【发布时间】:2014-08-29 02:08:16
【问题描述】:
目前我有一个巨大的用户表,我认为有几百万行,并且该用户表通过 UserTypeJoin 表链接到 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 个用户类型。
我针对我的数据运行的典型查询是使用用户的姓名、性别、描述或用户类型或这些属性的组合来搜索用户。
这些表主要用于搜索,而不是用于写入,我最近所做的所有研究都告诉我,应该对读取密集型表进行非规范化。
这是我在这种情况下的最佳选择吗?
或者有没有一种方法可以在不使用左连接的情况下创建索引视图但仍返回所有行?这肯定是更简单的方法,因为我不必更改大量代码。
【问题讨论】:
-
你考虑过使用存储过程吗?
-
不,但是在这种情况下这对我有什么帮助?我仍然会让表连接减慢它的速度。
-
为什么要返回没有用户类型的用户?
-
你会,但存储过程正在被 SQL 服务器优化,它们的执行计划正在被存储。此外,在执行计划分析中,您可以了解如何优化索引和其他内容。恕我直言,表结构更改是最后的手段。
-
对整个集合进行左连接需要多长时间?您预计需要多长时间?您是否尝试过仅出于时间比较目的进行内部联接?你知道执行查询的计划是什么吗?
标签: sql sql-server join denormalization