关于SQL SERVER高并发解决方案
現(xiàn)在大家都比較關(guān)心的問題就是在多用戶高并發(fā)的情況下,如何開發(fā)系統(tǒng),這對我們程序員來說,確實是值得研究,最近找工作面試時也經(jīng)常被問到,其實我早有去關(guān)心和了解這類問題,但一直沒有總結(jié)一下,導(dǎo)致面試時無法很完整全面的回答,所以今天我專門總結(jié)概況了一下關(guān)于SQL SERVER高并發(fā)解決方案,希望能幫助大家,若有不對之外,還請及時告之,謝謝!
SQL SERVER高并發(fā)解決方案主要是從以下幾個方面:
1.SQL語句優(yōu)化:
A.盡可能的精確查詢條件及查詢字段,縮小查詢范圍(包括使用分頁查詢);
B.查詢條件中盡可能少用:like,(not)in,(not)is null,order by,distinct,count(*),!=,<>;
C.不要對查詢的字段進行函數(shù)運算,
如:aa. substring('aa123',1,2)='aa',而應(yīng)該是:'aa123' like 'aa%'; ---應(yīng)用到了索引
bb. 'aa'+'123'='aa123',而應(yīng)該是:'aa'=left('aa123',2)
D.判斷數(shù)據(jù)存在,不要使用TOP 1,而應(yīng)該是:EXITS
E.對于復(fù)雜SQL查詢,可直接使用SQL存儲過程或建立視圖(視圖不可太復(fù)雜);
F.盡可能的少用游標(biāo),觸發(fā)器;
2.表設(shè)計優(yōu)化:
A.縱向分割表設(shè)計,將表按照某種原則(可按照字段讀寫頻率來設(shè)計)設(shè)計成相對應(yīng)的幾個表,之間采用主(外)鍵關(guān)聯(lián)查詢;
B.橫向分割表設(shè)計,將表中的數(shù)據(jù)按照使用價值(比如:只用只用到近3個月的有效數(shù)據(jù))來進行數(shù)據(jù)轉(zhuǎn)移備份,以減少表的數(shù)據(jù)量;
C.表數(shù)據(jù)物理存放分區(qū)設(shè)計,將表中的數(shù)據(jù)按照某種規(guī)則建立物理表分區(qū)來存儲,以降低硬盤的IO負(fù)擔(dān);
D.建立適當(dāng)?shù)乃饕?聚集索引與非聚集索引);
3.事務(wù)設(shè)置優(yōu)化:
事務(wù)隔離級別有:(隔離級別作用于事務(wù)中,而鎖作用于每條SQL語句上)
| 隔離級別 | 臟讀 | 不可重復(fù)讀取 | 幻像 | 說明 | ?產(chǎn)生或等同對應(yīng)的鎖 |
| 未提交讀(read?uncommitted) | 是 | 是 | 是 | 如果其他事務(wù)更新,不管是否提交,立即執(zhí)行 | ?NOLOCK |
| 提交讀(read?committed默認(rèn)) | 否 | 是 | 是 | 讀取提交過的數(shù)據(jù)。如果其他事務(wù)更新沒提交,則等待 | ?HOLDLOCK |
| 可重復(fù)讀(repeatable?read) | 否 | 否 | 是 | 查詢期間,不允許其他事務(wù)update | ?HOLDLOCK |
| 可串行讀(serializable) | 否 | 否 | 否 | 查詢期間,不允許其他事務(wù)insert或delet | ?HOLDLOCK |
A.事務(wù)隔離原則:共享讀,排它寫,即表示:在執(zhí)行查詢時,若對數(shù)據(jù)一致性要求很高時,可采用可重復(fù)讀(repeatable?read)隔離級別,若沒有嚴(yán)格要求,則可建議使用未提交讀(read?uncommitted)隔離級別;
4.服務(wù)器硬件優(yōu)化:
A.服務(wù)器內(nèi)存,硬盤等核心硬件性能當(dāng)然越強越好;
B.購買多臺服務(wù)器并建立集群,以實現(xiàn)利用多個計算機進行并行計算從而獲得很高的計算速度,也可以用多個計算機做備份,從而使得任何一個機器壞了整個系統(tǒng)還是能正常運行;
C.在多臺服務(wù)器建立DB鏡像同步,并實現(xiàn)讀寫分離,即:除了指定的一臺或幾臺服務(wù)器具有允許更新以外,其余的服務(wù)器均只作為數(shù)據(jù)鏡像同步,不能更新,僅供查詢;
總結(jié)
以上是生活随笔為你收集整理的关于SQL SERVER高并发解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 支付宝支付-常用支付API详解(查询、退
- 下一篇: php输出mysqli查询出来的结果