Delete大量資料後SQL Server效能下降
今天給大家分享一個”刪除大量資料後SQL Server效能下降”的案例。一般而言,資料庫資料減少後,應該有助於提高SQL server的整體效能。可是在這個案例中,情況恰恰相反。
[@more@]症狀
=========
- 刪除大量資料後SQL Server效能下降
- 一些儲存過程之前執行20分鐘左右,現在需要執行2-3個小時。
背景資訊
=========
- 大量資料透過DELETE語句而刪除
- 資料刪除後,客戶進行了相關的維護工作 : 重建索引和更新統計資料
- 效能變慢的儲存過程會對一些表做很多的”DELETE”,”INSERT”和”SELECT”操作。
調查
=========
- 相關的表都是堆( heap table)
- 這些表中並沒有大量資料
- DBCC CHECKCONTIG 結果顯示錶很大,但其頁的密度 (Page Density) 卻相當小。
DBCC SHOWCONTIG scanning 'tblA' table...
Table: 'tblA' (322816212); index ID: 0, database ID: 14
TABLE level scan performed.
- Pages Scanned................................: 1779939 à13.6GB
- Extents Scanned..............................: 223475
- Extent Switches..............................: 223474
- Avg. Pages per Extent........................: 8.0
- Scan Density [Best Count:Actual Count].......: 99.56% [222493:223475]
- Extent Scan Fragmentation ...................: 23.65%
- Avg. Bytes Free per Page.....................: 8059.1
- Avg. Page Density (full).....................: 0.43%
DBCC SHOWCONTIG scanning 'tblB' table...
Table: 'tblB' (1005246636); index ID: 0, database ID: 14
TABLE level scan performed.
- Pages Scanned................................: 215600 à1.6GB
- Extents Scanned..............................: 27269
- Extent Switches..............................: 27268
- Avg. Pages per Extent........................: 7.9
- Scan Density [Best Count:Actual Count].......: 98.83% [26950:27269]
- Extent Scan Fragmentation ...................: 38.87%
- Avg. Bytes Free per Page.....................: 7998.3
- Avg. Page Density (full).....................: 1.18%
原因
=========
- 當表上有聚集索引時,刪除操作會釋放空頁。然而,從堆中刪除行時,資料庫引擎可以使用行鎖定或頁鎖定進行操作。結果,刪除操作導致的空頁將繼續分配給堆。未釋放空頁時,資料庫中的其他物件將無法重用關聯的空間。
- 雖然表中沒有大量資料,但是它們擁有大量的幾乎為空的資料頁。掃描表因此變得十分花時間。
解決方案
=========
- 若要刪除堆中的行並釋放頁,我們可以使用下列方法之一。
· 在 DELETE 語句中指定 TABLOCK 提示。使用 TABLOCK 提示會導致刪除操作獲取表的共享鎖,而不是行鎖或頁鎖。這將允許釋放頁。
· 如果要從表中刪除所有行,請使用 TRUNCATE TABLE。
· 刪除行之前,請對堆建立聚集索引。刪除行之後,可以刪除聚集索引。與先前的方法相比,此方法非常耗時,並且使用更多的臨時資源。
參考資訊
=========
使用 DELETE 刪除行
Space that a table uses is not completely released after you use a DELETE statement to delete data from the table in SQL Server
結果
========
- 客戶的應用邏輯允許將表清空。因此我們選擇了TRUCATE TABLE的方法。完成後,出問題的儲存過程的效能都恢復到了從前。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-1057105/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Delete大量資料後,回收表空間delete
- vage的delete大量資料方法delete
- zt_vage的delete大量資料方法delete
- delete duplication record in sql serverdeleteSQLServer
- SQL Server2000 刪除大量資料後需要重建index或rebuild 麼 ?SQLServerIndexRebuild
- SQL Server大量插入 JavaSQLServerJava
- Sql Server系列:Delete語句SQLServerdelete
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- 【SQL】Oracle資料庫變更後sql效能對比SQLOracle資料庫
- SQL Server後設資料的管理與應用SQLServer
- 資料庫中大量對錶smon_scn_time的delete操作資料庫delete
- SQL Server資料庫恢復,SQL Server資料恢復,SQL Server資料誤刪除恢復工具SQLRescueSQLServer資料庫資料恢復
- DELETE大批次資料的效能最佳化delete
- MySQL大量資料入庫的效能比較MySql
- sql server 帶有OUTPUT的INSERT,DELETE,UPDATESQLServerdelete
- Sql server日誌損壞後的資料恢復(轉)SQLServer資料恢復
- SQL Server埠更改後的資料庫連線方式(轉)SQLServer資料庫
- SQL Server資料庫安全SQLServer資料庫
- SQL server 修改表資料SQLServer
- SQL Server 資料庫映象SQLServer資料庫
- SQL Server 資料庫索引SQLServer資料庫索引
- 資料庫映象 (SQL Server)資料庫SQLServer
- SQL SERVER資料庫datediff函式引發的效能問題SQLServer資料庫函式
- 【SQL Server】--SQL Server資料庫bak檔案還原SQLServer資料庫
- SQL Server中快速生成大量記錄的SQL指令碼SQLServer指令碼
- DataGear 變更部署資料庫為SQL Server填坑指南(含轉寫後的SQL server程式碼及SQL server配置檔案)資料庫SQLServer
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- 關係型資料庫效能測試參考指標----SQL Server資料庫指標SQLServer
- SQL Server效能的改進得益於邏輯資料庫設計SQLServer資料庫
- SQL SERVER 效能監視器SQLServer
- 建立索引——提高SQL Server效能索引SQLServer
- SQL SERVER效能優化(轉)SQLServer優化
- 資料庫效能 常用SQL資料庫SQL
- SQL SERVER收集資料庫使用增量資料SQLServer資料庫
- SQL Server收縮資料庫SQLServer資料庫
- SQL Server-資料型別SQLServer資料型別
- 管理SQL Server資料庫安全SQLServer資料庫
- SQL Server資料庫遷移SQLServer資料庫