为什么选择最大分区列比索引列慢得多?

u23*_*534 6 sql-server-2008 sql-server

我有一个很大的分区表(300+M 行,70 个活动分区)。该表具有 (K0, K1) 的集群 PK,并在列 K1 上进行分区。而 K1 的选择性非常低。

但是,以下查询需要半分钟,扫描计数为 170,逻辑读取为 603K。

select max(K1) from table
Run Code Online (Sandbox Code Playgroud)

然而,在 K1 上索引的非分区表上的类似查询不需要时间,扫描计数为 1,逻辑读取为 5。

是否应该在 K1 上创建无分区索引?

编辑:
为 K1 上没有索引的分区表规划文本。在 K0,K1 上使用聚集 PK,然后在 C1 上创建索引。

  |--流聚合(DEFINE:([Expr1004]=MAX([partialagg1005])))
       |--Parallelism(Gather Streams)
            |--Stream Aggregate(DEFINE:([partialagg1005]=MAX([DB1].[dbo].[table1].[K1])))
                 |--聚簇索引扫描(OBJECT:([DB1].[dbo].[table1].[PK_dbo_tabl1]))

为索引在 K1 上的非分区表规划文本。

  |--流聚合(DEFINE:([Expr1003]=MAX([DB1].[dbo].[table2].[K1])))
       |--顶(顶表达式:((1)))
            |--索引扫描(OBJECT:([Db1].[dbo].[table2].[idx_K1]), ORDERED BACKWARD)

使用 K0、K1 上的聚集 PK 和 C1 上的索引为分区表规划文本。

  |--流聚合(DEFINE:([Expr1004]=MAX([partialagg1005])))
       |--Parallelism(Gather Streams)
            |--Stream Aggregate(DEFINE:([partialagg1005]=MAX([db1].[dbo].[table1].[K1])))
                 |--索引扫描(OBJECT:([db1].[dbo].[table1].[IX_C1]))

Mar*_*ith 4

我想我最初误解/误读了这个问题。

该表在 K1 列上分区。然而下面的查询需要半分钟,扫描计数为170,逻辑读取为603K。

为了满足这种情况下的 MAX(k1) 查询,需要对 70 个分区中的每一个分区进行聚集索引扫描。

然而,对 K1 上索引的非分区表进行类似查询不需要时间,扫描计数为 1,逻辑读取为 5。

通过在 K1 上定义索引,选择索引的 ORDERED BACKWARD 扫描,这可能会转换为从非叶索引页读取 4 个页,加上叶级索引页的 1 个页。