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

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
