在一些小公司或者部門裏,一般不多有專門的DBA職位。這時候就須要咱們這些程序員充當業餘DBA的做用,去監測和維護數據庫性能。本文的目的是幫助非DBA專業的開發人員如何定位和解決平常出現數據庫問題,並提供一些相關有用的工具。前端
大部分項目一開始的數據庫都是很小的,但隨着時間的推動,數據庫變得愈來愈龐大,訪問性能也愈來愈慢。所以優化數據庫在所不免,數據庫優化的三大核心:保持系統穩定、確保數據完整性和高質量、性能。程序員
在開始優化數據庫的時候,咱們必需要了解本身所使用的數據庫的結構和用途以及以下一些基本信息。sql
當與數據交道時,健壯的代碼相當重要。須要注意的是事務、error捕獲和日誌的使用。當設計數據庫結構和架構時,都會面臨存儲過程的選擇。存儲過程是預先寫好的數據庫腳本,可以被命令取消。當使用C#或者JavaScript前端寫代碼時,容許某些地方使用錯誤的處理和日誌記錄哪些錯誤操做。但存儲過程就不同了,由於相比於網站前端,它不多與用戶有交互。在使用存儲過程時,有三點須要留意:數據庫
1. 若是容許,請把腳本寫於事務塊裏面服務器
2. 使用try...catch...監測捕獲錯誤信息多線程
3. 記錄錯誤信息架構
當錯誤捕獲後,須要記錄,你可使用MS SQL內置的日誌系統記錄,但這又涉及到權限,可能你沒有辦法訪問。你也能夠建立一張日誌表記錄錯誤信息。工具
一般咱們都會遇到訪問速度的問題。速度慢無非就是數據量過大、處理腳本執行效率低、索引建立不合理、硬件或者系統配置等問題。索引是解決性能的優先選擇,可是若是擁有太多的索引就會形成性能問題。其次是字段的類型,儘可能使用varchar替代nvarchar性能
1. 正確使用索引大數據
2. 使用SQL 索引提示
1. 非數據庫引發的性能問題
通常狀況下,更多形成性能問題的是咱們不規範和不合理的寫法致使的。例如一下2個例子
用between語法比和比較來的快
經過foreach遍歷循環查找單條數據,顯然效率也會大打折扣。取而代之,可使用join表關聯來查找你要的結果
2. 查詢複雜來源的數據消耗太多時間
a. 前期預加載和規範
通常狀況下,添加索引、優化查詢語句到目前爲止可以很好的優化性能。還有一種狀況,因爲訪問數據量很大,且這些大數據是從其餘數據量也很大的地方集合過來的,所以它消耗的時間就很長。最好的方式就是預先讀取這些數據或者去規範化這些數據。若是你的查詢來源是一個pivot表,那麼他可能來自一系列的關聯數據、視圖、存儲過程,好的解決方式就是建立一個新的存儲過程去搜集這些須要的數據,而後把他們存入一個更規範的數據表中方便閱讀和查詢。先規範化你的數據,也可以幫你省去不少寶貴的實踐,不只僅在加載數據前,也包括格式排版。好比你訪問的數據須要整理成JSON格式的時候,你無需在訪問的時候才作格式化操做,徹底能夠預先加載這些數據整理成JSON格式。
b. 多線程執行存儲過程
有時候一些存儲過程確實須要花費一些時間去執行,而這些執行過程並非你所關心的。當你訪問這些存儲過程並等待時,就可能會面臨超時的錯誤出現。解決方式,就是開始執行存儲過程的時候,去檢查他是否已經執行完畢而不是卡着線程等待它的結果。這些存儲過程一般發生在一個腳本原本執行很快,但隨着數據量的增長,他消耗的時間愈來愈久致使超時。你須要作的就是使用SqlCommand.BeginExecuteNonQuery()方法。這個方法在後臺線程執行存儲過程,而不影響你當前線程執行其餘事情,無需等待。
數據的導入也是開發人員須要具有的技能。MS SQL提供了內置的導入功能,能夠經過text文件\數據庫文件、csv或者xml。這裏不作細聊
1. DBCC
Database console commands 可以檢查數據庫級別或者表級別數據的完整性,重建索引的表,執行一系列的維護工做。
DBCC CheckDB: 檢查數據庫的邏輯和物理的完整性
DBCC CheckTable(‘TableName’) :檢查表或者視圖的結構完整性
DBCC ShrinkDatabase(‘DatabaseName’): 壓縮數據庫的物理大小
2. SP_WHO和SP_WHO2
有2個內置的系統存儲過程比較有用。SP_WHO和SP_WHO2.這兩個腳本能夠提供當前sql鏈接的詳細信息,包括鏈接該數據庫的不一樣應用、鏈接類型、進程鎖定的詳細信息。
exec sp_who2的用法
下面2張圖能夠清晰地看出誰鏈接了數據庫、當前的活動和狀態,BlkBy表明進程被誰鎖定了
3. SQL Server Profiler的使用
Sql Server Profiler能夠實時監測你的數據庫,既能夠跟蹤執行過的語句,也能夠查看EF/Linq的語法生成後的sql語句。
4. RedGate SQL Search
安裝後sql會有提示功能,能夠快速丁文你的數據庫、表、觸發器、存儲過程、索引等。至關好用
5. Brent Ozar
包含一些腳本文件,能夠檢測數據庫的性能、索引分析、計算出最影響查詢性能的地方。它還包括一些有用的檢查清單。
6. Server monitor
數據庫服務器的監控,在發生問題時,會搶先一步客戶經過郵件通知你。
絕大部分資料來源:http://www.codeproject.com/Articles/1060867/DBA-Skills-for-developers