前言:
半個月前發了文章 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的查詢性能大幅提升無實際意義)