前言:
半个月前发了文章 SQLServer聚集索引导致的插入性能低
终于等到生产环境休整半天,这篇文章是对前文的实际操作。
以下正文开始:
异常:近期发现偶尔有新数据插入超时。
分析:插入条码有多种规则,导致数据表页面重排,造成性能剧烈下降。
解决方案:
将基于Barcode的聚集索引更改到ID聚集索引(使新数据始终在尾部添加,避免数据页面重排),
以损失微量Barcode查询性能,换取大幅度提升新数据插入性能。
为避免缓存干扰,进行了4次测试:
1,优化前(Barcode聚集), ID查询。
2,重启,Barcode查询。
3,优化后(ID聚集),重启,ID查询。
4,重启,Barcode查询。
以下是基于随机10条数据的测试用例:
----使用ID索引查询:
SELECT * FROM [MESDATANow].[dbo].[BarcodeMain] where ID in
(38126797,37116727,39113797,39116797,37116297
,37116397,37112797,37114797,37113797,37119797)
Go
SELECT * FROM [MESDATANow].[dbo].BarcodeRecord
where ID in (116522700,116527024,116528753,113409209
,113410162,112678638,112679077 ,112942761,112943627,112942850
,112943727,116530104,116531318,114035125,114036196)
----使用Barcode索引查询:
SELECT * FROM [MESDATANow].[dbo].[BarcodeMain]
where Barcode in ('LS-21351005000408748','CH2LCHBM13523153AU'
,'CH2LCHKM1351210AEM','CH2LCHKM1351210APG', 'CH2LCHKM1351210AR0','CH2LCHKM13512107FU'
,'LS-21351005000406516','LASLCHWM13721104XF', 'BROLCHBM1391110258','CH2LCHKM1386210DV3')
go
SELECT * FROM [MESDATANow].[dbo].BarcodeRecord Where Barcode in ('LS-21351005000408748'
,'CH2LCHBM13523153AU','CH2LCHKM1351210AEM','CH2LCHKM1351210APG'
, 'CH2LCHKM1351210AR0','CH2LCHKM13512107FU','LS-21351005000406516','LASLCHWM13721104XF',
'BROLCHBM1391110258','CH2LCHKM1386210DV3')
数据表 |
数据量 |
聚集索引 |
用Barcode查询 |
用ID查询 |
||
读取次数 |
耗时(ms) |
读取次数 |
耗时(ms) |
|||
BarcodeMain |
7165446行 |
Barcode |
438 |
36 |
468 |
42 |
ID |
488 |
32 |
412 |
27 |
||
BarcodeRecord |
15752004行 |
Barcode |
176 |
28 |
444 |
35 |
ID |
296 |
31 |
236 |
19 |
结论: 达到预期目的,耗时增加在可接受范围。
(应用主要基于Barcode查询,基于ID的查询性能大幅提升无实际意义)