提高SQL Server效能

2021-07-25 03:10:01 字數 4862 閱讀 5824

如何提高sql server的效能

提供sql server效能總的來說有兩種方式:

1、擴容,提高伺服器效能,顯著提高cpu、記憶體,解決磁碟i/o瓶頸。

2、優化應用程式

引起資料效能問題主要原因:

1.    不了解系統效能和可擴充套件行

2.    一次檢索太多資料

3.    錯誤的使用資料庫事務

4.    錯誤的使用資料庫索引

5.    混淆oltp、olap和報表工作負載

6.    相對低效的模式schema

7.    使用了相對低效的磁碟

模式

什麼是高效的模式?

1.    模式設計不能太隨意

2.    分離olap和oltp工作負載

3.    設計時首先遵循正規化,後續再基於效能進行反正規化設計。

4.    定義號所有的主鍵和外來鍵關係

5.    選擇合適的資料型別(小於8000的字元型別,建議使用varchar而非text。對於使用unicode的場景,建議使用nchar和nvarchar;sql_variant儲存型別靈活,但代價是影響效能,因為涉及型別轉換)

6.    對於反正規化設計,請使用索引檢視。

7.     對錶進行水平拆分和垂直拆分

查詢語句

1.    書寫高效的查詢語句

2.    了解你所書寫的查詢語句的效能和可擴充套件性特徵。

3.    查詢語句首先要正確,比如:檢查join語句中的on後面的關聯字段,特別注意確保不會出現笛卡爾積的情況。

4.    避免使用*,查詢語句只返回必須的行和列

5.    避免使用類似note like的運算子

6.    where語句中,盡量避免使用顯式或者隱式的函式,因為優化器不會針對函式中的列使用索引,這種場景下,列被當成了表示式而非列,所以列就不會在執行計畫優化中使用。

比如,對於日期列,盡量將其轉換為文字表示式,下面這種情況下是全表掃瞄

selectorderid from northwind.dbo.orders where dateadd(day, 15,

orderdate)= '07/23/1996'

而下面這種場景就會使用索引

selectorderid from northwind.dbo.orders where orderdate = dateadd(day, -15,'07/23/1996')

7.    另外要特別小心因型別不一致所導致的隱式的型別轉換也會引起表掃瞄和索引掃瞄,

比如,資料庫定義nvarchar,而變數定義varchar,資料庫定義nchar,而變數定義char,這都會引起隱式型別轉換和掃瞄

索引使用統計資訊中dm_db_index_usage_stats,有針對scan和seek統計資訊,scan是掃瞄,seek索引查詢

使用鎖和隔離等級提示來減少鎖影響

sql中有三種型別的鎖:共享、更新、排他。鎖對資料庫效能影響巨大,sql事務中你可以指定四種ansi級別的隔離等級:

readuncommitted:可導致髒讀

readcommitted: 可導致不可重複(預設級別)

repeatableread:可導致幻讀

serializable

8.    使用select語句時,建議使用with nolock,with readcommitted避免產生不必要的讀鎖。

9.    處理死鎖乙個慣用做法是針對事務中涉及的查詢語句使用updlock

10. 對於批量插入的場景,建議對錶使用tablock

使用儲存過程或者引數化查詢

對於在實際開發中就是該選擇過程過程或引數化查詢,還是在應用程式中個使用嵌入sql,考慮以下場景:

1.    邏輯分離

2.    優化與部署

3.    網路頻寬

4.    簡化的批量操作

5.    提高資料安全性和完整性

6.    防止sql注入

減少游標的使用

避免觸發器上進行耗時長的操作,很可能會引起鎖操作

正確的使用臨時表和表變數

如果程式頻繁的建立臨時表,建議考慮使用表變數或者持久表

減少查詢提示和索引提示

表提示(merge, hash, loop, and force order )這些會直接導致優化器選擇使用一種連線演算法,索引提示是告訴優化器使用某個索引的表提示。通常情況下,查詢優化器會使用執行效率最高的執行計畫。強制指定索引或者連線演算法不推薦。

使用完整匹配的資料庫物件

比如:

推薦使用

select* from dbo.authors statement or the exec dbo.custordershist 而非

select* from authors or the exec custorderhist

明確指定資料庫物件的所有者,這樣可儘量減少名字解析的成本。

索引

索引對於高效的資料訪問至關重要。

1.    要基於使用場景建立資料索引。

如果表很少查詢,不建議建立索引。不要在bit、text、ntext或者image型別上建索引。不要建立寬索引或者索引無法選擇

2.    聚集索引應盡量小

3.    範圍資料考慮建立聚集索引,比如:查詢語句中的between,或者》 <

4.    在所有的外來鍵上建立索引。

5.    在區分度高(資料密度低)列上建立索引。

6.    為經常使用、影響大的查詢建立覆蓋索引。

7.    多個窄索引要好於寬索引。

8.    組合索引只有第一列儲存統計資訊,所以建立組合索引要將最受限制的列放在第乙個。

9.    where, order by, group by 以及distinct語句中的列宜建立索引。

10. 刪除未使用的索引

11. 使用索引優化嚮導

事務

1.    避免執行時間長的事務。

2.    避免使用需要使用者輸入提交的事務。

3.    避免在事務結束時訪問大量資料

4.    盡量在事務中以相同的順序訪問資料庫資源。

5.    使用隔離等級提示以減少資料庫鎖。

6.    明確使用事務提交或回滾

儲存過程

1.    儲存過程中使用set nocount on,這樣sql server伺服器就不會在儲存過程中每執行一句就傳送一次done_in_proc訊息了。

2.    對於自定義儲存過程,不要使用sp_prefix

執行計畫

1.    評估查詢執行計畫

2.    避免表掃瞄和索引掃瞄

3.    評估雜湊連線

4.    評估bookmarks

5.    評估排序和過濾器

6.    比較實際和預估行數與執行次數。

預編譯執行計畫

1.    使用儲存過程或引數化查詢

2.    對於動態sql使用sp_executesql

3.    避免在儲存過程中交叉使用ddl和dml,包括在tempdb使用ddl

4.    避免在臨時表中使用游標

sqlxml

1.    避免在大的xml文件中使用openxml

2.    避免在xml文件中使用大併發的openxml

優化

1.    通過sql profiler確定執行時間長的查詢

2.    留意使用率高的小查詢

3.    用sp_lock sp_who2 來檢視死鎖和阻塞

4.    檢視master資料庫sysprocesses中的waittype和waittime

5.    使用dbcc opentran來檢視執行時間長的事務。

測試

當試圖以大量測試資料來填充表時,注意以下原則:

1.    確保事務日誌不會填滿

2.    為資料增長做好預算

3.    通過工具來填充資料

4.    使用現有的生產資料

5.    通過正常的使用者場景以確保讀寫操作平衡

6.    通過測試工具來進行壓力和負載測試

監控

1.    保持統計資訊最新,這對查詢優化器選擇最佳執行計畫至關重要

2.    用sql profiler來優化執行時間長的查詢

3.    用sql profiler來監控表掃瞄和索引掃瞄

4.    使用效能監視器來監控高資源使用率

5.    建立操作與開發反饋迴路

部署

1.    如無特殊要求,使用資料庫預設配置

2.    保持資料和日誌與臨時表在不同的磁碟

3.    對於頻繁訪問的表和索引提供單獨磁碟

4.    使用合適的raid配置

5.    使用多個磁碟控制器

6.    預擴充資料和日誌庫,避免自動增長和碎片效能影響

7.    最大化可用記憶體

8.    管理索引碎片(刪除重建索引、使用dbcc dbreindex命令、使用dbcc indexdefrag命令,注意使用前兩種命令會引起資料庫鎖,而dbcc indexdefrag 不會鎖資料庫資源)

9.    時刻謹記資料庫管理任務

原文:

用索引提高SQL Server效能

用索引提高sql server效能url 特別說明 在微軟的sql server系統中通過有效的使用索引可以提高資料庫的查詢效能,但是效能的提高取決於資料庫的實現。在本文中將會告訴你如何實現索引並有效的提高資料庫的效能。在關係型資料庫中使用索引能夠提高資料庫效能,這一點是非常明顯的。用的索引越多,從...

SQL SERVER效能優化 查詢速度提高

近段時間去面試,很多都會問到關於sql語句優化及大資料量資料查詢速度提公升的問題,但是由於我個人之前開發都是一知半解的狀態,很多東西都沒能掌握明白,感覺自己就是菜鳥一枚,暈死,和朋友閒聊聊到查詢效率的提公升可以通過建立聚集索引分割槽。所以,就好好了解下這其中的原理。一.索引的概念 資料庫索引,是資料...

SQLServer對合併複製效能的提高

本文主要將由sql server為你的合併複製功能提供改善途徑。當然方法不只一種,但究其效能,最好的方法應屬盡可能地執行合併 然而,當你的使用者不 時,你就無法執行合併 並且你應該勸告你的使用者盡量頻繁進行同步。那麼就來看看以下的講解吧。1 使用合適的配置檔案 profile 關於合併複製效能,你有...