當前位置:首頁 » 編程語言 » sql存儲過程性能
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sql存儲過程性能

發布時間: 2023-03-23 17:06:42

sql存儲過程的優點

1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之後
已經編譯並且山李儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
3.如果我表book更新了
存儲過程是不是要重新遍歷一下表?不會,如果有需要根據book表更新而更新可考慮建立觸發器在特定條件觸發,如:insert,update,delete語法如下:
create
trigger
tr_book
on
book
for
insert,update,delete
as
begin
...
end
補充回答:數據量越大執行過程越長.如褲氏是幾十條幾或幾K可能看不出效果如果是上10W或者過100W你就會發現速度(查詢、更新)會慢很多,,隨著數據量增大你的存儲過程執行時間會胡唯散更長是一定的

⑵ SQL存儲過程有什麼好處

優點:

  1. 離數據最近,某些情況下可獲得更好性能

  2. 減少應用復雜度及應用伺服器壓力

  3. 需要顯式調用,不會像觸發器那樣出現問題難以定位

  4. 使用方便

缺點:

  1. 增加資料庫伺服器壓力。相當於將應用壓力轉嫁到資料庫上,而應用伺服器更容易擴展,也就是說大部分情況下資料庫伺服器資源比應用伺服器資源更加珍貴。

  2. 增加網路開銷。如存儲過程存取數據量較大,會造成較大網路開銷。

  3. 可移植性差。如系統有多中資料庫,或從某種資料庫遷移到另一種資料庫,則很有可能遇到兼容性問題。

  4. 導致多處存在業務邏輯。存儲過程某種程度就是將本應放在應用側處理的業務邏輯放到資料庫處理,這會導致業務邏輯存在於多個地方,增加調試維護困難。

  5. 在高並發系統中很可能會導致資料庫壓力瞬間增大。

  6. 存儲過程中的復雜運算會大量消耗資料庫伺服器資源。

總結:

一般情況下盡量少用或不用存儲過程,特別是在一個並發較高架構復雜的大型系統中,更是要減少存儲過程的使用,業務邏輯的工作就應該由應用伺服器處理,而不是交給資料庫。很多時候存儲過程確實可以快速解決問題,但它的維護性、擴展性、移植性等都不好。如果你的系統很小,架構比較簡單,並且開發人員對存儲過程熟悉,那麼可以考慮使用存儲過程減少工作量;但隨著系統增加,架構變復雜,開發人員越來越多,這時存儲過程的存在可能會導致更多的問題。當然,定時ETL或報表統計之類的任務,還是可以考慮使用存儲過程來做的。

⑶ SQL存儲過程的作用和優缺點

SQL存儲過程放在SQL資料庫中,1,因此在程序中調用的時候不必自己拼接sql語句。2,SQLSERVER會對存儲過程進行預編譯,因此速度快。3,在網路上不必傳輸冗長的SQL語句,而是直接調用存儲過程的名字,因此可以加快速度當然,在一些外包軟體開發中,是不允許使用存儲過程的。因為對方不可以把資料庫暴露給你,此時你只能使用SQL語句。不過國內的一些小型企業使用SQL存儲過程還是很流行的。因為程序代碼里不包含SQL語句,因此會資料庫會相對安全一些。

⑷ 在SQL中存儲過程分為哪五類

1、目錄存儲過程

例如:sp_columns返回當前環境中可查詢的指定表或視圖的列信息。

sp_tables返回當前環境下可查詢的對象的列表(任何可出現在FROM子句中的對象)。

2、復制類存儲過程

例如:sp_addarticle創建項目並將其添加到發布中。此存儲過程在發布伺服器的發布資料庫上執行。

3、安全管理類存儲過程

例如:sp_addrole在當前資料庫創建新的Microsoft SQL Server角色。

sp_password添加或更改Microsoft SQL Server登錄的密碼。

4、分布式查詢存儲過程

例如:sp_foreignkeys返回引用主鍵的外鍵,這些主鍵在鏈接伺服器中的表上。

sp_primarykeys返回指定遠程表的主鍵列,每個鍵列佔一行。

5、擴展存儲過程

例如:xp_sendmail向指定的收件人發送郵件和查詢結果集附件。

xp_startmail啟動SQL郵件客戶端會話。



存儲過程的特點

1、存儲過程在伺服器端運行,執行速度快。

2、存儲過程執行一次後,其執行駐留在高速緩沖存儲器,在以後的操作中,只需從高速緩沖存儲器中調用已編譯好的二進制代碼執行,提高了系統性能。

3、確保資料庫的安全。使用存儲過程可以完成所有的資料庫操作。

4、降低網路負載,提高效率。

5、可以接受用戶參數,亦可返回參數。

6、作為一種安全機制來充分利用:通過對執行某一存儲過程的許可權進行限制,能夠實現對相應的數據的訪問許可權的限制,避免了非授權用戶對數據的訪問,保證了數據的安全。

⑸ SQL SERVER一個資料庫中使用大量的存儲過程,會影響性能嗎

一、在SQL Server中存儲過程不會影響性能。x0dx0a1、只會大大的減輕伺服器的壓力,而不會增加,只有不合理的存儲過程才會槐辯納造成伺服器性能下降的惡果。一個大型的資料庫,一般存儲過程也不會超過幾千個,對當前的資料庫及它依附的硬體來說,這點兒負載是大象身上的老鼠,負載基本可以_略不計。x0dx0a2、但是,存儲過程是批量的SQL語句的合成,如果設計上混亂,引發死循環、死鎖、大范圍查詢、臨時表沒有及時清理釋放等問題的情況下,是會嚴重影響伺服器性能的,但這根子不在存儲過程上,而在於存儲過程的設計上。錯誤的SQL代碼指揮伺服器,無論它的形式是存儲過程,還是客戶端及時發向資料庫的請求,都會使伺服器出現問題。x0dx0ax0dx0a二、相關擴展x0dx0a1、在當前,針對資料庫的編程設計,沒有存儲過程是不可想像的,這就象某個公司的大型貨品倉庫中沒有倉庫保管員一樣,所有的貨品進出都得進貨員或銷售員去臨時取放,會嚴重降低工作效率。x0dx0a2、存儲過程在資料庫中無論是否編譯好,其效率都要比客戶端臨時向資料庫發送指令調數據來得要高,因為至少減少了發向伺服器的指令的量。況且很多的中間值、臨時值如果不通過存儲過程來實現的話,就只能先全取到客戶端鉛沒,這樣會大大增加網路負擔與伺服器的負鉭。x0dx0a3、正如微軟所說,存儲過程來實現,可以使得很多中間量不必傳入到客戶上,客戶端只能得到需要的結果,所以同灶歷時可以提高安全。

⑹ SQL Server 優化存儲過程的方法有哪些

優化存儲過程有很多種方法,下面介紹最常用的7種。
1.使用SET NOCOUNT ON選項
我們使用SELECT語句時,除了返回對應的結果集外,還會返回相應的影響行數。使用SET NOCOUNT ON後,除了數據集就不會返回額外的信息了,減小網路流量。
2.使用確定的Schema
在使用表,存儲過程,函數等等時,最好加上確定的Schema。這樣可以使SQL Server直接找到對應目標,避免去計劃緩存中搜索。而且搜索會導致編譯鎖定,最終影響性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable會在當前Schema下搜索,如果沒有,再去dbo下面搜索,影響性能。而且如果你的表是csdn.TestTable的話,那麼select * from TestTable會直接報找不到表的錯誤。所以寫上具體的Schema也是一個好習慣。
3.自定義存儲過程不要以sp_開頭
因為以sp_開頭的存儲過程默認為系統存儲過程,所以首先會去master庫中找,然後在當前資料庫找。建議使用USP_或者其他標識開頭。
4.使用sp_executesql替代exec
原因在Inside Microsoft SQL Server 2005 T-SQL Programming書中的第四章Dynamic SQL裡面有具體描述。這里只是簡單說明一下:sp_executesql可以使用參數化,從而可以重用執行計劃。exec就是純拼SQL語句。
5.少使用游標
可以參考Inside Microsoft SQL Server 2005 T-SQL Programming書中的第三章Cursors裡面有具體描述。總體來說,SQL是個集合語言,對於集合運算具有較高的性能,而Cursors是過程運算。比如對一個100萬行的數據進行查詢,游標需要讀表100萬次,而不使用游標只需要少量幾次讀取。
6.事務越短越好
SQL Server支持並發操作。如果事務過多過長,或是隔離級別過高,都會造成並發操作的阻塞,死鎖。此時現象是查詢極慢,同時cup佔用率極低。
7.使用try-catch來處理錯誤異常
SQL Server 2005及以上版本提供對try-catch的支持,語法為:
begin try
----your code
end try
begin catch
--error dispose
end catch
一般情況可以將try-catch同事務結合在一起使用。
begin try
begin tran
--select
--update
--delete
--…………
commit
end try
begin catch
--if error
rollback
end catch
====================== 分割線 =======================

『自己的一些調優經驗』
1. 少使用游標是個很好的建議,為此,我自己也遇到過一些事故,是游標所造成的,由於,游標是逐行逐行操作的,當記錄較多時,經常會遇到超時的情況。
2. 多表join做查詢時,查詢的欄位盡量不要使用case when then else end的語法,或者使用用戶函數,例如:
select (case when fType=1 then '是' else '否' end) as fTypeName, dbo.F_GetFullName(fID) as fFullName from Table1 inner join Table2……
當兩個表的數據量非常大時,你可以在查詢分析器中明顯感覺到:直接查詢fType和fID與查詢上面兩個欄位的速度,很可能使用了一個case when then就導致超時。
針對這種情況,可以分兩種做法:
第一,把一些簡單的轉換可以放在程序中完成。
第二,如果需要通過ID查詢全名或者全稱,類似的,可以創建好視圖,直接查視圖,或者,先把所有的fFullName查出來放到臨時表中,直接join臨時表(如果這個數據不是很多的話),獲得fFullName。
3. 少使用一些嵌套的查詢,用臨時表緩存中間數據,例如:
select * from Table1
inner join (
select count(1) as count, Table2.ID2 from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2

) as t1 on t1.ID1 = Table1.ID1

我曾經遇到這樣情況,上面的語句是那種情況的簡化版本,把其他不影響結果的表格都去掉了,發現一個奇怪的現象:嵌套查詢的結果集並不大,大約就200多行,Table1有6w條記錄,結果,這個查詢語句超時,查詢分析器中執行2分鍾也得不到結果。
後來,這樣一改,就Ok了,3秒出結果:
select count(1) as count, Table2.ID2 into #temp from Table2 inner join Table3 on ID2=ID3 group by Table2.ID2
select * from Table1
inner join #temp as t1 on t1.ID1 = Table1.ID1
這樣一改,效率提升了幾十倍,猜想:可能是嵌套的查詢是動態的,每一行的join可能都需要先執行嵌套的查詢,從而導致效率極差。
所以,如果查詢足夠復雜,join多個表,需要連接多個通過group by求和、求平均數等運算計算出來的中間數據,那麼,不妨多使用臨時表緩存中間數據。
4. 還有一些是必須遵守的一些默認規則,比如:

先過濾後連接。
查詢的欄位最要不要用「*」,指定需要用的欄位,減少網路流量。

『總結』
對於性能的追求是沒有極限的,做到你所能做到的,這是一個很好的習慣。
有些業務邏輯放在存儲過程中處理比較方便,而有些業務邏輯交給程序來處理,同樣會提升系統整體的效率,看實際情況而定。
總之,盡可能減少這些容易引發性能問題的隱患,系統就會跑得更穩定更有效率,一切從小細節做起。

⑺ MySQL資料庫新特性之存儲過程入門教程

在MYSQL 中 終於引入了存儲過程這一新特性 這將大大增強MYSQL 的資料庫處理能力 在本文中 將指導讀者快速掌握MYSQL 的存儲過程的基本知識 帶領用戶入門

存儲過程介紹

存儲過程是一組為了完成特定功能的SQL語句集 經編譯後存儲在資料庫中 用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它 存儲過程可由應用程序通過一個調用來執行 而且允許用戶聲明變數 同時 存儲過程可以接收和輸出參數 返回執行存儲過程的狀態值 也可以嵌套調用

存儲過程的優點

作為存儲過程 有以下這些優點

( )減少網路通信量 調用一個行數不多的存儲過程與直接調用SQL語句的網路通信量可能不會有很大的差別 可是如果存儲過程包含上百行SQL語句 那麼其性能絕對比一條一條的調用SQL語句要高得多

( )執行速度更快 存儲過程創建的時候 資料庫已經對其進行了一次解析和優化 其次 存儲過程一旦執行 在內存中就會保留一份這個存儲過程 這樣下次再執行同樣的存儲過程時 可以從內存中直接中讀取

( )更強的安全性 存儲過程是通過向用戶授予許可權(而不是基於表) 它們可以提供對特定數據的訪問 提高代碼安全 比如防止 SQL注入

( ) 業務邏輯可以封裝存儲過程中 這樣不僅容易維護 而且執行效率也高

當然存儲過程也有一些缺點 比如

可移植性方面 當從一種資料庫遷移到另外一種資料庫時 不少的存儲過程的編寫要進行部分修改

存儲過程需要花費一定的學習時間去學習 比如學習其語法等

在MYSQL中 推薦使用MYSQL Query Browswer()這個工具去進行存儲過程的開發和管理 下面分步驟來學習MYSQL中的存儲過程

定義存儲過程的結束符

在存儲過程中 通常要輸入很多SQL語句 而SQL語句中每個語句以分號來結束 因此要告訴存儲過程 什麼位置是意味著整個存儲過程結束 所以我們在編寫存儲過程前 先定義分隔符 我們這里定義 // 為分隔符 我們使用DELIMITER //這樣的語法 就可以定義結束符了 當然你可以自己定義其他喜歡的符號

如何創建存儲過程

下面先看下一個簡單的例子 代碼如下

DELIMITER//CREATEPROCEDURE`p ` ()LANGUAGE SQLDETERMINISTICSQL SECURITY DEFINERMENT A procere BEGINSELECT Hello World ! ;END//

下面講解下存儲過程的組成部分

)首先在定義好終結符後 使用CREATE PROCEDURE+存儲過程名的方法創建存儲過程 LANGUAGE選項指定了使用的語言 這里默認是使用SQL

)DETERMINISTIC關鍵詞的作用是 當確定每次的存儲過程的輸入和輸出都是相同的內容時 可以使用該關鍵詞 否則默認為NOT DETERMINISTIC

) SQL SECURITY關鍵詞 是表示調用時檢查用戶的許可權 當值為INVOKER時 表示是用戶調用該存儲過程時檢查 默認為DEFINER 即創建存儲過程時檢查

) MENT部分是存儲過程的注釋說明部分

lishixin/Article/program/MySQL/201404/30557

⑻ 項目中所有SQL語句全用存儲過程寫,例如select * from A最簡單的也用存儲過程,是否能優化性能

看情況的,存儲過程會緩存數據,如果查詢條件經常變動的話,簡單的SQL語句還是不要使用存儲過程比較好,會增加伺服器壓力的,反之,對於經常使用的一些語句,如果基本上都沒怎麼變動的話,用存儲過程應該是會好點的

⑼ sql存儲過程有啥用

Transact-SQL中的存儲過程,非常類似於Java語言中的方法,它可以重復調用。當存儲過程執行一次後,可以將語句緩存中,這樣下次執行的時候直接使用緩存中的語句。這樣就可以提高存儲過程的性能。
Ø 存儲過程的概念
存儲過程Procere是一組為了完成特定功能的SQL語句集合,經編譯後存儲在資料庫中,用戶通過指定存儲過程的名稱並給出參數來執行。
存儲過程中可以包含邏輯控制語句和數據操縱語句,它可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
由於存儲過程在創建時即在資料庫伺服器上進行了編譯並存儲在資料庫中,所以存儲過程運行要比單個的SQL語句塊要快。同時由於在調用時只需用提供存儲過程名和必要的參數信息,所以在一定程度上也可以減少網路流量、簡單網路負擔。

1、 存儲過程的優點
A、 存儲過程允許標准組件式編程
存儲過程創建後可以在程序中被多次調用執行,而不必重新編寫該存儲過程的SQL語句。而且資料庫專業人員可以隨時對存儲過程進行修改,但對應用程序源代碼卻毫無影響,從而極大的提高了程序的可移植性。
B、 存儲過程能夠實現較快的執行速度
如果某一操作包含大量的T-SQL語句代碼,分別被多次執行,那麼存儲過程要比批處理的執行速度快得多。因為存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並給出最終被存在系統表中的存儲計劃。而批處理的T-SQL語句每次運行都需要預編譯和優化,所以速度就要慢一些。
C、 存儲過程減輕網路流量
對於同一個針對資料庫對象的操作,如果這一操作所涉及到的T-SQL語句被組織成一存儲過程,那麼當在客戶機上調用該存儲過程時,網路中傳遞的只是該調用語句,否則將會是多條SQL語句。從而減輕了網路流量,降低了網路負載。
D、 存儲過程可被作為一種安全機制來充分利用
系統管理員可以對執行的某一個存儲過程進行許可權限制,從而能夠實現對某些數據訪問的限制,避免非授權用戶對數據的訪問,保證數據的安全。

Ø 系統存儲過程滑者
系統存儲過程是系統創建的存儲過程,目的在於能夠方便的從系統表中查詢信息或完成與更新資料庫表相關的管理任務或其他的系統管理任務。系統存儲過程主要存儲在沖渣master資料庫中,以「sp」下劃線開頭的存儲過程。盡管這些系統存儲過程在master資料庫中,但散讓悄我們在其他資料庫還是可以調用系統存儲過程。有一些系統存儲過程會在創建新的資料庫的時候被自動創建在當前資料庫中。

⑽ 存儲過程為什麼比單純SQL語句執行要快

因為存儲過程只需要編譯一次 之後運行這個存儲過程就不需要在編譯了,但是SQL語句每次都要編譯。

存儲過程(Stored Procere)是在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在數據銷旁庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果兆羨該存儲過程帶有參數)來執行它。

用戶創建的存儲過程是由用戶創建並完成某一特定功能的存儲過程,事實上一般所說的存儲過程就是指本地存儲過程。

在SQL Server2005中,遠程存儲過程(Remote Stored Proceres)是位於遠程伺服器上的存儲過程,通常可以使用分布式查詢虧猜橡和EXECUTE命令執行一個遠程存儲過程。