1 邏輯數(shù)據(jù)庫和表的設(shè)計(jì)
數(shù)據(jù)庫的邏輯設(shè)計(jì)、包括表與表之間的關(guān)系是優(yōu)化關(guān)系型數(shù)據(jù)庫性能的核心。一個(gè)好的邏輯數(shù)據(jù)庫設(shè)計(jì)可以為優(yōu)化數(shù)據(jù)庫和應(yīng)用程序打下良好的基礎(chǔ)。
標(biāo)準(zhǔn)化的數(shù)據(jù)庫邏輯設(shè)計(jì)包括用多的、有相互關(guān)系的窄表來代替很多列的長數(shù)據(jù)表。下面是一些使用標(biāo)準(zhǔn)化表的一些好處。
A:由于表窄,因此可以使排序和建立索引更為迅速
B:由于多表,所以多鏃的索引成為可能
C:更窄更緊湊的索引
D:每個(gè)表中可以有少一些的索引,因此可以提高insert update delete等的速度,因?yàn)檫@些操作在索引多的情況下會(huì)對系統(tǒng)性能產(chǎn)生很大的影響
E:更少的空值和更少的多余值,增加了數(shù)據(jù)庫的緊湊性
由于標(biāo)準(zhǔn)化,所以會(huì)增加了在獲取數(shù)據(jù)時(shí)引用表的數(shù)目和其間的連接關(guān)系的復(fù)雜性。太多的表和復(fù)雜的連接關(guān)系會(huì)降低服務(wù)器的性能,因此在這兩者之間需要綜合考慮。
定義具有相關(guān)關(guān)系的主鍵和外來鍵時(shí)應(yīng)該注意的事項(xiàng)主要是:用于連接多表的主鍵和參考的鍵要有相同的數(shù)據(jù)類型。
2 索引的設(shè)計(jì)
A:盡量避免表掃描
檢查你的查詢語句的where子句,因?yàn)檫@是優(yōu)化器重要關(guān)注的地方。包含在where里面的每一列(column)都是可能的侯選索引,為能達(dá)到的性能,考慮在下面給出的例子:對于在where子句中給出了column1這個(gè)列。
下面的兩個(gè)條件可以提高索引的優(yōu)化查詢性能!
第一:在表中的column1列上有一個(gè)單索引
第二:在表中有多索引,但是column1是第一個(gè)索引的列避免定義多索引而column1是第二個(gè)或后面的索引,這樣的索引不能優(yōu)化服務(wù)器性能
例如:下面的例子用了pubs數(shù)據(jù)庫。
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = 'White'
按下面幾個(gè)列上建立的索引將會(huì)是對優(yōu)化器有用的索引
?au_lname
?au_lname, au_fname
而在下面幾個(gè)列上建立的索引將不會(huì)對優(yōu)化器起到好的作用
?au_address
?au_fname, au_lname
考慮使用窄的索引在一個(gè)或兩個(gè)列上,窄索引比多索引和復(fù)合索引更能有效。用窄的索引,在每一頁上將會(huì)有更多的行和更少的索引級(jí)別(相對與多索引和復(fù)合索引而言),這將推進(jìn)系統(tǒng)性能。
對于多列索引,SQL Server維持一個(gè)在所有列的索引上的密度統(tǒng)計(jì)(用于聯(lián)合)和在第一個(gè)索引上的histogram(柱狀圖)統(tǒng)計(jì)。根據(jù)統(tǒng)計(jì)結(jié)果,如果在復(fù)合索引上的第一個(gè)索引很少被選擇使用,那么優(yōu)化器對很多查詢請求將不會(huì)使用索引。
有用的索引會(huì)提高select語句的性能,包括insert,uodate,delete。
但是,由于改變一個(gè)表的內(nèi)容,將會(huì)影響索引。每一個(gè)insert,update,delete語句將會(huì)使性能下降一些。實(shí)驗(yàn)表明,不要在一個(gè)單表上用大量的索引,不要在共享的列上(指在多表中用了參考約束)使用重疊的索引。
在某一列上檢查的數(shù)據(jù)的個(gè)數(shù),比較它與表中數(shù)據(jù)的行數(shù)做一個(gè)比較。這就是數(shù)據(jù)的選擇性,這比較結(jié)果將會(huì)幫助你決定是否將某一列作為侯選的索引列,如果需要,建哪一種索引。你可以用下面的查詢語句返回某一列的不同值的數(shù)目。
select count(distinct cloumn_name) from table_name
假設(shè)column_name是一個(gè)10000行的表,則看column_name返回值來決定是否應(yīng)該使用,及應(yīng)該使用什么索引。
Unique values Index
5000 Nonclustered index
20 Clustered index
3 No index
數(shù)據(jù)庫的邏輯設(shè)計(jì)、包括表與表之間的關(guān)系是優(yōu)化關(guān)系型數(shù)據(jù)庫性能的核心。一個(gè)好的邏輯數(shù)據(jù)庫設(shè)計(jì)可以為優(yōu)化數(shù)據(jù)庫和應(yīng)用程序打下良好的基礎(chǔ)。
標(biāo)準(zhǔn)化的數(shù)據(jù)庫邏輯設(shè)計(jì)包括用多的、有相互關(guān)系的窄表來代替很多列的長數(shù)據(jù)表。下面是一些使用標(biāo)準(zhǔn)化表的一些好處。
A:由于表窄,因此可以使排序和建立索引更為迅速
B:由于多表,所以多鏃的索引成為可能
C:更窄更緊湊的索引
D:每個(gè)表中可以有少一些的索引,因此可以提高insert update delete等的速度,因?yàn)檫@些操作在索引多的情況下會(huì)對系統(tǒng)性能產(chǎn)生很大的影響
E:更少的空值和更少的多余值,增加了數(shù)據(jù)庫的緊湊性
由于標(biāo)準(zhǔn)化,所以會(huì)增加了在獲取數(shù)據(jù)時(shí)引用表的數(shù)目和其間的連接關(guān)系的復(fù)雜性。太多的表和復(fù)雜的連接關(guān)系會(huì)降低服務(wù)器的性能,因此在這兩者之間需要綜合考慮。
定義具有相關(guān)關(guān)系的主鍵和外來鍵時(shí)應(yīng)該注意的事項(xiàng)主要是:用于連接多表的主鍵和參考的鍵要有相同的數(shù)據(jù)類型。
2 索引的設(shè)計(jì)
A:盡量避免表掃描
檢查你的查詢語句的where子句,因?yàn)檫@是優(yōu)化器重要關(guān)注的地方。包含在where里面的每一列(column)都是可能的侯選索引,為能達(dá)到的性能,考慮在下面給出的例子:對于在where子句中給出了column1這個(gè)列。
下面的兩個(gè)條件可以提高索引的優(yōu)化查詢性能!
第一:在表中的column1列上有一個(gè)單索引
第二:在表中有多索引,但是column1是第一個(gè)索引的列避免定義多索引而column1是第二個(gè)或后面的索引,這樣的索引不能優(yōu)化服務(wù)器性能
例如:下面的例子用了pubs數(shù)據(jù)庫。
SELECT au_id, au_lname, au_fname FROM authors
WHERE au_lname = 'White'
按下面幾個(gè)列上建立的索引將會(huì)是對優(yōu)化器有用的索引
?au_lname
?au_lname, au_fname
而在下面幾個(gè)列上建立的索引將不會(huì)對優(yōu)化器起到好的作用
?au_address
?au_fname, au_lname
考慮使用窄的索引在一個(gè)或兩個(gè)列上,窄索引比多索引和復(fù)合索引更能有效。用窄的索引,在每一頁上將會(huì)有更多的行和更少的索引級(jí)別(相對與多索引和復(fù)合索引而言),這將推進(jìn)系統(tǒng)性能。
對于多列索引,SQL Server維持一個(gè)在所有列的索引上的密度統(tǒng)計(jì)(用于聯(lián)合)和在第一個(gè)索引上的histogram(柱狀圖)統(tǒng)計(jì)。根據(jù)統(tǒng)計(jì)結(jié)果,如果在復(fù)合索引上的第一個(gè)索引很少被選擇使用,那么優(yōu)化器對很多查詢請求將不會(huì)使用索引。
有用的索引會(huì)提高select語句的性能,包括insert,uodate,delete。
但是,由于改變一個(gè)表的內(nèi)容,將會(huì)影響索引。每一個(gè)insert,update,delete語句將會(huì)使性能下降一些。實(shí)驗(yàn)表明,不要在一個(gè)單表上用大量的索引,不要在共享的列上(指在多表中用了參考約束)使用重疊的索引。
在某一列上檢查的數(shù)據(jù)的個(gè)數(shù),比較它與表中數(shù)據(jù)的行數(shù)做一個(gè)比較。這就是數(shù)據(jù)的選擇性,這比較結(jié)果將會(huì)幫助你決定是否將某一列作為侯選的索引列,如果需要,建哪一種索引。你可以用下面的查詢語句返回某一列的不同值的數(shù)目。
select count(distinct cloumn_name) from table_name
假設(shè)column_name是一個(gè)10000行的表,則看column_name返回值來決定是否應(yīng)該使用,及應(yīng)該使用什么索引。
Unique values Index
5000 Nonclustered index
20 Clustered index
3 No index