1. 程式人生 > >使用SQL-Server分割槽表功能提高資料庫的讀寫效能

使用SQL-Server分割槽表功能提高資料庫的讀寫效能

首先祝大家新年快樂,身體健康,萬事如意。 一般來說一個系統最先出現瓶頸的點很可能是資料庫。比如我們的生產系統併發量很高在跑一段時間後,資料庫中某些表的資料量會越來越大。海量的資料會嚴重影響資料庫的讀寫效能。 這個時候我們會開始優化系統,一般會經過這麼幾個過程: 1. 找出SQL慢查詢,針對該SQL進行優化,比如改進SQL的寫法,檢視執行計劃對全表掃描的欄位建立索引 2. 引入快取,把一部分讀壓力載入到記憶體中 3. 讀寫分離 4. 引入佇列,把併發的請求使其序列化,來減輕系統瞬時壓力 5. 分表/分庫 對於第五點優化方案我們來細說一下。分表分庫通常有兩種拆分維度:1.垂直切分,垂直切分往往跟業務有強相關關係,比如把某個表的某些不常用的欄位遷移出去,比如訂單的明細資料可以獨立成一張表,需要使用的時候才讀取 2.水平切分,比如按年份來拆分,把資料庫按年或者按某些規則按時間段分成多個表。 拆分表之後每個表的資料量將會變小,帶來的好處是不言而喻的。不管是全表掃描,還是索引查詢都會有比較高的提升。如果把不同的表文件落在多個磁碟上那資料庫的IO效能還能進一步提高。 如果純手工拆分,比如按年份拆分成多個表,那麼上層業務程式碼也得進行調整。每次讀寫都得判斷該使用哪張表。如果是跨多個年份的分頁查詢更加難搞。人肉分表基本上不可能實現的,對於上層編碼簡直是個噩夢。所以針對分表分庫我們通常會使用某些中介軟體,比如Mycat,Sharding-JDBC等中介軟體。使用這些元件確實能實現分表分庫,並且對業務層程式碼遮蔽了資料庫架構的改動,但是配置略顯麻煩。如果你使用的是SQL Server資料庫,並且目前還不需要分庫,只需要分表,那麼其實使用內建的分割槽表功能是最簡單的方案。只需要開啟SQL Server Management Studio簡單設定幾下就可以了,對於你上層應用完全是無感的,你的程式碼、資料庫連線串都不需要改動。 以下我們通過2個簡單的測試,來簡單的演示下如何進行表分割槽操作,以及測試下分割槽前後效能變化。 ## 測試寫效能 我們的測試方案:新建一張logs表,按年份寫入資料。2019年寫入1000000資料,2020年也寫入100000資料。為了加快寫入的速度,每個年份並行10個執行緒同時寫,每個執行緒寫100000資料,一共1000000資料。然後把logs表改成分割槽表再用同樣的方式寫入2000000資料。記錄耗時 比較兩次的耗時。 硬體為一臺14年產的筆記本,OS為win10。掛載2塊硬碟,1塊為5400轉的機械硬碟,1塊為15年加的SSD。磁碟效能可以說極為垃圾。未分割槽時表文件會落在機械硬碟上。 ## 未分割槽情況下測試 使用指令碼建表: ``` CREATE TABLE [dbo].[logs]( [id] [uniqueidentifier] NOT NULL, [log_txt] [varchar](200) NULL, [log_time] [datetime] NULL, CONSTRAINT [PK_logs] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ``` 新建一個控制檯程式編寫程式碼: ``` class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); Task.Run(() => { InsertData(2019); }); Task.Run(() => { InsertData(2020); }); Console.ReadLine(); } static void InsertData(int year) { var tasks =