您真的需要分区列作为 SQL 服务器中索引的第一列吗?
Do you really need the partitioned column as the first column in the index in SQL Server?
假设我想 运行 这个查询:
SELECT State, City FROM dbo.Table1 WHERE Status = 1 AND City = 'Jackson'
dboTable1 中的列“Status”是分区中使用的列,这意味着所有查询都应具有 Status = 1。
我的问题是,当我创建一个非聚集索引来满足这个查询时,这两个索引有区别吗?如果是这样,哪个是最理想的选择?
1:
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (Status, City)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status)
2:
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (City, Status)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status)
我想使用选项 #2,但这有关系还是我需要使用选项 #1?
谢谢大家。
SELECT State, City FROM dbo.Table1 WHERE Status = 1 AND City = 'Jackson'
My question is, when I create a non-clustered index to satisfy this
query, is there a difference between these two indexes? And if so,
which is the ideal one to use?
对于在 Status 和 State 上都具有相等谓词的查询,任一索引都可用于仅涉及请求的行的查找操作。
此外,当分区中的所有行都具有相同的状态值(即列表分区)时,您可以完全省略状态列。 SQL 服务器将分区列视为用于分区消除的最左边的键列,然后单独利用 City 上的 b 树索引以仅触及该分区中匹配的 City 值。与复合索引键相比,这种方法的优点是索引维护开销更少。请记住,分区列和聚簇索引键列(如果适用)隐式包含在索引中,因此该索引涵盖了查询。
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (City)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status);
请注意,过滤索引增加了额外的考虑因素。只有 status = 1 的查询才能实际使用此索引,并且仅当 Status 值未参数化时(如此具有常量 Status 值 1 的查询)。当状态值被参数化时,需要一个 OPTION(RECOMPLE)
查询提示来嗅探提供的值,并可能对状态 1 使用过滤索引,对其他状态值使用不同的计划。
假设我想 运行 这个查询:
SELECT State, City FROM dbo.Table1 WHERE Status = 1 AND City = 'Jackson'
dboTable1 中的列“Status”是分区中使用的列,这意味着所有查询都应具有 Status = 1。
我的问题是,当我创建一个非聚集索引来满足这个查询时,这两个索引有区别吗?如果是这样,哪个是最理想的选择?
1:
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (Status, City)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status)
2:
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (City, Status)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status)
我想使用选项 #2,但这有关系还是我需要使用选项 #1?
谢谢大家。
SELECT State, City FROM dbo.Table1 WHERE Status = 1 AND City = 'Jackson'
My question is, when I create a non-clustered index to satisfy this query, is there a difference between these two indexes? And if so, which is the ideal one to use?
对于在 Status 和 State 上都具有相等谓词的查询,任一索引都可用于仅涉及请求的行的查找操作。
此外,当分区中的所有行都具有相同的状态值(即列表分区)时,您可以完全省略状态列。 SQL 服务器将分区列视为用于分区消除的最左边的键列,然后单独利用 City 上的 b 树索引以仅触及该分区中匹配的 City 值。与复合索引键相比,这种方法的优点是索引维护开销更少。请记住,分区列和聚簇索引键列(如果适用)隐式包含在索引中,因此该索引涵盖了查询。
CREATE NONCLUSTERED INDEX IX_Table1_City ON dbo.Table1 (City)
INCLUDE (State)
WHERE Status = 1
ON PartitionScheme(Status);
请注意,过滤索引增加了额外的考虑因素。只有 status = 1 的查询才能实际使用此索引,并且仅当 Status 值未参数化时(如此具有常量 Status 值 1 的查询)。当状态值被参数化时,需要一个 OPTION(RECOMPLE)
查询提示来嗅探提供的值,并可能对状态 1 使用过滤索引,对其他状态值使用不同的计划。