2011-08-11 75 views
-3

考慮到存儲過程是編譯的代碼單元,在使用動態T-SQL語句時,Select * from <table/view>與在存儲過程中使用它有相同的性能影響嗎?SQL Server通配符

+2

你的問題很不清楚。一些例子會有所幫助。 – Oded

+0

爲什麼這個問題被拒絕投票? – klork

+0

由於我不明白的原因,我有時會被拒絕。 – Paparazzi

回答

3

要回答你的問題,它需要被百般挑剔一點:

不SELECT * FROM具有相同的性能含義 關於通配符解釋

SELECT *主要有3種類型的缺點:

  • 代碼維護:使用SELECT *降低複雜表/查詢的易讀性,並且c當客戶端應用程序預期查詢產生某些結果時會導致問題,但表更改
  • 網絡性能:將結果返回給客戶端應用程序時使用SELECT *表示所有列都將返回給客戶端;如果客戶端只使用其中一些列,則會浪費帶寬,並且應用程序運行速度會比較慢。索引/查詢計劃性能:在某些情況下,如果您有一個查詢只需要返回參與索引的列,但是您將其全部返回,那麼您可能會得到更糟糕的查詢計劃發動機。

我不確定你的意思是「關於通配符解釋的含義」,但我懷疑你誤解了爲什麼SELECT *是一個壞主意 - SQL引擎無論如何均驗證提供的列; 「膨脹」通配符的成本基本上是0。

給出

該存儲過程是代碼

編譯單元存儲過程是不是一個真正的「的編譯的代碼單元」:該通常會在第一次運行後緩存存儲過程的查詢計劃,但在許多/大多數情況下,同樣適用於臨時SQL語句。

現在,要實際回答您的問題:,在臨時SQL中使用SELECT *的任何缺點也同樣適用於存儲過程中的SQL。

+0

我會指出,如果你有一個內部連接,你可能會返回比你需要的更多的列,並且在你使用select *時浪費資源。根據定義重複連接列。 – HLGEM