當前位置:首頁 » 存儲配置 » oracle存儲過程的缺點

oracle存儲過程的缺點

發布時間: 2025-01-30 18:36:17

A. oracle存儲過程有什麼好處

1。預編譯,已優化,效率較高。避免了sql語句在網路中傳輸然後再解釋的低效率。
2。如果公司有專門的DBA,寫存儲過程可以他來做,程序員只要按他提供的介面調用就好了。這樣分開來做,比較清楚。
3。修改方便。嵌入在程序中的SQL語句修改比較麻煩,而且經常不能肯定該改的是不是都改了。SQLSERVER上的存儲過程修改就比較方便,直接改掉該存儲過程,調用它的程序基本不用動,除非改動比較大(如改了傳入的參數,返回的數據等)。
4。會安全一點。不會有SQL語句注入問題。
當然,也有缺點。特別是業務邏輯比較復雜時,全用存儲過程來寫,估計也累的夠嗆。
■SQL存儲過程執行起來比SQL命令文本快得多。當一個SQL語句包含在存儲過程中時,伺服器不必每次執行它時都要分析和編譯它。
■調用存儲過程,可以認為是一個三層結構。這使你的程序易於維護。如果程序需要做某些改動,你只要改動存儲過程即可
■你可以在存儲過程中利用Transact-SQL的強大功能。一個SQL存儲過程可以包含多個SQL語句。你可以使用變數和條件。這意味著你可以用存儲過程建立非常復雜的查詢,以非常復雜的方式更新資料庫

B. 如何評價一個項目使用了大量的oracle存儲過程

強烈支持大量運用存儲過程,最好100%用。
效率高,用戶happy

  1. 存儲過程性能好
    2.存儲過程代碼可復用性好
    3.避免在程序中含有大量SQL,可移植性不好。

    這么多人在說用存儲過程的優點,那我就來說說缺點:
    1、移植性問題
    這個搞資料庫開發的人都能理解,是不是問題看系統的需求而定,這里就不多說了。如果資料庫要移植的話,用存儲過程就會帶來很多問題,最好不用。

    2、性能擴展性問題
    隨著系統訪問量的增長,系統必須進行不斷地升級擴展,特別對於大型系統而言,更重要的是性能可擴展性而不是局部的性能。J2EE等多層結構要解決的也是這方面的問題。
    處理邏輯如果全部放在存儲過程里,所有的處理都在資料庫伺服器上進行,消耗的就是資料庫伺服器的CPU資源,大家知道資料庫伺服器由於需要較高的可靠性,通常選用的都是價格昂貴的伺服器,對資料庫伺服器升級通常都花費很大。
    如果把處理邏輯放在中間層伺服器上進行,中間層伺服器一般都是小型的機器,價格便宜,而且中間層伺服器的CPU通常主頻比資料庫伺服器的速度還快(比如現在8CPU的資料庫伺服器主頻只有800M,而雙CPU的刀片式伺服器CPU主頻已經到2.8G了),而且對於多層架構,支持中間層伺服器可以增加多台機器進行負載均衡,用中間層伺服器即價格便宜,擴展空間也更大。

    3、開發問題
    存儲過程還是過程型語言,其重用性比不上java等面向對象語言開發。用JAVA開發的中間層服務可服用性更好(當然,前提是你採用面向對象設計)


    上面只是列舉的一部分問題,這些問題就值的你好好考慮是否採用存儲過程了,我的觀點是存儲過程應該有選擇地使用,牽涉到批量數據操作的,用存儲過程較好。對於小數據量處理的事務操作,應放到中間層處理,這樣系統的移植性和擴展性更好

C. Oracle中存儲過程和函數的區別

定義:
存儲過程(Stored Procere )是一組為了完成特定功能的SQL 語句集,經編譯後存儲在資料庫中。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程

帶有參數)來執行它。

存儲過程是資料庫中的一個重要對象,任何一個設計良好的資料庫應用程序都應該用到存儲過程。

存儲過程是由流控制和SQL 語句書寫的過程,這個過程經編譯和優化後存儲在資料庫伺服器中,應用程序使用時只要調用即可。

在ORACLE 中,若干個有聯系的過程可以組合在一起構成程序包。

優 點:

1. 存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。

2.當對資料庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。

3.存儲過程可以重復使用,可減少資料庫開發人員的工作量。

4.安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。

存儲過程與函數的對比

存儲過程的優缺點
優點:減少網路交互的成本。
缺點:
a、不可移植性,每種資料庫的內部編程語法都不太相同,當你的系統需要兼容多種資料庫時,最好不要用存儲過程。
b、學習成本高,DBA一般都擅長寫存儲過程,但並不是每個程序員都能寫好存儲過程,除非你的團隊有較多的開發人員熟悉寫存儲過程,否則後期系統維護會產生問題。
c、業務邏輯多處存在,採用存儲過程後也就意味著你的系統有一些業務邏輯不是在應用程序里處理,這種架構會增加一些系統維護和調試成本。
d、存儲過程和常用應用程序語言不一樣,它支持的函數及語法有可能不能滿足需求,有些邏輯就只能通過應用程序處理。
e、如果存儲過程中有復雜運算的話,會增加一些資料庫服務端的處理成本,對於集中式資料庫可能會導致系統可擴展性問題。
f、為了提高性能,資料庫會把存儲過程代碼編譯成中間運行代碼(類似於java的class文件),所以更像靜態語言。當存儲過程引用的對像(表、視圖等等)結構改變後,
存儲過程需要重新編譯才能生效,在24*7高並發應用場景,一般都是在線變更結構的,所以在變更的瞬間要同時編譯存儲過程,這可能會導致資料庫瞬間壓力上升引起故障(Oracle資料庫就存在這樣的問題)。

D. oracle的存儲過程的作用

1.存儲過程可以使得程序執行效率更高、安全性更好,因為過程建立之後 已經編譯並且儲存到資料庫,直接寫sql就需要先分析再執行因此過程效率更高,直接寫sql語句會帶來安全性問題,如:sql注入
2.建立過程不會很耗系統資源,因為過程只是在調用才執行。
3.存儲過程可以用於降低網路流量,存儲過程代碼直接存儲於資料庫中,所以不會產生大量T-sql語句的代碼流量。

4.使用存儲過程使您能夠增強對執行計劃的重復使用,由此可以通過使用遠程過程調用 (RPC) 處理伺服器上的存儲過程而提高性能。RPC 封裝參數和調用伺服器端過程的方式使引擎能夠輕松地找到匹配的執行計劃,並只需插入更新的參數值。

5.可維護性高,更新存儲過程通常比更改、測試以及重新部署程序集需要較少的時間和精力。

6.代碼精簡一致,一個存儲過程可以用於應用程序代碼的不同位置。

7.增強安全性:
a、通過向用戶授予對存儲過程(而不是基於表)的訪問許可權,它們可以提供對特定數據的訪問;
b、提高代碼安全,防止 SQL注入(但未徹底解決,例如,將數據操作語言--DML,附加到輸入參數);
c、SqlParameter 類指定存儲過程參數的數據類型,作為深層次防禦性策略的一部分,可以驗證用戶提供的值類型(但也不是萬無一失,還是應該傳遞至資料庫前得到附加驗證)。

缺點就是:
1、大量的利用過程,會對伺服器壓力比較大。

E. mysql 與oracle中的存儲過程及函數有什麼區別,盡可能詳細哦

本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。
函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少
由於我現在基本上是DBA的工作,因此平時也看一些資料庫方面的書籍。但是我一直對存儲過程和函數之間的區別掌握不透。我向來認為存儲過程可以實現的操作,函數也一樣可以實現。最近,剛好大學的老師給我們上SQL-Server的課程,我對這個問題的疑惑終於慢慢解開。今天晚上順便看了些網上的資料,覺得以下分析比較合理:
1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
2. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。
3. 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
存儲過程和用戶自定義函數具體的區別
存儲過程
存儲過程可以使得對資料庫的管理、以及顯示關於資料庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在資料庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變數、有條件執行以及其它強大的編程功能。
存儲過程可包含程序流、邏輯以及對資料庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
可以出於任何使用 SQL 語句的目的來使用存儲過程,它具有以下優點:
可以在單個存儲過程中執行一系列 SQL 語句。
可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。
存儲過程在創建時即在伺服器上進行編譯,所以執行起來比單個 SQL 語句快。
用戶定義函數
函數是由一個或多個 Transact-SQL 語句組成的子程序,可用於封裝代碼以便重新使用。Microsoft? SQL Server? 2000 並不將用戶限制在定義為 Transact-SQL 語言一部分的內置函數上,而是允許用戶創建自己的用戶定義函數。
可使用 CREATE FUNCTION 語句創建、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句除去用戶定義函數。每個完全合法的用戶定義函數名 (database_name.owner_name.function_name) 必須唯一。
必須被授予 CREATE FUNCTION 許可權才能創建、修改或除去用戶定義函數。不是所有者的用戶在 Transact-SQL 語句中使用某個函數之前,必須先給此用戶授予該函數的適當許可權。若要創建或更改在 CHECK 約束、DEFAULT 子句或計算列定義中引用用戶定義函數的表,還必須具有函數的 REFERENCES 許可權。
函數中的有效語句類型包括:
DECLARE 語句,該語句可用於定義函數局部的數據變數和游標。
為函數局部對象賦值,如使用 SET 給標量和表局部變數賦值。
游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。不允許使用 FETCH 語句將數據返回到客戶端。僅允許使用 FETCH 語句通過 INTO 子句給局部變數賦值。
控制流語句。
SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變數。
INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變數。
EXECUTE 語句,該語句調用擴展存儲過程。
在查詢中指定的函數的實際執行次數在優化器生成的執行計劃間可能不同。示例為 WHERE 子句中的子查詢喚醒調用的函數。子查詢及其函數執行的次數會因優化器選擇的訪問路徑而異

F. Oracle 存儲過程和函數的區別

Oracle中函數和存儲過程僅體現在一個地方:


  1. 函數有返回值,而存儲過程沒有返回值(當然,兩者都可以通過定義out參數來實現返回值)


其實,Oracle函數和存儲過程差別很小,對比其他資料庫,比如SqlServer:

  1. sqlserver中,函數是不能存在非select的dml語句的,換句話說,函數中,sqlserver是不能出現update、delete、insert等語句的

  2. 而Oracle中,是十分自由和寬容的,update、delete、insert等語句都可以出現

  3. 但因為Oracle的自由度,會引起其它一些問題:如果使用C#來調用Oracle的函數時,會出現因函數含有update等語句而無法調用,只能換成存儲過程或者在函數外再加一層存儲過程來實現調用。

熱點內容
c語言上三角矩陣 發布:2025-01-31 05:02:30 瀏覽:949
安卓系統如何打開手寫 發布:2025-01-31 04:46:31 瀏覽:911
python輸出文件 發布:2025-01-31 04:40:57 瀏覽:350
怎麼判斷一個安卓手機的好壞 發布:2025-01-31 04:40:46 瀏覽:121
mt反編譯安卓 發布:2025-01-31 04:32:35 瀏覽:450
安卓平板釘釘圖標怎麼顯示 發布:2025-01-31 04:31:07 瀏覽:457
英文導航源碼 發布:2025-01-31 04:29:26 瀏覽:757
c語言頭文件是否可以編譯 發布:2025-01-31 04:28:02 瀏覽:158
sublimepython補全 發布:2025-01-31 04:18:56 瀏覽:684
dos命令copy文件夾 發布:2025-01-31 04:12:55 瀏覽:904