SQL Server的聚集索引中是否需要分区列

b09cbbtk  于 2022-11-28  发布在  SQL Server
关注(0)|答案(1)|浏览(157)

我有一个包含这些索引的表:

pk_id_sales PRIMARY KEY (id) -> Clustered unique index
uk_sales_id UNIQUE(sales_id -> Non clustered unique index
uk_sales_date_party_name (sales_date, party_name) -> Non clustered, non unique index

我想在列sales_date上对此表进行分区。
1.是否应该将sales_date包含到聚集索引中以获得分区的好处?这是可选的吗?如果是可选的,在做出此决定时应考虑哪些因素?
1.如果添加sales_date,聚集索引中列的顺序应该是什么?应该是(idsales_date)还是(sales_dateid)?顺序在这里起什么作用?
1.在这种情况下,索引中列的顺序是否会影响性能?
1.如果我们在查询中包括分区列,那么分区消除是否总是发生而不管我们拥有什么索引?(例如:我已经在sales_id上有一个唯一的非聚集索引(它不包含sales_date)。如果我在where子句中使用sales_idsales_date进行查询,是否会发生分区消除?)
1.请分享,如果有一个全面的书面或视频,将有助于获得一个公平的理解上述概念。
任何回应将不胜感激。我可以分享更多的细节,如果需要。
我在现有的空表上尝试了以下场景。在这两种情况下,新记录都被插入到各自的分区中,分区消除也正常发生(根据Azure Data Studio中的实际执行计划发现的)

方案1

我按照下面的教程给出的步骤。我不知道我们正在执行第四步。
1.删除ID上的现有聚集索引
1.在ID上创建新的非聚集索引
1.在sales_date上创建聚集索引
1.删除'sales_date'的聚集索引

方案2

基于另一个教程,我尝试了以下方法。
我按照下面的教程给出的步骤。我不知道我们正在执行第四步。
1.删除ID上的现有聚集索引
1.在ID上创建新的非聚集索引
1.在sales_date上创建聚集索引

6jygbczu

6jygbczu1#

对于您的第一个问题,需要将分区列显式指定为所有唯一索引的键列。此外,如果尚未指定分区列,SQL Server将自动将其添加到聚集索引键。
当分割数据行不是索引键或内含数据行时,它会自动加入为非唯一非丛集索引中的内含数据行。

编辑:

对于这个问题,在评论中问:
我的表上的现有聚集索引的ID为(它是IDentical和自动递增的)。我想基于sales_date对表进行分区。我的理解是,我们需要将sales_date添加到聚集索引中。在我在Web上看到的示例中,他们将其添加为聚集索引的第二部分,即,(id,sales_date)。但对我来说,(sales_date,id)看起来会更有帮助,因为id是唯一的,它无助于提高性能。
这取决于您的查询。必须指定分区列以消除分区,必须指定最左边的键列以执行索引查找。
具有唯一聚集索引键(id,sales_date)且没有其他索引:

  • WHERE id = 1将对每个分区执行索引查找以查找单个行。
  • WHERE sales_date = '20221114'将对包含日期的单个分区执行完全扫描,并仅返回与日期匹配的行。
  • WHERE id = 1 AND sales_date = '20221114'将只对包含日期的单个分区执行寻道并接触单个行。

具有唯一聚集索引键(sales_date,id):

  • WHERE id = 1将完全扫描每个分区以查找单个行。
  • WHERE sales_date = '20221114'将只在包含日期的分区上执行索引查找,并只接触符合条件的行。
  • WHERE id = 1 AND sales_date = '20221114'将只对包含日期的分区执行索引查找,并只访问单行。

相关问题