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 时间和逻辑读取?
是的,这是预期的。
要获得所有日期的 equal/predictable 性能,您需要一个具有前导列的索引 BusinessDate
或将分区函数更改为更细化(每天而不是每月)
如果没有这个,它所能做的最好的事情就是为日期找到正确的分区并扫描所有行,直到找到 1000 行匹配日期谓词。在您的执行计划中,它以聚簇索引键顺序读取分区内的行,并且需要读取 2,001,000
才能找到与 BusinessDate='2019-10-27'
.
上的谓词匹配的前千个行
如果您发现较晚的日期较慢,则它们可能与您的聚集索引键相关(即按聚集索引键排序较晚的行也往往具有较晚的日期)。
在我们的 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 时间和逻辑读取?
是的,这是预期的。
要获得所有日期的 equal/predictable 性能,您需要一个具有前导列的索引 BusinessDate
或将分区函数更改为更细化(每天而不是每月)
如果没有这个,它所能做的最好的事情就是为日期找到正确的分区并扫描所有行,直到找到 1000 行匹配日期谓词。在您的执行计划中,它以聚簇索引键顺序读取分区内的行,并且需要读取 2,001,000
才能找到与 BusinessDate='2019-10-27'
.
如果您发现较晚的日期较慢,则它们可能与您的聚集索引键相关(即按聚集索引键排序较晚的行也往往具有较晚的日期)。