編寫和優化SQL Server的儲存過程
二、簡介:在資料庫的開發過程中,經常會遇到複雜的業務邏輯和對資料庫的操作,這個時候就會用SP來封裝資料庫操作。如果專案的SP較多,書寫又沒有一定的規範,將會影響以後的系統維護困難和大SP邏輯的難以理解,另外如果資料庫的資料量大或者專案對SP的效能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的SP要比一個效能差的SP的效率甚至高几百倍。
三、正文內容:
1、開發人員如果用到其他庫的Table或View,務必在當前庫中建立View來實現跨庫操作,最好不要直接使用“databse.dbo.table_name”,因為sp_depends不能顯示出該SP所使用的跨庫table或view,不方便校驗。
2、開發人員在提交SP前,必須已經使用set showplan on分析過查詢計劃,做過自身的查詢優化檢查。
3、高程式執行效率,優化應用程式,在SP編寫過程中應該注意以下幾點:
a)SQL的使用規範:
i. 儘量避免大事務操作,慎用holdlock子句,提高系統併發能力。
ii. 儘量避免反覆訪問同一張或幾張表,尤其是資料量較大的表,可以考慮先根據條件提取資料到臨時表中,然後再做連線。
iii. 儘量避免使用遊標,因為遊標的效率較差,如果遊標操作的資料超過1萬行,那麼就應該改寫;如果使用了遊標,就要儘量避免在遊標迴圈中再進行表連線的操作。
iv. 注意where字句寫法,必須考慮語句順序,應該根據索引順序、範圍大小來確定條件子句的前後順序,儘可能的讓欄位順序與索引順序相一致,範圍從大到小。
v. 不要在where子句中的“=”左邊進行函式、算術運算或其他表示式運算,否則系統將可能無法正確使用索引。
vi. 儘量使用exists代替select count(1)來判斷是否存在記錄,count函式只有在統計表中所有行數時使用,而且count(1)比count(*)更有效率。
vii. 儘量使用“>=”,不要使用“>”。
viii. 注意一些or子句和union子句之間的替換
ix. 注意表之間連線的資料型別,避免不同型別資料之間的連線。
x. 注意儲存過程中引數和資料型別的關係。
xi. 注意insert、update操作的資料量,防止與其他應用衝突。如果資料量超過200個資料頁面(400k),那麼系統將會進行鎖升級,頁級鎖會升級成表級鎖。
b)索引的使用規範:
i. 索引的建立要與應用結合考慮,建議大的OLTP表不要超過6個索引。
ii. 儘可能的使用索引欄位作為查詢條件,尤其是聚簇索引,必要時可以通過index index_name來強制指定索引
iii. 避免對大表查詢時進行table scan,必要時考慮新建索引。
iv. 在使用索引欄位作為條件時,如果該索引是聯合索引,那麼必須使用到該索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用。
v. 要注意索引的維護,週期性重建索引,重新編譯儲存過程。
c)tempdb的使用規範:
i. 儘量避免使用distinct、order by、group by、having、join、cumpute,因為這些語句會加重tempdb的負擔。
ii. 避免頻繁建立和刪除臨時表,減少系統表資源的消耗。
iii. 在新建臨時表時,如果一次性插入資料量很大,那麼可以使用select into代替create table,避免log,提高速度;如果資料量不大,為了緩和系統表的資源,建議先create table,然後insert。
iv. 如果臨時表的資料量較大,需要建立索引,那麼應該將建立臨時表和建立索引的過程放在單獨一個子儲存過程中,這樣才能保證系統能夠很好的使用到該臨時表的索引。
v. 如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先truncate table,然後drop table,這樣可以避免系統表的較長時間鎖定。
vi. 慎用大的臨時表與其他大表的連線查詢和修改,減低系統表負擔,因為這種操作會在一條語句中多次使用tempdb的系統表。
d)合理的演算法使用:
根據上面已提到的SQL優化技術和ASE Tuning手冊中的SQL優化內容,結合實際應用,採用多種演算法進行比較,以獲得消耗資源最少、效率最高的方法。具體可用ASE調優命令:set statistics io on, set statistics time on , set showplan on 等。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-566612/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server儲存過程的優缺點SQLServer儲存過程
- Q&A:在SQL Server 2005中編寫儲存過程RVSQLServer儲存過程
- SQL SERVER儲存過程AS和GO的含義SQLServer儲存過程Go
- SQL server儲存過程函式SQLServer儲存過程函式
- 【SQL Server】常見系統儲存過程SQLServer儲存過程
- SQL Server 2005的複製儲存過程選項BYSQLServer儲存過程
- Ms Sql Server查詢儲存過程中的內容SQLServer儲存過程
- SQL Server 資料訪問策略:儲存過程QCSQLServer儲存過程
- SQL Server實戰六:T-SQL、遊標、儲存過程的操作SQLServer儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- SQL Server儲存過程模擬HTTP請求POST和GET協議SQLServer儲存過程HTTP協議
- SQL Server實戰五:儲存過程與觸發器SQLServer儲存過程觸發器
- SQL 分頁儲存過程SQL儲存過程
- Oracle優化案例-儲存過程的優化思路(二十三)Oracle優化儲存過程
- SQL SERVER 臨時表導致儲存過程重編譯(recompile)的一些探討SQLServer儲存過程編譯Compile
- 關於SQL server2008除錯儲存過程的完整步驟SQLServer除錯儲存過程
- MySQL優化---儲存過程和儲存函式-1-轉自部落格園MySql優化儲存過程儲存函式
- Sql儲存過程分頁--臨時表儲存SQL儲存過程
- 使用SQL SERVER儲存過程實現歷史資料遷移SQLServer儲存過程
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- 資料庫分庫,原來 SQL 和儲存過程寫的報表咋辦?資料庫SQL儲存過程
- oracle儲存過程書寫格式Oracle儲存過程
- 配置SQL Server Service Broker來傳送儲存過程資料(下)SASQLServer儲存過程
- 配置SQL Server Service Broker來傳送儲存過程資料(上)CYSQLServer儲存過程
- 關於SQL Server中儲存過程在C#中呼叫的簡單示例SQLServer儲存過程C#
- SQL Server資料庫遠端更新目標表資料的儲存過程SQLServer資料庫儲存過程
- MySQL的寫入資料儲存過程MySql儲存過程
- MySQL儲存過程的建立和使用MySql儲存過程
- SQL Server的巢狀儲存過程中使用同名的臨時表怪像淺析SQLServer巢狀儲存過程
- MySQL儲存過程裡動態SQL的使用UXMySql儲存過程UX
- [SQL Server玩轉Python] 三.SQL Server儲存過程實現Python鳶尾花決策樹訓練及預測SQLServerPython儲存過程
- SQL SERVER優化SQLServer優化
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- 使用儲存過程(PL/SQL)向資料庫中儲存BLOB物件儲存過程SQL資料庫物件
- oracle的儲存過程Oracle儲存過程
- mysql優化 | 儲存引擎,建表,索引,sql的優化建議MySql優化儲存引擎索引
- PL/SQL中動態掉用儲存過程SQL儲存過程
- EF中使用SQL語句或儲存過程SQL儲存過程