最有效的方法来选择分层查询 - SQL Server 2014

时间:2016-02-21 23:09:55

标签: sql sql-server

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

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

换句话说,如果它包含A,它将只包括B,并且由于列的层次结构的性质,它只包括D(如果它包含C)。其中每个都会返回一个ID列表,这些ID可能是很多行。

以下技术会有益吗?

  1. 创建两个表,一个(X),其中包含复合聚簇索引 (A,B),另一个(Y)上有复合聚簇索引 (C,D)

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

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

  4. 这比仅对整个表进行完全查询更有效吗?我是否还应在IDX上为Y创建辅助非聚集索引?

1 个答案:

答案 0 :(得分:0)

如果您在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'

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