99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀影響SQL server性能的三個方面
影響SQL server性能的三個方面
2018-03-07
收藏

影響SQL server性能的三個方面

1 邏輯數(shù)據(jù)庫和表的設(shè)計

數(shù)據(jù)庫的邏輯設(shè)計、包括表與表之間的關(guān)系是優(yōu)化關(guān)系型數(shù)據(jù)庫性能的核心。一個好的邏輯數(shù)據(jù)庫設(shè)計可以為優(yōu)化數(shù)據(jù)庫和應(yīng)用程序打下良好的基礎(chǔ)。

標準化的數(shù)據(jù)庫邏輯設(shè)計包括用多的、有相互關(guān)系的窄表來代替很多列的長數(shù)據(jù)表。下面是一些使用標準化表的一些好處。
A:由于表窄,因此可以使排序和建立索引更為迅速
B:由于多表,所以多鏃的索引成為可能
C:更窄更緊湊的索引
D:每個表中可以有少一些的索引,因此可以提高insert update delete等的速度,因為這些操作在索引
多的情況下會對系統(tǒng)性能產(chǎn)生很大的影響
E:更少的空值和更少的多余值,增加了數(shù)據(jù)庫的緊湊性
由于標準化,所以會增加了在獲取數(shù)據(jù)時引用表的數(shù)目和其間的連接關(guān)系的復雜性。太多的表和復雜的連接關(guān)系會降低服務(wù)器的性能,因此在這兩者之間需要綜合考慮。
定義具有相關(guān)關(guān)系的主鍵和外來鍵時應(yīng)該注意的事項主要是:用于連接多表的主鍵和參考的鍵要有相同的數(shù)據(jù)類型。
2 索引的設(shè)計
A:盡量避免表掃描
檢查你的查詢語句的where子句,因為這是優(yōu)化器重要關(guān)注的地方。包含在where里面的每一列(column)都是可能的侯選索引,為能達到最優(yōu)的性能,考慮在下面給出的例子:對于在where子句中給出了column1這個列。
下面的兩個條件可以提高索引的優(yōu)化查詢性能!
第一:在表中的column1列上有一個單索引
第二:在表中有多索引,但是column1是第一個索引的列
避免定義多索引而column1是第二個或后面的索引,這樣的索引不能優(yōu)化服務(wù)器性能
例如:下面的例子用了pubs數(shù)據(jù)庫。
SELECT au_id, au_lname, au_fname FROM authors WHERE au_lname = 'White'
按下面幾個列上建立的索引將會是對優(yōu)化器有用的索引
?au_lname
?au_lname, au_fname
而在下面幾個列上建立的索引將不會對優(yōu)化器起到好的作用
?au_address
?au_fname, au_lname
考慮使用窄的索引在一個或兩個列上,窄索引比多索引和復合索引更能有效。用窄的索引,在每一頁上將會有更多的行和更少的索引級別(相對與多索引和復合索引而言),這將推進系統(tǒng)性能。
對于多列索引,SQL Server維持一個在所有列的索引上的密度統(tǒng)計(用于聯(lián)合)和在第一個索引上的histogram(柱狀圖)統(tǒng)計。根據(jù)統(tǒng)計結(jié)果,如果在復合索引上的第一個索引很少被選擇使用,那么優(yōu)化器對很多查詢請求將不會使用索引。
有用的索引會提高select語句的性能,包括insert,uodate,delete。但是,由于改變一個表的內(nèi)容,將會影響索引。每一個insert,update,delete語句將會使性能下降一些。實驗表明,不要在一個單表上用大量的索引,不要在共享的列上(指在多表中用了參考約束)使用重疊的索引。
在某一列上檢查唯一的數(shù)據(jù)的個數(shù),比較它與表中數(shù)據(jù)的行數(shù)做一個比較。這就是數(shù)據(jù)的選擇性,這比較結(jié)果將會幫助你決定是否將某一列作為侯選的索引列,如果需要,建哪一種索引。你可以用下面的查詢語句返回某一列的不同值的數(shù)目。
select count(distinct cloumn_name) from table_name
假設(shè)column_name是一個10000行的表,則看column_name返回值來決定是否應(yīng)該使用,及應(yīng)該使用什么索引。
Unique values Index
5000 Nonclustered index
20 Clustered index
3 No index
B:鏃索引和非鏃索引的選擇
<1:>鏃索引是行的物理順序和索引的順序是一致的。頁級,低層等索引的各個級別上都包含實際的數(shù)據(jù)頁。一個表只能是有一個鏃索引。由于update,delete語句要求相對多一些的讀操作,因此鏃索引常常能加速這樣的操作。在至少有一個索引的表中,你應(yīng)該有一個鏃索引。
在下面的幾個情況下,你可以考慮用鏃索引:
例如: 某列包括的不同值的個數(shù)是有限的(但是不是極少的)
顧客表的州名列有50個左右的不同州名的縮寫值,可以使用鏃索引。
例如: 對返回一定范圍內(nèi)值的列可以使用鏃索引,比如用between,>,>=,<,<=等等來對列進行操作的列上。
select * from sales where ord_date between '5/1/93' and '6/1/93'
例如: 對查詢時返回大量結(jié)果的列可以使用鏃索引。
SELECT * FROM phonebook WHERE last_name = 'Smith'
當有大量的行正在被插入表中時,要避免在本表一個自然增長(例如,identity列)的列上建立鏃索引。如果你建立了鏃的索引,那么insert的性能就會大大降低。因為每一個插入的行必須到表的最后,表的最后一個數(shù)據(jù)頁。
當一個數(shù)據(jù)正在被插入(這時這個數(shù)據(jù)頁是被鎖定的),所有的其他插入行必須等待直到當前的插入已經(jīng)結(jié)束。
一個索引的葉級頁中包括實際的數(shù)據(jù)頁,并且在硬盤上的數(shù)據(jù)頁的次序是跟鏃索引的邏輯次序一樣的。
<2:>一個非鏃的索引就是行的物理次序與索引的次序是不同的。一個非鏃索引的葉級包含了指向行數(shù)據(jù)頁的指針。在一個表中可以有多個非鏃索引,你可以在以下幾個情況下考慮使用非鏃索引。
在有很多不同值的列上可以考慮使用非鏃索引
例如:一個part_id列在一個part表中
select * from employee where emp_id = 'pcm9809f'
查詢語句中用order by 子句的列上可以考慮使用鏃索引
3 查詢語句的設(shè)計
SQL Server優(yōu)化器通過分析查詢語句,自動對查詢進行優(yōu)化并決定最有效的執(zhí)行方案。優(yōu)化器分析查詢語句來決定那個子句可以被優(yōu)化,并針對可以被優(yōu)化查詢的子句來選擇有用的索引。最后優(yōu)化器比較所有可能的執(zhí)行方案并選擇最有效的一個方案出來。在執(zhí)行一個查詢時,用一個where子句來限制必須處理的行數(shù),除非完全需要,否則應(yīng)該避免在一個表中無限制地讀并處理所有的行。例如下面的例子,
select qty from sales where stor_id=7131
是很有效的比下面這個無限制的查詢
select qty from sales
避免給客戶的最后數(shù)據(jù)選擇返回大量的結(jié)果集。允許SQL Server運行滿足它目的的函數(shù)限制結(jié)果集的大小是更有效的。這能減少網(wǎng)絡(luò)I/O并能提高多用戶的相關(guān)并發(fā)時的應(yīng)用程序性能。因為優(yōu)化器關(guān)注的焦點就是where子句的查詢,以利用有用的索引。在表中的每一個索引都可能成為包括在where子句中的侯選索引。為了最好的性能可以遵照下面的用于一個給定列column1的索引。
第一:在表中的column1列上有一個單索引
第二:在表中有多索引,但是column1是第一個索引的列
不要在where子句中使用沒有column1列索引的查詢語句,并避免在where子句用一個多索引的非第一個索引的索引。這時多索引是沒有用的。
For example, given a multicolumn index on the au_lname, au_fname columns of the authors table inthe pubs database,
下面這個query語句利用了au_lname上的索引


SELECT   au_id, au_lname, au_fname  FROM     authors WHERE    au_lname = 'White'  AND au_fname = 'Johnson'----------------------------------SELECT    au_id, au_lname, au_fname  FROM authors WHERE     au_lname = 'White'
下面這個查詢沒有利用索引,因為他使用了多索引的非第一個索引的索引

SELECT au_id, au_lname, au_fname FROM authors WHERE au_fname = 'Johnson'

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }