好吧,這會讓我聽起來像我是一個混蛋,但我真的不是故意的。我對你的問題的回答是另一個問題。
「做什麼業務,你已經定義 發展的政策,如果你不明白 數據庫是如何工作的?」
你說「這個觀點每次都要重建自己」。你是說任何有視圖的代碼在每次查詢時都會被重新編譯嗎?因爲這絕對不是真的,(至少在Oracle和SQL Server上是這樣)。使用視圖是一種比存儲過程更靈活的方式來獲得高效的查詢,因爲優化器可以按照使用方式重新優化視圖。一旦完成了,查詢計劃就被緩存起來,所以不需要重新編譯。案例:創建這樣的觀點:
然後,您決定要將所有客戶的列表名爲John Smith:
SELECT c.CustomerID
FROM myOrders
WHERE c.LastName = 'Smith' AND c.FirstName = 'John';
因爲它是一個觀點,加入到「訂單」獲得優化了。如果您試圖在存儲過程中對此進行模塊化,那麼您不能。你可能不得不爲另一個目的製作另一個貼片。很快你就會遇到你所遇到的問題,這是一大堆幾乎不可維護的過程。
爲什麼使用存儲過程?你想解決什麼問題?封裝?我認爲對於SELECT來說,UDF可能更有用。我也會爭辯說,中間層的LINQ類型查詢更加靈活。你是否試圖通過使用存儲過程來優化性能?如果是這樣,請了解並瞭解您運行的每個即席查詢都會得到優化和緩存。如果您使用SQL Server 2005+,甚至可以強制它參數化並緩存查詢計劃,即使您沒有明確指定參數。
存儲過程有它們的位置,但是它們的可維護性,使用靈活性以及是,甚至性能的缺點意味着您應該明智地使用它們,而不是爲開發人員制定一攬子策略。
存儲過程很難保持這就是爲什麼它現在儘可能避免它們的普遍做法。 – Ray 2009-08-08 12:05:18
存儲過程比使用不同技術訪問數據庫的各種不同客戶端更容易維護。一旦你的公司超過五年,後者是不可避免的。 – Andomar 2009-08-08 12:43:50
Oracle支持軟件包,用於邏輯分組功能和過程。權衡是因爲他們缺乏以粒度(功能或程序)爲基礎授予訪問權限的能力。 – 2009-08-08 19:53:24