三個影響SQL Server效能關鍵點
資料庫的邏輯設計、包括表與表之間的關係是優化關係型資料庫效能的核心。一個好的邏輯資料庫設計可以為優化資料庫和應用程式打下良好的基礎。
標準化的資料庫邏輯設計包括用多的、有相互關係的窄表來代替很多列的長資料表。下面是一些使用標準化表的一些好處。
A:由於表窄,因此可以使排序和建立索引更為迅速。
B:由於多表,所以多鏃的索引成為可能。
C:更窄更緊湊的索引。
D:每個表中可以有少一些的索引,因此可以提高insert update delete等的速度,因為這些操作在索引多的情況下會對系統效能產生很大的影響。
E:更少的空值和更少的多餘值,增加了資料庫的緊湊性由於標準化,所以會增加了在獲取資料時引用表的數目和其間的連線關係的複雜性。太多的表和複雜的連線關係會降低伺服器的效能,因此在這兩者之間需要綜合考慮。
定義具有相關關係的主鍵和外來鍵時應該注意的事項主要是:用於連線多表的主鍵和參考的鍵要有相同的資料型別。
二、索引的設計
A:儘量避免表掃描
檢查你的查詢語句的where子句,因為這是優化器重要關注的地方。包含在where裡面的每一列(column)都是可能的侯選索引,為能達到最優的效能,考慮在下面給出的例子:對於在where子句中給出了column1這個列。
下面的兩個條件可以提高索引的優化查詢效能!
第一:在表中的column1列上有一個單索引;
第二:在表中有多索引,但是column1是第一個索引的列。
避免定義多索引而column1是第二個或後面的索引,這樣的索引不能優化伺服器效能。
例如:下面的例子用了pubs資料庫。
SELECT au_id, au_lname, au_fname FROM authors WHERE au_lname = ’White’ |
按下面幾個列上建立的索引將會是對優化器有用的索引
au_lname au_lname, au_fname |
而在下面幾個列上建立的索引將不會對優化器起到好的作用
au_address au_fname, au_lname |
考慮使用窄的索引在一個或兩個列上,窄索引比多索引和複合索引更能有效。用窄的索引,在每一頁上將會有更多的行和更少的索引級別(相對與多索引和複合索引而言),這將推進系統效能。對於多列索引,SQL Server維持一個在所有列的索引上的密度統計(用於聯合)和在第一個索引上的histogram(柱狀圖)統計。根據統計結果,如果在複合索引上的第一個索引很少被選擇使用,那麼優化器對很多查詢請求將不會使用索引。
有用的索引會提高select語句的效能,包括insert,uodate,delete。但是,由於改變一個表的內容,將會影響索引。每一個insert,update,delete語句將會使效能下降一些。實驗表明,不要在一個單表上用大量的索引,不要在共享的列上(指在多表中用了參考約束)使用重疊的索引。
在某一列上檢查唯一的資料的個數,比較它與表中資料的行數做一個比較。這就是資料的選擇性,這比較結果將會幫助你決定是否將某一列作為侯選的索引列,如果需要,建哪一種索引。你可以用下面的查詢語句返回某一列的不同值的數目。
select count(distinct cloumn_name) from table_name
假設column_name是一個10000行的表,則看column_name返回值來決定是否應該使用,及應該使用什麼索引。
Unique values Index 5000 Nonclustered index 20 Clustered index 3 No index |
鏃索引和非鏃索引的選擇
<1>鏃索引是行的物理順序和索引的順序是一致的。頁級,低層等索引的各個級別上都包含實際的資料頁。一個表只能是有一個鏃索引。由於update,delete語句要求相對多一些的讀操作,因此鏃索引常常能加速這樣的操作。在至少有一個索引的表中,你應該有一個鏃索引。
在下面的幾個情況下,你可以考慮用鏃索引:
例如: 某列包括的不同值的個數是有限的(但是不是極少的)
顧客表的州名列有50個左右的不同州名的縮寫值,可以使用鏃索引。
例如: 對返回一定範圍內值的列可以使用鏃索引,比如用between,>,>=,
select * from sales where ord_date between ’5/1/93’ and ’6/1/93’
例如: 對查詢時返回大量結果的列可以使用鏃索引。
SELECT * FROM phonebook WHERE last_name = ’Smith’
當有大量的行正在被插入表中時,要避免在本表一個自然增長(例如,identity列)的列上建立鏃索引。如果你建立了鏃的索引,那麼insert的效能就會大大降低。因為每一個插入的行必須到表的最後,表的最後一個資料頁。
當一個資料正在被插入(這時這個資料頁是被鎖定的),所有的其他插入行必須等待直到當前的插入已經結束。
一個索引的葉級頁中包括實際的資料頁,並且在硬碟上的資料頁的次序是跟鏃索引的邏輯次序一樣的。
<2>一個非鏃的索引就是行的物理次序與索引的次序是不同的。一個非鏃索引的葉級包含了指向行資料頁的指標。
在一個表中可以有多個非鏃索引,你可以在以下幾個情況下考慮使用非鏃索引。
在有很多不同值的列上可以考慮使用非鏃索引
例如:一個part_id列在一個part表中
select * from employee where emp_id = ’pcm9809f’
查詢語句中用order by 子句的列上可以考慮使用鏃索引。
三、查詢語句的設計
SQL Server優化器通過分析查詢語句,自動對查詢進行優化並決定最有效的執行方案。優化器分析查詢語句來決定那個子句可以被優化,並針對可以被優化查詢的子句來選擇有用的索引。最後優化器比較所有可能的執行方案並選擇最有效的一個方案出來。
在執行一個查詢時,用一個where子句來限制必須處理的行數,除非完全需要,否則應該避免在一個表中無限制地讀並處理所有的行。
例如下面的例子,
select qty from sales where stor_id=7131
是很有效的比下面這個無限制的查詢
select qty from sales
避免給客戶的最後資料選擇返回大量的結果集。允許SQL Server執行滿足它目的的函式限制結果集的大小是更有效的。
這能減少網路I/O並能提高多使用者的相關併發時的應用程式效能。因為優化器關注的焦點就是where子句的查詢,以利用有用的索引。在表中的每一個索引都可能成為包括在where子句中的侯選索引。為了最好的效能可以遵照下面的用於一個給定列column1的索引。
第一:在表中的column1列上有一個單索引;
第二:在表中有多索引,但是column1是第一個索引的列不要在where子句中使用沒有column1列索引的查詢語句,並避免在where子句用一個多索引的非第一個索引的索引。
這時多索引是沒有用的。
For example, given a multicolumn index on the au_lname, |
下面這個query語句利用了au_lname上的索引
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’ |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-564918/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server效能影響的重要結論SQLServer
- [zt] 影響SQL效能的原因SQL
- 影響Oracle標量子查詢效能的三個因素Oracle
- 影響代理IP訪問速度的兩個關鍵
- 影響網頁渲染的關鍵!網頁
- 影響大學生就業的幾個關鍵問題薦就業
- SQL Server中事務日誌自動增長對效能的影響(下)PGSQLServer
- SQL Server中事務日誌自動增長對效能的影響(上)OSSQLServer
- 【原】影響資料倉儲成功的十個關鍵因素(翻譯)
- SQL Server中的Merge關鍵字SQLServer
- 影響郵件傳送評級的關鍵要素
- MySQL影響伺服器效能的幾個方面MySql伺服器
- 影響你網站效能的 5 個瓶頸網站
- 淺談SQL Server中統計對於查詢的影響SQLServer
- Oracle Lob型別相關引數以及效能影響Oracle型別
- 【SQL Server 優化效能的幾個方面】SQLServer優化
- 谷歌將關閉Autocomplete API 或影響部分關鍵詞工具谷歌API
- 百度流量與關鍵詞工具重大升級:推“關鍵詞影響力”
- 一文詳解|影響成長的關鍵思考
- RAID的概念和RAID對於SQL效能的影響AISQL
- Sql Server之旅——第十站 看看DML操作對索引的影響SQLServer索引
- 批操作效能影響診斷
- 從效能的角度談SQL Server聚集索引鍵的選擇SQLServer索引
- 關於SQL Server 2017,你需要知道5個重點SQLServer
- 福布斯:區塊鏈——社會影響力未來的關鍵區塊鏈
- 【譯】SQL Server誤區30日談-Day6-有關NULL點陣圖的三個誤區SQLServerNull
- 轉:RAID的概念及RAID對於SQL效能的影響AISQL
- SQL Server 2008效能故障排查(三)——I/OSQLServer
- 關於資料庫開啟大頁對效能的影響資料庫
- fixed定位和input獲取焦點影響鍵盤彈出效果
- 影響mysql效能的因素都有哪些MySql
- 影響HTTP效能的常見因素HTTP
- 影響MySQL效能的硬體因素MySql
- 影響MySQL效能的硬體因MySql
- 測試SQL Server各個版本的的效能 (轉)SQLServer
- 軟體效能的設計(三)資料型別對軟體效能的影響 (轉)資料型別
- SQL Server開發10個最重要特點SQLServer
- 影響MongoDB資料庫效能的幾個重要因素MongoDB資料庫