【问题标题】:Most efficient way to do select hierarchical query - SQL Server 2014选择分层查询的最有效方法 - SQL Server 2014
【发布时间】:2016-02-21 23:09:54
【问题描述】:

假设我有一个包含大量行和 5 个字段的数据库 - State (A)、City (B)、Category (C)、Subcategory (D) 和 ID (E )。我将使用SELECT ID 之类的大量查询来解决它,其中WHERE 子句可以包含以下内容,并与ANDs 连接:

A
A,B
A,C
A,B,C
A,C,D
A,B,C,D
C
C,D

换句话说,由于列的层次结构的性质,它仅在包含 A 时才包含 B,并且仅在包含 C 时才包含 D。其中每一个都会返回一个 ID 列表,其中可能有很多行。

以下技术是否有益?

  1. 创建两个表,其中一个 (X) 使用复合聚集索引 (A,B),另一个 (Y) 使用复合聚集索引 (C,D)

  2. 参加我在{A,B}(如果有的话)上的部分查询,并针对 X;参加我对{C,D}(如果有的话)的查询并点击它 反对Y

  3. 如果我同时点击两个表(即查询包含{A,B} 的两个部分 和{C,D}),然后在ID 上与两个表相交。

这会比只对整个表进行完全查询更有效吗?我还应该在XY 上为ID 创建一个二级非聚集索引吗?

【问题讨论】:

  • 不要认为您可以通过拆分单独的表、拆分临时表的特殊排序处理等来超越查询优化器。大多数情况下,如果您正确索引表(可能包括分区表),一切都在幕后工作,你不需要复杂的过程。有时你需要让它变得复杂,但首先尝试正确索引。

标签: sql sql-server


【解决方案1】:

如果您在A,B,C,D 上创建索引,那么它将有助于这些查询:

A
A,B
A,B,C
A,B,C,D

这会对这些查询有所帮助:

A,C
A,C,D

这些查询无济于事:

C
C,D

如果您在 C,D 上创建第二个索引,它将有助于这些查询:

C
C,D

如果您在 A,C,D 上创建第三个索引,它将有助于这些查询:

A
A,C
A,C,D

所以,我会将所有内容保存在一张表中,并在其上设置三个索引。至于,哪个索引做一个聚簇,就不好说了。我将从ID 上的简单索引开始,这也是主键。


以上所有内容都假定您的查询使用所有这些列和“平等”过滤器,如下所示:

WHERE A='ValueA' AND B='ValueB' and C='ValueC'

如果某些过滤器不是=,而是>>=,那么索引可能不会那么有效。这取决于实际的过滤器表达式。

【讨论】:

  • 谢谢!所以即使我返回很多行,也可以制作非聚集索引?我听说这很糟糕。
  • “有问题”的范围太广。如果您担心性能,请使用您的硬件和实际大小的数据尝试几种变体并进行比较。 通常不好,就是在没有清楚了解为什么要这样做以及从中获得什么的情况下对数据进行非规范化。 (例如,如果它是单个实体,则将表拆分为两个,或者相反,如果它们是两个实体,则将两个表合并为一个)。当然,每个额外的索引都会使表的更新速度变慢,因此您用SELECT 速度换取UPDATE/INSERT 速度。您应该衡量影响并决定是否可以接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多