簡體   English   中英

從表中選擇*或從表中選擇id,field1,field2,field3 - 最佳實踐?

[英]Select * from table OR select id,field1, field2, field3 from table - best practice?

有人可以說是一個更好的做法嗎? 對於選擇查詢,我應該返回我需要的全部或ID嗎?

效率? 可擴展性? 等等

謝謝

環境:SQL Server 2008,VS2008(VB)

始終明確枚舉您的列。 永遠不要在任何生產代碼中select *

即使看似有意義的情況也會產生意想不到的后果。 例如,當您有一個應該鏡像表格布局的視圖時,您可能會認為select * ,但如果修改基礎表而不重新生成視圖,則會發生奇怪的事情。

遠離select *除非您輸入查詢並在那里執行它。

有人可以說是一個更好的做法嗎? 對於選擇查詢,我應該返回我需要的全部或ID嗎?

為列命名。

這不僅是一種最佳實踐,而且可以獲得更高的性能。

想象一下兩個問題:

SELECT  *
FROM    mytable
WHERE   column1 = @somevalue

SELECT  id, column1
FROM    mytable
WHERE   column1 = @somevalue

id是一個聚簇主鍵, column1上有一個索引。

我假設您的客戶端代碼正確處理可變數量的列,即表格布局更改不會破壞代碼。 這是一個非常強大的假設,但讓我們做到。

現在,如果mytable只包含idcolumn1 ,則查詢是相同的。

如果將column2添加到mytable會發生什么?

第二個查詢(帶有命名列)仍然使用索引(因為in包含查詢所需的所有內容),但第一個查詢也需要選擇column2SQL Server不知道你會忽略它)。

這會將Clustered Table Seek添加到計划中,並且您的查詢性能會變差。

使用表中的select col1,col2,col3而不是select * from table1。 如本文和此處所述,這具有許多優點。

另見: http//weblogs.sqlteam.com/jeffs/jeffs/archive/2007/07/26/60271.aspx

Select *和Select [list each col]之間是否有區別

永遠不要聽任何人告訴你總是在SQL中做一些事情 - 或者,總是要警惕任何告訴你永遠不要在SQL中做某事的人:)

在以下示例中, SELECT *不會造成任何傷害,並且可以說在可讀性和代碼維護方面具有優勢( DRY和所有這些):


例1

當已經在“內部”范圍中指定了屬性的commalist時:

SELECT * 
  FROM (
        SELECT col1, col2, col3, col4, col5
          FROM T1 
       ) AS DT1;

例2

在CTE中使用表值構造函數時,一個被強制(例如在SQL Server中!)將VALUES子句包裝在表表達式( SELECT..FROM )中,例如

WITH T1
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 1, 1, 2, 1), 
                     (1, 1, 2, 1, 1), 
                     (1, 2, 1, 1, 1)
             ) AS T (col1, col2, col3, col4, col5)
     )
SELECT ...

好吧,所以這最后一個是一個稻草人,但考慮到每個機會使用commalists導致錯誤,並使其難以調試:

WITH T2 (author_name, book_title, ISBN) 
     AS
     (
      SELECT book_title, ISBN, author_name
        FROM (
              VALUES ('9780321189561', 'C. J. Date', 'An Introduction to Database Systems')
             ) AS T (ISBN, author_name, book_title)
     )
SELECT *
  FROM T2;

始終使用命名列!

一個很好的例子,說明為什么它是壞的: “從表中選擇*”與“從表中選擇colA,colB等”SqlServer2005中的有趣行為

在大多數情況下,您應該指定列,這最適合將來的更改和維護。 它還可以減少數據量,提高性能。

更喜歡在SELECT * FROM our_table上明確命名列的原因是

  1. 在項目中明確命名列可以更清楚地表達我們的意圖,從而有助於自我記錄代碼。
  2. 將來有人會在表格中添加一列或多列。 如果我們使用SELECT *,這些列將被自動拖入,這可能會破壞我們的代碼或導致它執行不當(特別是如果涉及LOB)。

除非您從不引用客戶端代碼中的任何列名稱,否則應使用命名列。

我不會告訴你“ 從來沒有 ”或“ 總是 ”使用其中一個。 從那開始的建議不是字面意思。

如果您正在處理小數據集,請不要堅持使用愚蠢的“優化”,例如將*替換為字段列表,特別是如果您要指定所有字段。

具有可讀且易於維護的SQL代碼通常比一些節省的CPU周期或少幾千字節的內存使用或網絡流量更有價值。

暫無
暫無

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

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