導航:首頁 > 源碼編譯 > 存儲過程什麼時候需要重新編譯

存儲過程什麼時候需要重新編譯

發布時間:2022-03-05 01:18:17

❶ 腳本需要編譯嗎 存儲過程需要編譯嗎

存儲過程 在創建時 自動編譯,然後存儲到資料庫中的是編譯好的。

腳本 在 每次執行時 進行編譯

❷ 什麼時候要用存儲過程

使用存儲過程並沒有什麼時候的限制,說白了任何時候都可以使用存儲過程,因為存儲過程是經過編譯的程序片段,在資料庫啟動時已經載入在oracle的cache中了,並且任何人調用它都不會經過重新編譯,也不會進行語法分析及最近路徑選擇等耗時的操作,所以建議多使用。

❸ SQLSERVER 什麼時候重新編譯執行計劃

根據資料庫新狀態的不同,資料庫中的某些更改可能導致執行計劃效率降低或無效。SQL Server 將檢測到使執行計劃無效的更改,並將計劃標記為無效。此後,必須為執行查詢的下一個連接重新編譯新的計劃。導致計劃無效的情況包括:
對查詢所引用的表或視圖進行更改(ALTER TABLE 和 ALTER VIEW)。
對執行計劃所使用的任何索引進行更改。
對執行計劃所使用的統計信息進行更新,這些更新可能是從語句(如 UPDATE STATISTICS)中顯式生成,也可能是自動生成的。
刪除執行計劃所使用的索引。
顯式調用 sp_recompile。
對鍵的大量更改(其他用戶對由查詢引用的表使用 INSERT 或 DELETE 語句所產生的修改)。
對於帶觸發器的表,插入的或刪除的表內的行數顯著增長。
使用 WITH RECOMPILE 選項執行存儲過程。
為了使語句正確,或要獲得可能更快的查詢執行計劃,大多數都需要進行重新編譯。
在 SQL Server 2000 中,只要批處理中的語句導致重新編譯,就會重新編譯整個批處理,無論此批處理是通過存儲過程、觸發器、即席批查詢,還是通過預定義的語句進行提交。在 SQL Server 2005 和更高版本中,只會重新編譯批處理中導致重新編譯的語句。由於這種差異,SQL Server 2000 和更高版本中的重新編譯計數不可比較。另外,由於 SQL Server 2005 和更高版本擴展了功能集,因此它們具有更多類型的重新編譯。
語句級重新編譯有助於提高性能,因為在大多數情況下,只有少數語句導致了重新編譯並造成相關損失(指 CPU 時間和鎖)。因此,避免了批處理中其他不必重新編譯的語句的這些損失。
SQL Server ProfilerSP:Recompile 跟蹤事件報告語句級重新編譯。此跟蹤事件在 SQL Server 2000 中僅報告批處理重新編譯。此外,將填充此事件的 TextData 列。因此,已不再需要 SQL Server 2000 中必須跟蹤 SP:StmtStarting 或 SP:StmtCompleted 以獲取導致重新編譯的 Transact-SQL 文本的做法。
跟蹤事件 SQL:StmtRecompile 報告語句級重新編譯。此跟蹤事件可用於跟蹤和調試重新編譯。SP:Recompile 僅針對存儲過程和觸發器生成,而SQL:StmtRecompile 則針對存儲過程、觸發器、即席批查詢、使用 sp_executesql 執行的批處理、已准備的查詢和動態 SQL 生成。
SP:Recompile 和 SQL:StmtRecompile 的 EventSubClass 列都包含一個整數代碼,用以指明重新編譯的原因。

❹ 如何重新編譯存儲過程用一條什麽命令

使用execute,例如:
execute obooke;

❺ 怎麼知道oracle中一個存儲過程最後一次被編譯的時間

個人觀點:
1 last_ddl_time就是指最後一次編譯的時間。 你認為的create or replace 其實就是一種編譯

2 A調用B引發的B的重新編譯。
我認為A調用B是不會引起B的編譯的。從2個方面解釋:
1) 我個人工作經驗中沒有發現A調用B會讓B重新編譯。
案例:B中引用了一張表。我將表刪除了,編譯B。那麼B出現了錯誤。此時我又將表還原了。再去編譯A。注意:A中調用B。但是B是錯誤的。如果調用B讓B也編譯的話,那麼B會編譯通過,A沒問題。事實上:由於B的錯誤,導致A編譯也錯誤。可見B並沒有編譯。
2)存儲過程的一個優點是什麼?就是一次編譯,到處運行。這個編譯時比較消耗資源的。從常理上講,如果每次調用A引發了B的編譯,那麼存儲過程的上述的優點浩然無存。所以從常理推斷,A調用B不會引發B的編譯。

---------------------------------- -----------------------------------------
早上看到了你昨晚發的信息。嘗試了下。你的結論是有一半是正確的。
正確的解釋應該是:
1 假設A、B都是正確的 那麼調用的時候無需編譯;
2 假設A、B是無效的。那麼調用的時候會去編譯它。
Oracle會自己判斷A、B是否有效,再根據情況決定是否去編譯。

❻ 哪些情況需要重新編譯存儲過程

如果是在plsql developer中修改的,可以直接點那個齒輪圖標,或者F8即可編譯。 如果是在sqlplus中,那就敲入修改後的過程代碼(create or replace procere...),最後以/結尾運行即可。

❼ 為什麼我的存儲過程總要重新編譯

這是我同事做的一個存儲過程,我們一般都用這個處理
CREATE OR REPLACE PROCEDURE OWN.P_HSJ_COMPRE
IS
CURSOR cur_invalid_obj IS
SELECT uo.object_name,uo.object_type
FROM user_objects uo,
USER_ORDER_OBJECT_BY_DEPEND uobd
WHERE uo.object_id = uobd.object_id(+) AND uo.status != 'VALID'
ORDER BY uobd.dlevel desc,uo.object_type,uo.object_name;
ls_objname VARCHAR2(100);
ls_objtype VARCHAR2(100);
ls_status VARCHAR2(20);
ls_text VARCHAR2(4000);
ls_sql varchar2(100);
BEGIN
OPEN cur_invalid_obj;
LOOP
FETCH cur_invalid_obj INTO ls_objname,ls_objtype;
EXIT WHEN cur_invalid_obj%NOTFOUND;
IF ls_objtype IN ('PACKAGE BODY', 'PACKAGE', 'FUNCTION', 'PROCEDURE','TRIGGER', 'VIEW') THEN
if ls_objtype ='VIEW' then
ls_sql :=' ALTER VIEW '||LS_OBJNAME ||' COMPILE';
execute immediate ls_sql;
else
DBMS_DDL.alter_compile(ls_objtype,NULL,ls_objname);
end if;
SELECT status INTO ls_status FROM user_objects
WHERE object_name = ls_objname AND object_type = ls_objtype;
/* IF ls_status != 'VALID' THEN
SELECT text INTO ls_text FROM user_errors
WHERE name = ls_objname AND type = ls_objtype;
END IF;
*/
END IF;
END LOOP;
CLOSE cur_invalid_obj;
EXCEPTION
WHEN OTHERS THEN
IF cur_invalid_obj%ISOPEN THEN
CLOSE cur_invalid_obj;
END IF;
END;
/

❽ 什麼時候要用存儲過程,存儲過程的優點

使用存儲過程並沒有什麼時候的限制,說白了任何時候都可以使用存儲過程,因為存儲過程是經過編譯的程序片段,在資料庫啟動時已經載入在oracle的cache中了,並且任何人調用它都不會經過重新編譯,也不會進行語法分析及最近路徑選擇等耗時的操作,所以建議多使用。

存儲過程的優點:
1.存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.當對資料庫進行復雜操作時(如對多個表進行Update,Insert,Query,Delete時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。
3.存儲過程可以重復使用,可減少資料庫開發人員的工作量
4.安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權

缺點:
1.如果更改范圍大到需要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍需要更新程序集中的代碼以添加參數、更新 GetValue() 調用,等等,這時候估計比較繁瑣了。
2.可移植性差
由於存儲過程將應用程序綁定到 SQL Server,因此使用存儲過程封裝業務邏輯將限制應用程序的可移植性。

❾ oracle存儲過程必須提前編譯好嗎

存儲過程寫完後,必須編譯一下,然後才能用。
因為寫完後,資料庫並沒有確認過程是否有問題,編譯過程其實就是資料庫確認的過程。所以必須提前編譯好。

❿ 為什麼要用存儲過程,什麼時候用存儲過程

儲過程說白了就是一堆 SQL 的合並。中間加了點邏輯控制。
但是存儲過程處理比較復雜的業務時比較實用。
比如說,一個復雜的數據操作。如果你在前台處理的話。可能會涉及到多次資料庫連接。但如果你用存儲過程的話。就只有一次。從響應時間上來說有優勢。
也就是說存儲過程可以給我們帶來運行效率提高的好處。
另外,程序容易出現 BUG 不穩定,而存儲過程,只要資料庫不出現問題,基本上是不會出現什麼問題的。也就是說從安全上講,使用了存儲過程的系統更加穩定。
數據量小的,或者和錢沒關系的項目不用存儲過程也可以正常運作。mysql 的存儲過程還有待實際測試。如果是正式項目,建議你用 sql server 或 oracle 的存儲過程。數據與數據之間打交道的話,過程會比程序來的快的多。面試官問有沒有用存儲,實際上就是想知道前來面試的程序員到底做過數據量大的項目沒。如果是培訓出來的,或者小項目小公司出來的,對存儲肯定接觸的少了。
所以,要想進大公司,沒有豐富存儲過程經驗,是不行的。
那麼什麼時候才可以用存儲?對於數據量不是很大以及業務處理不是很復雜的小項目就無需要了么?
錯。
存儲過程不僅僅適用於大型項目,對於中小型項目,使用存儲過程也是非常有必要的。其威力和優勢主要體現在:
1.
存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高資料庫執行速度。
2.
當對資料庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此復雜操作用存儲過程封裝起來與資料庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接資料庫。而換成存儲,只需要連接一次資料庫就可以了。
3.
存儲過程可以重復使用,可減少資料庫開發人員的工作量。
4.
安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
一般來說,存儲過程的編寫比基本SQL語句復雜,編寫存儲過程需要更高的技能,更豐富的經驗。經自已測試,一個有著十萬條記錄的表,通過php調用存儲過程比通過PHP執行sql語句獲取所有記錄的時間,平均快0.4秒左右.

閱讀全文

與存儲過程什麼時候需要重新編譯相關的資料

熱點內容
命令方塊指令冰封劍 瀏覽:784
android中so文件 瀏覽:276
手工用氣球做的捏捏樂解壓神器 瀏覽:196
app升級後就閃退怎麼辦 瀏覽:35
手錶上的樂塗app怎麼下載 瀏覽:721
程序員身上的六宗罪是什麼 瀏覽:145
游戲編程精粹6 瀏覽:69
修復ie的命令 瀏覽:602
linux伺服器怎麼查看地址 瀏覽:65
底部異地持倉源碼 瀏覽:105
加密應用手機 瀏覽:798
程序員考試考什麼科目 瀏覽:485
程序員必備文檔編輯 瀏覽:960
踩水果解壓大全 瀏覽:634
什麼是dk伺服器在 瀏覽:461
nusoapphp下載 瀏覽:929
黑莓原生解壓rar 瀏覽:956
百度解壓縮在哪 瀏覽:788
硬解壓卡怎麼用 瀏覽:183
新買的聯想伺服器怎麼配置 瀏覽:757