假设我有一个包含大量行和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可能是很多行。
以下技术会有益吗?
创建两个表,一个(X
),其中包含复合聚簇索引
(A,B)
,另一个(Y
)上有复合聚簇索引
(C,D)
将我的查询部分放在{A,B}
(如果有的话)上并点击
X
;把我的查询部分反对{C,D}
(如果有的话)并点击它
反对Y
。
如果我同时点击两个表(即查询包含{A,B}
的两个部分
和{C,D}
),然后在ID
上与两个表相交。
这比仅对整个表进行完全查询更有效吗?我是否还应在ID
和X
上为Y
创建辅助非聚集索引?
答案 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'
如果某些过滤器不是=
,而是>
或>=
,则索引可能不那么有效。这取决于实际的过滤表达式。