sql 服务器分区性能

sql server partition performance

在我们的 SQL 服务器数据库中,我们有一个按日期列分区的 table。 对于每个日期,我们插入了半百万条记录。我们注意到查询性能对 更接近分区开始范围的日期,并且随着每个日期的推移逐渐降级。

这是我的分区函数

CREATE PARTITION FUNCTION partition_position_monthly (DATE)
AS RANGE RIGHT FOR VALUES ('2019-09-01', '2019-11-01');

Table

CREATE TABLE PartitionTest(
    ID int IDENTITY(1,1) NOT NULL,
    col1 varchar(256) ,
    col2 varchar(128) ,
    col3 varchar(128) ,
    BusinessDate date , -- partition column
) ON partition_scheme_monthly(BusinessDate)

BusinessDate 列上有聚集索引。

这是使用的查询

select top 1000 * from PartitionTest where BusinessDate = ?

CPU 和每个业务日期的 IO 记录

营业日 = 2019-09-01 CPU 时间 = 31 毫秒 扫描计数 1,逻辑读取 80,物理读取 0,预读读取 0

营业日 = 2019-09-02 CPU 时间 = 63 毫秒 扫描计数 1,逻辑读取 24905,物理读取 0,预读读取 3131

营业日 = 2019-09-03 CPU 时间 = 125 毫秒 扫描计数 1,逻辑读取 49727,物理读取 0,预读读取 7

营业日 = 2019-09-04 CPU 时间 = 172 毫秒 扫描计数 1,逻辑读取 74551,物理读取 0,预读读取 7

营业日 = 2019-09-05 CPU 时间 = 234 毫秒 扫描计数 1,逻辑读取 99376,物理读取 0,预读读取 117

如您所见,BusinessDates 的 CPU 时间和逻辑读取逐渐增加 离分区起始范围更远。

这是从分区获取数据时的预期行为吗?

我们计划对月度数据进行分区,临近月末的几天查询响应时间超出了我们的acceptable限制。有没有办法在分区中实现每天恒定的 CPU 时间和逻辑读取?

PasteThePlan Link

是的,这是预期的。

要获得所有日期的 equal/predictable 性能,您需要一个具有前导列的索引 BusinessDate 或将分区函数更改为更细化(每天而不是每月)

如果没有这个,它所能做的最好的事情就是为日期找到正确的分区并扫描所有行,直到找到 1000 行匹配日期谓词。在您的执行计划中,它以聚簇索引键顺序读取分区内的行,并且需要读取 2,001,000 才能找到与 BusinessDate='2019-10-27'.

上的谓词匹配的前千个行

如果您发现较晚的日期较慢,则它们可能与您的聚集索引键相关(即按聚集索引键排序较晚的行也往往具有较晚的日期)。