【问题标题】:SQL Server - Denormalizing join tables to improve performanceSQL Server - 非规范化连接表以提高性能
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 2013-05-08
    • 2021-09-22
    • 2013-11-21
    • 2012-10-08
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    相关资源
    最近更新 更多