Sql-Server

使用儲存過程或視圖從多個表中返回數據

  • June 1, 2021

是否只是偏好使用視圖或儲存過程(或 TVF)來簡單地返回從多個基表連接的數據?

有沒有這方面的最佳實踐?儲存過程是否應該僅用於處理數據?最好使用視圖來從多個表中返回數據?

是否還可能存在任何性能問題?

詢問:

SELECT
   t.TagID, t.TagName, 
   t.IsActive AS 'IsTagActive',
   tk.TaskID, tk.TaskName,
   tk.IsActive AS 'IsTaskActive',
   g.GroupID, g.GroupName
FROM 
   Model.[Tag] t
INNER JOIN
   Model.[TagTaskMapping] ttm ON ttm.TagID = t.TagID
INNER JOIN  
   Model.[Task] tk ON tk.TaskID = ttm.TaskID
INNER JOIN
   Model.[Group] g ON g.GroupID = t.GroupID

當您需要扁平化或一致地解決各種基表的組織方式時,視圖是一種很好的方法,本質上是對消費應用程序的數據進行非規範化。您的範例包括作為一個整體的任務、標籤和組資訊。

或者,視圖可用於一致地限制數據。例如,如果“未結”採購訂單的定義很複雜,那麼視圖可以簡化它。

儲存過程和表值函式有很大不同。它們可以接受參數並包含分支或更複雜的邏輯,同時仍為客戶端應用程序提供簡單的介面。如果需要,儲存過程還可以修改數據(記錄表)。

我還看到儲存過程被用作避免參數嗅探或獲得更好執行計劃的一種方法。一個主記憶體儲過程,它決定是為少量數據呼叫子過程1,還是為大量數據呼叫子過程2。

表值函式比視圖和接受參數更類似於儲存過程,但可以在連接中使用。它們的性能通常很糟糕,應謹慎使用。

這對我來說似乎是一個奇怪的問題,但這裡有一些固執己見的簡短單行指南。

  • 儲存過程:如果您想使用參數並且不加入結果。
  • in-line table-valued function:如果你想使用參數並且可能會加入結果。
  • 視圖:如果您想簡化查詢一組表,並承諾不創建包含其他視圖的視圖。

您發布的內容對我來說似乎是一種觀點。除非您想傳入參數,否則我會說它可能是一個儲存過程。

引用自:https://dba.stackexchange.com/questions/167160