2012-08-01 81 views
3

假設我有一個執行SQL的程序,並且我想查詢表A的列A,B和C中的值(假設有一些列我不是嚴格需要的)。 SELECT *和SELECT A,B,C之間有什麼區別?SQL中SELECT *的缺點?

我的想法至今爲止。只選擇您需要的列:

  • ...將需要更少的內存來存儲結果。
  • ...可能會更容易解析程序中的結果。
  • ...不會更快,除非選擇的列都可以用覆蓋索引檢索。

我覺得有可能是進一步的問題在作怪,但。

回答

1

會出現在查詢處理的改進,如果你使用select a,b,c from table。例如,您從一個列中提取記錄,該列是非聚集索引的關鍵列;在這種情況下,記錄將從非聚集索引頁面中檢索,因此發佈的物理數據庫頁面讀取次數較少。閱讀較少的物理頁面總是提高性能的好兆頭。

一點要注意的SQL Server

  1. SQL Sever的默認情況下將所有列緩衝池,不論在SELECT查詢中使用的列。
  2. 雖然你沒有找到在SQL Server查詢處理多少性能的影響,這是好事,只使用你所需要的列,因爲這將提高整個系統的性能。

更多:SELECT * Vs. SELECT COLUMNS – SQL Server Optimization Techniques

4

與列名選擇提高該數據庫引擎可以訪問索引數據,而不是查詢表數據的概率....

非常相關的文章中,你可以閱讀here

SELECT *在您的數據庫架構發生變化的情況下,由於您要將任何新列添加到表中,甚至會將您的系統暴露給意外的性能和功能更改但是,您的代碼不準備使用或顯示新數據。

5

你說的是對的,但還有更多。

與另外一個非常重要的問題「SELECT *」是,如果表架構更改時會發生什麼。 如果客戶端使用「select *」,它將得到一個可能意想不到的一組列(更多的列,更少的列,不同的順序...)。這真是太糟了。

如果客戶選擇它想要的確切列名(A,B,C),那麼它將獲得與預期的格式(如果可能)或特定的,明顯的錯誤的結果集。

而且內存消耗和可能的網絡流量選擇unneded列的問題可能是「大」的應用至關重要。