2013-07-07 38 views
2

我知道這可能是一個微不足道的問題,但我不斷聽到我的老師的一個聲音說請問select *會影響存儲過程的性能嗎?

沒有一個存儲過程,影響性能中使用SELECT *和它的返回可能被制動其客戶數據如果它的架構更改導致未知的紋波

我找不到任何確認這個概念的文章,我認爲如果它是真的應該注意。

+3

我也不知道任何文章,但考慮到這一點 - 你在程序中做SELECT *並獲取所有列,其中大多數列需要並消耗額外的內存。稍後,將二進制BLOB列添加到表中以存儲一些較大的二進制數據。現在,您的'SELECT *'也會不必要地檢索該blob,並且消耗更多內存。這是連鎖反應。明確你需要的列。它使代碼更容易理解,即使您必須輸入更多。 –

+1

另一種可能性是檢索最終用戶永遠不可見的列。如果您的應用程序代碼改變了使用過程中的列的方式,例如爲了顯示循環中的所有列,而不是明確命名它們,突然間可能會向最終用戶顯示敏感數據。 –

+1

在模式更改後返回可能會破壞客戶端的數據也是非常危險的。切勿在生產代碼中使用'SELECT *',僅用於一次性查詢和調試。 – Tomalak

回答

3

在最現代化的專業SQL實現(甲骨文,SQL服務器,DB2等),使用SELECT *在頂級SELECT產生負面影響只有。在所有其他情況下,SQL編譯器應該執行列優化,消除任何未使用的列。

*在頂級SELECT的負面影響幾乎完全與返回的所有列時,你可能不需要所有的人。恕我直言,在所有其他案件(**),包括大多數臨時案件中,*的使用是完全正常的,並且沒有任何確定性的影響(以及明顯的有益的便利性)。使用*的廣泛通用聲明在很大程度上是從大多數SQL編譯器的時間(10 - 15年前)開始的一種暫時擱置,而不是具有有效的列消除優化技術。

(** - 唯一的例外是在SQL Server VIEW定義,因爲它不會自動如果綁定列列表更改通知。)


的另一個原因,你有時會看到不使用SELECT *不是因爲任何性能問題,而僅僅是編碼實踐的問題。也就是說,將SQL代碼編寫爲明確的通常會更好地表明您(或您的客戶端代碼)期望的列,並因此依賴於此列。如果你使用*那麼它就是隱含並且有人在閱讀你的SQL代碼時很難判斷你的應用程序是否真的依賴於某個列。 (和恕我直言,這是更有效的原因。)

0

我發現這句話在一份文件中,當我們使用SELECT *指令:

「[...]需要排序時,會發生真正的傷害。每個重複排序列的SELECTed列都會使分類工作文件的寬度更寬。文件越長越長,排序越慢。「在http://www.quest.com/whitepapers/10_SQL_Tips.pdf

本文是構建DB2引擎,但也可能將其應用於其他引擎。

相關問題