2010-06-15 77 views
0

這是更好的存儲過程還是保持原樣?SELECT INTO或存儲過程?

INSERT INTO `user_permissions` 
    (`user_id`, `object_id`, `type`, `view`, `add`, `edit`, `delete`, `admin`, `updated_by_user_id`) 
    SELECT `user_id`, $object_id, '$type', 1, 1, 1, 1, 1, $user_id 
    FROM `user_permissions` 
    WHERE `object_id` = $object_id_2 AND `type` = '$type_2' AND `admin` = 1 

你可以用不同的對象來想這個,可以說你有組和子組。如果有人創建了一個子組,那麼現在每個訪問父組的人都可以訪問該子組。

我從來沒有做過一個存儲過程,但這看起來可能是時間。這個電話可能會經常被調用。

我應該創建一個程序還是將性能微不足道?

回答

1

維基百科Stored Procedure

開銷:由於存儲過程 語句直接存儲在 數據庫,這可能會刪除被 通常情況下需要編譯開銷的全部或部分 軟件應用程序發送內聯 (動態)SQL查詢到數據庫。 (然而,大多數數據庫系統 落實「語句緩存」等 機制,以避免重複 編譯動態SQL 語句。)另外,預編譯 SQL語句,同時避免一些 開銷,增加了複雜性 創建最佳執行計劃 ,因爲並非SQL 語句的所有參數均在編譯 時間提供。根據具體的 數據庫實現和 配置,混合性能 結果將從存儲的 程序與通用查詢或 用戶定義函數中看到。

避免網絡流量的:一個主要 優勢與存儲過程是 ,他們可以在 數據庫引擎中直接運行。在生產 系統中,這通常意味着 過程完全在 專用數據庫服務器上運行,其中 直接訪問被訪問的數據爲 。這樣做的好處是網絡通信的成本可以完全避免 。這成爲 對於複雜的 系列SQL語句特別重要。

封裝業務邏輯的: 存儲過程允許業務 邏輯被嵌入在 數據庫的API,其可以簡化數據 管理和其他地方減少需要 編碼邏輯在客戶端 程序。通過使用有故障的客戶端 程序,這可能會導致數據被損壞的可能性較小 。因此,數據庫系統 可以在存儲的 過程的幫助下確保數據完整性和 一致性。

代表團訪問權限:在許多 系統,存儲,程序就可以 授予訪問權限的數據庫 這誰都會執行這些 程序用戶不直接擁有。因此, 存儲過程成爲這些用戶擁有的唯一方式 ,無論存儲過程如何,都會執行 。

從SQL注入一些保護 攻擊:存儲過程可以用來 來防止這種攻擊。即使攻擊者插入SQL 命令, 參數也將被視爲數據 。另外一些DBMS將檢查參數的類型 。

缺點

存儲過程 「定義一次, 多次使用。」如果需要更改 ,則必須更換存儲過程 的(唯一一個) 定義。當然,動態SQL的 允許任何時候發出任何SQL查詢爲 。任何對 存儲過程的更改都會立即影響 每隔一段軟件,報告, 等(在DBMS內部或外部) ,它直接或間接地指的是 它。 並不總是能夠確定地確定這些影響將會是什麼,也不能確定如果不對 產生不利影響,可以安全地進行更改。

由於各種原因,許多 組織嚴格限制誰可以定義和發出針對數據庫的查詢 誰是 。因此,程序員和其他 用戶可能會發現 自己不得不無奈地 實施低效的解決方案使用的是什麼存儲 程序提供給他們, 的程序是否是爲這個特殊 輔助工作 適當 他們的問題。

雖然不直接相關的存儲 程序,商務 邏輯到DBMS的運動是有問題的,因爲 它與更復雜的 可擴展性問題的層。此外,一些 現代DBMS系統(特別是來自 的Microsoft SQL Server 2000起) 不提供任何性能好處使用針對 預編譯查詢存儲過程的 :它們被編譯 和 動態SQL以同樣的方式被緩存。

所以,在你的榜樣,你想要一個存儲過程的封裝好處,而且應該儘量就去做

+0

謝謝你。 – 2010-06-15 06:30:58