簡體   English   中英

用戶定義函數優於存儲過程的優點

[英]Advantages of Userdefined functions over Stored Procedures

我對用戶定義的函數有一些疑問。 我想知道為什么/何時使用函數。

函數優於存儲過程有什么優勢?

通過谷歌研究我看到文章暗示:

  • 存儲過程比函數更有利。
  • 功能有限的錯誤處理
  • 函數不能使用臨時表
  • 函數無法調用存儲過程。

函數的唯一優點是我們可以使用函數作為內聯查詢。

通過使用臨時表,我可以使用存儲過程獲得相同的結果,但我需要知道與存儲過程相比使用函數的場景。 我需要知道為什么我們需要UDf,因為UDF提供的大多數功能都可以通過存儲過程來完成。 任何人都可以指導我這個。

主要區別(優點)是您可以調用函數內聯,而不像存儲過程,例如

SELECT dbo.fxnFormatName(FirstName, LastName) AS FormattedName
FROM MyTable

SELECT * 
FROM dbo.fxnTableReturningFunction() x

用戶定義的函數可以返回TABLE類型數據,然后可以在查詢中調用該函數,如上所示。 使用sproc,您必須執行它並將結果存儲到臨時表中,然后進一步操作/查詢結果集。

另一方面,是的,你在一個功能中可以做什么是有限的。 例如,你不能使用動態sql和pre-SQL 2005,你不能在函數中使用像GETDATE()這樣的非確定性函數。

您可能想要使用函數的一個示例是包含常見的“格式化”功能,如上面第一個示例所示 - 而不是重復邏輯以在每個查詢中將名字和姓氏格式化為一個,將其包裝在一個功能,並呼吁到處都是。 通常我建議將格式保留到UI,但這是一個簡單的示例,說明您可以使用的位置/原因。

此外,不必創建臨時表來保存sproc的結果以便進一步查詢它通常更好。 如果sproc更改並返回更多列,則還需要更改將結果加載到臨時表的任何位置,以同步其用於保存結果的表表的模式以及返回的新模式。 函數方法沒有這個問題,因為沒有要維護的臨時表。

有三種類型的函數:標量,內聯表和表值。 一般來說,標量和表值函數可能會導致性能問題,因為查詢優化器在優化這些類型的函數的使用方面做得不好。 但是,內聯表功能的表現還不錯。

這里有一個Connect請求來創建一種新的標量函數: 標量表達式函數可以提高性能...

我希望人們可以投票支持那個,因為它可以通過允許查詢優化器內聯函數表達式並利用統計信息等來提高性能,就像對普通查詢一樣。

用戶定義函數的主要“缺點”是為每一行調用它們。 因此,如果您在SELECT列表中有這樣的功能並且您在更大的集合上運行,那么您的性能很可能會受到影響。

Mysql存儲過程的優點

  1. 多個應用程序在多個環境中運行,需要使用相同的數據庫。 通過使用存儲過程,您可以使您的業務邏輯獨立於編程語言。

  2. 當安全性是主要問題時,使用存儲過程至關重要。 通過數據庫執行操作,您可以記錄所有執行的操作。 銀行網站就是最好的例子。

  3. 如果您正在使用存儲過程,那么您沒有直接訪問表,這是保護數據和事務的另一種方法。

  4. 存儲過程有時會提高應用程序的性能

  5. 如果您的應用程序很大或遠程系統上的數據庫服務器,那么通過使用存儲過程可以減少數據庫服務器和應用程序服務器之間的通信量。

  6. 由於存儲過程是在您的數據庫服務器中編寫的,因此應用程序會將其重新調用,然后再重新使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM