SQL Server 2008 中的分区关键问题

5 sql-server-2008 sql-server sql-server-2008-r2

我们计划基于整数列对我们的数据库使用表分区。我已经在 MSDN 上阅读了它,网址http://msdn.microsoft.com/en-us/library/ms190787.aspx并且有一些疑问。

a) 是否要求分区键是主键的一部分?即使它不是必需的,如果它是主键或聚集索引的一部分,它是否仍然有任何好处?

b) 在我们的例子中,我们将对带有非分区主数据的分区表执行 JOIN 操作。我会失去分区消除所获得的性能吗?一般来说,如果 JOIN 操作中使用的任何表是未分区的,那么我会失去分区的好处吗?

c) 在分区键上的 JOIN 条件中添加过滤条件是否有助于分区消除?或者只有分区列上的 WHERE 子句中的过滤条件用于分区消除?

d) 分区键应该是非聚集索引的一部分吗?

提前致谢。

Pet*_*ter 8

假设您在聚集索引上有主键,那么分区键需要是主键的一部分。

您不会通过加入非分区表失去分区的好处,前提是查询旨在利用分区表,例如以下查询将受益于分区

SELECT F.Col1, F.Col2, D.Col3
FROM Fact_Partitioned F
    INNER JOIN Dim_MyDim D ON F.Col1 = D.Col1
WHERE F.Col1 = 5
Run Code Online (Sandbox Code Playgroud)

但是以下查询不会从分区消除中受益

SELECT F.Col1, F.Col2, D.Col3
FROM Fact_Partitioned F
    INNER JOIN Dim_MyDim D ON F.Col1 = D.Col1
WHERE D.Col1 = 5
Run Code Online (Sandbox Code Playgroud)

这是一个细微的区别,但在第一个查询中,连接键在分区表中过滤,利用消除,然后连接到维度。在第二个查询中,键在维度中被过滤,然后连接到整个事实表,而不仅仅是所需的分区。

不用说,分区键需要在WHERE子句中才能消除工作,否则SQL Server不知道数据在哪个分区。

JOIN子句上添加过滤条件对您没有帮助。它需要在WHERE条款中才能从消除中受益。

分区键不需要是非聚集索引 (NCI) 的一部分,但如果 NCI 是唯一的,则它需要包含分区键以对齐索引。这是 NCI 在与表相同的分区方案上构建的地方。NCI 也应该分区对齐,除非有非常好的理由不这样做。我从来没有遇到过足够好的理由!