IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置: 首頁(yè)數(shù)據(jù)庫(kù)MSSQL → 影響SQL server性能的關(guān)鍵三個(gè)方面

影響SQL server性能的關(guān)鍵三個(gè)方面

時(shí)間:2015-06-28 00:00:00 來(lái)源:IT貓撲網(wǎng) 作者:網(wǎng)管聯(lián)盟 我要評(píng)論(0)

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

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

  標(biāo)準(zhǔn)化的數(shù)據(jù)庫(kù)邏輯設(shè)計(jì)包括用多的、有相互關(guān)系的窄表來(lái)代替很多列的長(zhǎng)數(shù)據(jù)表。下面是一些使用標(biāo)準(zhǔn)化表的一些好處。

A:由于表窄,因此可以使排序和建立索引更為迅速
B:由于多表,所以多鏃的索引成為可能
C:更窄更緊湊的索引
D:每個(gè)表中可以有少一些的索引,因此可以提高insert update delete等的速度,因?yàn)檫@些操作在索引多的情況下會(huì)對(duì)系統(tǒng)性能產(chǎn)生很大的影響
E:更少的空值和更少的多余值,增加了數(shù)據(jù)庫(kù)的緊湊性由于標(biāo)準(zhǔn)化,所以會(huì)增加了在獲取數(shù)據(jù)時(shí)引用表的數(shù)目和其間的連接關(guān)系的復(fù)雜性。太多的表和復(fù)雜的連接關(guān)系會(huì)降低服務(wù)器的性能,因此在這兩者之間需要綜合考慮。

  定義具有相關(guān)關(guān)系的主鍵和外來(lái)鍵時(shí)應(yīng)該注意的事項(xiàng)主要是:用于連接多表的主鍵和參考的鍵要有相同的數(shù)據(jù)類型。

  2 索引的設(shè)計(jì)
A:盡量避免表掃描
檢查你的查詢語(yǔ)句的where子句,因?yàn)檫@是優(yōu)化器重要關(guān)注的地方。包含在where里面的每一列(column)都是可能的侯選索引,為能達(dá)到最優(yōu)的性能,考慮在下面給出的例子:對(duì)于在where子句中給出了column1這個(gè)列。
下面的兩個(gè)條件可以提高索引的優(yōu)化查詢性能!

第一:在表中的column1列上有一個(gè)單索引

第二:在表中有多索引,但是column1是第一個(gè)索引的列
避免定義多索引而column1是第二個(gè)或后面的索引,這樣的索引不能優(yōu)化服務(wù)器性能
例如:下面的例子用了pubs數(shù)據(jù)庫(kù)。
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = ’White’
按下面幾個(gè)列上建立的索引將會(huì)是對(duì)優(yōu)化器有用的索引
?au_lname
?au_lname, au_fname
而在下面幾個(gè)列上建立的索引將不會(huì)對(duì)優(yōu)化器起到好的作用
?au_address
?au_fname, au_lname
考慮使用窄的索引在一個(gè)或兩個(gè)列上,窄索引比多索引和復(fù)合索引更能有效。用窄的索引,在每一頁(yè)上
將會(huì)有更多的行和更少的索引級(jí)別(相對(duì)與多索引和復(fù)合索引而言),這將推進(jìn)系統(tǒng)性能。
對(duì)于多列索引,SQL Server維持一個(gè)在所有列的索引上的密度統(tǒng)計(jì)(用于聯(lián)合)和在第一個(gè)索引上的
histogram(柱狀圖)統(tǒng)計(jì)。根據(jù)統(tǒng)計(jì)結(jié)果,如果在復(fù)合索引上的第一個(gè)索引很少被選擇使用,那么優(yōu)化器對(duì)很多查詢請(qǐng)求將不會(huì)使用索引。
有用的索引會(huì)提高select語(yǔ)句的性能,包括insert,uodate,delete。
但是,由于改變一個(gè)表的內(nèi)容,將會(huì)影響索引。每一個(gè)insert,update,delete語(yǔ)句將會(huì)使性能下降一些。實(shí)驗(yàn)表明,不要在一個(gè)單表上用大量的索引,不要在共享的列上(指在多表中用了參考約束)使用重疊的索引。
在某一列上檢查唯一的數(shù)據(jù)的個(gè)數(shù),比較它與表中數(shù)據(jù)的行數(shù)做一個(gè)比較。這就是數(shù)據(jù)的選擇性,這比較結(jié)果將會(huì)幫助你決定是否將某一列作為侯選的索引列,如果需要,建哪一種索引。你可以用下面的查詢語(yǔ)句返回某一列的不同值的數(shù)目。
select count(distinct cloumn_name) from table_name
假設(shè)column_name是一個(gè)10000行的表,則看column_name返回值來(lái)決定是否應(yīng)該使用,及應(yīng)該使用什么索引。
Unique values Index

5000 Nonclustered index
20 Clustered index
3 No index

鏃索引和非鏃索引的選擇

<1:>鏃索引是行的物理順序和索引的順序是一致的。頁(yè)級(jí),低層等索引的各個(gè)級(jí)別上都包含實(shí)際的數(shù)據(jù)頁(yè)。一個(gè)表只能是有一個(gè)鏃索引。由于update,delete語(yǔ)句要求相對(duì)多一些的讀操作,因此鏃索引常常能加速這樣的操作。在至少有一個(gè)索引的表中,你應(yīng)該有一個(gè)鏃索引。
在下面的幾個(gè)情況下,你可以考慮用鏃索引:
例如: 某列包括的不同值的個(gè)數(shù)是有限的(但是不是極少的)
顧客表的州名列有50個(gè)左右的不同州名的縮寫值,可以使用鏃索引。
例如: 對(duì)返回一定范圍內(nèi)值的列可以使用鏃索引,比如用between,>,>=,<,<=等等來(lái)對(duì)列進(jìn)行操作的列上。
select * from sales where ord_date between ’5/1/93’ and ’6/1/93’
例如: 對(duì)查詢時(shí)返回大量結(jié)果的列可以使用鏃索引。
SELECT * FROM phonebook WHERE last_name = ’Smith’

當(dāng)有大量的行正在被插入表中時(shí),要避免在本表一個(gè)自然增長(zhǎng)(例如,identity列)的列上建立鏃索引。如果你建立了鏃的索引,那么insert的性能就會(huì)大大降低。因?yàn)槊恳粋€(gè)插入的行必須到表的最后,表的最后一個(gè)數(shù)據(jù)頁(yè)。
當(dāng)一個(gè)數(shù)據(jù)正在被插入(這時(shí)這個(gè)數(shù)據(jù)頁(yè)是被鎖定的),所有的其他插入行必須等待直到當(dāng)前的插入已經(jīng)結(jié)束。
一個(gè)索引的葉級(jí)頁(yè)中包括實(shí)際的數(shù)據(jù)頁(yè),并且在硬盤上的數(shù)據(jù)頁(yè)的次序是跟鏃索引的邏輯次序一樣的。

<2:>一個(gè)非鏃的索引就是行的物理次序與索引的次序是不同的。一個(gè)非鏃索引的葉級(jí)包含了指向行數(shù)據(jù)頁(yè)的指針。
在一個(gè)表中可以有多個(gè)非鏃索引,你可以在以下幾個(gè)情況下考慮使用非鏃索引。
在有很多不同值的列上可以考慮使用非鏃索引
例如:一個(gè)part_id列在一個(gè)part表中
select * from employee where emp_id = ’pcm9809f’
查詢語(yǔ)句中用order by 子句的列上可以考慮使用鏃索引

3 查詢語(yǔ)句的設(shè)計(jì)

SQL Server優(yōu)化器通過(guò)分析查詢語(yǔ)句,自動(dòng)對(duì)查詢進(jìn)行優(yōu)化并決定最有效的執(zhí)行方案。優(yōu)化器分析查詢語(yǔ)句來(lái)決定那個(gè)子句可以被優(yōu)化,并針對(duì)可以被優(yōu)化查詢的子句來(lái)選擇有用的索引。最后優(yōu)化器比較所有可能的執(zhí)行方案并選擇最有效的一個(gè)方案出來(lái)。
在執(zhí)行一個(gè)查詢時(shí),用一個(gè)where子句來(lái)限制必須處理的行數(shù),除非完全需要,否則應(yīng)該避免在一個(gè)表中無(wú)限制地讀并處理所有的行。
例如下面的例子,
select qty from sales where stor_id=7131
是很有效的比下面這個(gè)無(wú)限制的查詢
select qty from sales
避免給客戶的最后數(shù)據(jù)選擇返回大量的結(jié)果集。允許SQL Server運(yùn)行滿足它目的的函數(shù)限制結(jié)果集的大小是更有效的。
這能減少網(wǎng)絡(luò)I/O并能提高多用戶的相關(guān)并發(fā)時(shí)的應(yīng)用程序性能。因?yàn)閮?yōu)化器關(guān)注的焦點(diǎn)就是where子句的查詢,以利用有用的索引。在表中的每一個(gè)索引都可能成為包括在where子句中的侯選索引。為了最好的性能可以遵照下面的用于一個(gè)給定列column1的索引。

第一:在表中的column1列上有一個(gè)單索引

第二:在表中有多索引,但是column1是第一個(gè)索引的列不要在where子句中使用沒(méi)有column1列索引的查詢語(yǔ)句,并避免在where子句用一個(gè)多索引的非第一個(gè)索引的索引。
這時(shí)多索引是沒(méi)有用的。
For example, given a multicolumn index on the au_lname, au_fname columns of the authors table in
the pubs database,
下面這個(gè)query語(yǔ)句利用了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’
下面這個(gè)查詢沒(méi)有利用索引,因?yàn)樗褂昧硕嗨饕姆堑谝粋€(gè)索引的索引
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_fname = ’Johnson’

關(guān)鍵詞標(biāo)簽:三個(gè),方面,關(guān)鍵,性能,

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 SqlServer2005對(duì)現(xiàn)有數(shù)據(jù)進(jìn)行分區(qū)具體步驟 sql server系統(tǒng)表?yè)p壞的解決方法 sql server系統(tǒng)表?yè)p壞的解決方法 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系 MS-SQL2005服務(wù)器登錄名、角色、數(shù)據(jù)庫(kù)用戶、角色、架構(gòu)的關(guān)系

相關(guān)下載

    人氣排行 配置和注冊(cè)O(shè)DBC數(shù)據(jù)源-odbc數(shù)據(jù)源配置教程 如何遠(yuǎn)程備份(還原)SQL2000數(shù)據(jù)庫(kù) SQL2000數(shù)據(jù)庫(kù)遠(yuǎn)程導(dǎo)入(導(dǎo)出)數(shù)據(jù) SQL2000和SQL2005數(shù)據(jù)庫(kù)服務(wù)端口查看或修改 修改Sql Server唯一約束教程 SQL Server 2005降級(jí)到2000的正確操作步驟 sql server系統(tǒng)表?yè)p壞的解決方法 淺談JSP JDBC來(lái)連接SQL Server 2005的方法