現在大家都比較關心的問題就是在多使用者高并發的情況下,如何開發系統,這對我們程式員來說,确實是值得研究,最近找工作面試時也經常被問到,其實我早有去關心和了解這類問題,但一直沒有總結一下,導緻面試時無法很完整全面的回答,是以今天我專門總結概況了一下關于SQL SERVER高并發解決方案,希望能幫助大家,若有不對之外,還請及時告之,謝謝!
SQL SERVER高并發解決方案主要是從以下幾個方面:
1.SQL語句優化:
A.盡可能的精确查詢條件及查詢字段,縮小查詢範圍(包括使用分頁查詢);
B.查詢條件中盡可能少用:like,(not)in,(not)is null,order by,distinct,count(*),!=,<>;
C.不要對查詢的字段進行函數運算,
如:aa. substring('aa123',1,2)='aa',而應該是:'aa123' like 'aa%'; ---應用到了索引
bb. 'aa'+'123'='aa123',而應該是:'aa'=left('aa123',2)
D.判斷資料存在,不要使用TOP 1,而應該是:EXITS
E.對于複雜SQL查詢,可直接使用SQL存儲過程或建立視圖(視圖不可太複雜);
F.盡可能的少用遊标,觸發器;
2.表設計優化:
A.縱向分割表設計,将表按照某種原則(可按照字段讀寫頻率來設計)設計成相對應的幾個表,之間采用主(外)鍵關聯查詢;
B.橫向分割表設計,将表中的資料按照使用價值(比如:隻用隻用到近3個月的有效資料)來進行資料轉移備份,以減少表的資料量;
C.表資料實體存放分區設計,将表中的資料按照某種規則建立實體表分區來存儲,以降低硬碟的IO負擔;
D.建立适當的索引(聚集索引與非聚集索引);
3.事務設定優化:
事務隔離級别有:(隔離級别作用于事務中,而鎖作用于每條SQL語句上)
隔離級别
髒讀
不可重複讀取
幻像
說明
産生或等同對應的鎖
未送出讀(read uncommitted)
是
如果其他事務更新,不管是否送出,立即執行
NOLOCK
送出讀(read committed預設)
否
讀取送出過的資料。如果其他事務更新沒送出,則等待
HOLDLOCK
可重複讀(repeatable read)
查詢期間,不允許其他事務update
可串行讀(serializable)
查詢期間,不允許其他事務insert或delet
A.事務隔離原則:共享讀,排它寫,即表示:在執行查詢時,若對資料一緻性要求很高時,可采用可重複讀(repeatable read)隔離級别,若沒有嚴格要求,則可建議使用未送出讀(read uncommitted)隔離級别;
4.伺服器硬體優化:
A.伺服器記憶體,硬碟等核心硬體性能當然越強越好;
B.購買多台伺服器并建立叢集,以實作利用多個計算機進行并行計算進而獲得很高的計算速度,也可以用多個計算機做備份,進而使得任何一個機器壞了整個系統還是能正常運作;
C.在多台伺服器建立DB鏡像同步,并實作讀寫分離,即:除了指定的一台或幾台伺服器具有允許更新以外,其餘的伺服器均隻作為資料鏡像同步,不能更新,僅供查詢;