【问题标题】:Select columns from a table vs Joining two tables从表中选择列与连接两个表
【发布时间】:2016-08-02 11:51:16
【问题描述】:

我想在以下两种场景的性能之间做出决定。

  1. 我是否应该将 table-2 的相同数据复制到 table-1 创建相同的列并使用简单的 SELECT 查询获取这些数据。

  1. 我是否应该连接两个表并使用 JOIN 获取相同的数据。

我有以下事情可以玩:

  1. Table-1 --> 超过 300,000 行
  2. Table-2 --> 超过 200,000 行
  3. 有两列的复合 PK 是必要的
  4. 外键索引
  5. 许多用户 (>50)
  6. 在每个报告和其他功能中都大量使用表格

【问题讨论】:

  • 如果你已经有两个表中的数据,并且可以使用JOINS提取你需要的内容,那么反规范化并将数据放在一个表中会适得其反。性能从不取决于数据行数。它依赖于高效的表设计、高效的索引和高效的查询
  • 感谢 raj 的即时回复。根据规范化规则,它会适得其反,但行数也很重要,查询多少次也对服务器的性能很重要。索引和查询是根据需要适当的。但是当你加入一个表时,每次它都需要用join查询另一个表,如果我只能查询一个表,它不会影响性能吗?

标签: sql-server performance select join indexing


【解决方案1】:

不要创建冗余数据。

使用连接并在连接字段上使用COVERING INDEX,或者在您对连接字段(FK 字段)的索引中使用INCLUDE table2.field。

CREATE NONCLUSTERED INDEX IX1
    ON Table2 (YourFK_Field)
    INCLUDE (TheRedundantField);

这样,当 SQL Server 读取 IX1 时,它也会读取 TheRedundantField。

你也可以像这样创建覆盖索引

CREATE NONCLUSTERED INDEX IX1
    ON Table2 (YourFK_Field, TheRedundantField)

但这不是一个好主意,因为 TheRedundantField 可能是一个数量而不是关键字段

【讨论】:

  • 谢谢闪烁。你能举个例子或其他东西,以便我做出决定吗?
  • 再次感谢 FLICKER。它很有用。我会试一试并尽快回复您。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多