我有一个包含这些索引的表:
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
,聚集索引中列的顺序应该是什么?应该是(id
,sales_date
)还是(sales_date
,id
)?顺序在这里起什么作用?
1.在这种情况下,索引中列的顺序是否会影响性能?
1.如果我们在查询中包括分区列,那么分区消除是否总是发生而不管我们拥有什么索引?(例如:我已经在sales_id
上有一个唯一的非聚集索引(它不包含sales_date)。如果我在where子句中使用sales_id
和sales_date
进行查询,是否会发生分区消除?)
1.请分享,如果有一个全面的书面或视频,将有助于获得一个公平的理解上述概念。
任何回应将不胜感激。我可以分享更多的细节,如果需要。
我在现有的空表上尝试了以下场景。在这两种情况下,新记录都被插入到各自的分区中,分区消除也正常发生(根据Azure Data Studio中的实际执行计划发现的)
方案1
我按照下面的教程给出的步骤。我不知道我们正在执行第四步。
1.删除ID
上的现有聚集索引
1.在ID
上创建新的非聚集索引
1.在sales_date
上创建聚集索引
1.删除'sales_date'的聚集索引
方案2
基于另一个教程,我尝试了以下方法。
我按照下面的教程给出的步骤。我不知道我们正在执行第四步。
1.删除ID
上的现有聚集索引
1.在ID
上创建新的非聚集索引
1.在sales_date
上创建聚集索引
1条答案
按热度按时间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'
将只对包含日期的分区执行索引查找,并只访问单行。