2010-07-06 40 views
2

有利用實現了性能增益:是否有利用實現了性能增益「選擇字段1,字段2,字段3 ...」,而不是「SELECT * ......」

SELECT Field1, Field2, Field3 ... 

代替:

SELECT * ... 
+0

可能重複[select * vs select column](http://stackoverflow.com/questions/3180375/select-vs-select-column) – 2010-07-06 06:25:36

+0

不僅僅是性能,而是可伸縮性。如果表格更改,不但會降低您的性能,而且調用對象和/或應用程序DAL可能會中斷。正是由於這個原因,我喜歡使用表包裝UDF(表格函數,只需從表中選擇field1,field2,field3,我也在這裏指定提示 - NOLOCK等)。 – RPM1984 2010-07-06 06:32:47

回答

4

如果列表字段1 .....表示可用列的子集,那麼答案是肯定的。更有效率取決於子集的多少。

對於每個處理過的行,根據列的類型有多個「每列」操作,這可以像將字節重新賦給整數邊界一樣小,或者像分配合適的內存塊一樣重要,來自另一個文件的大BLOB。

但是,大多數經驗豐富的程序員將始終編碼一個特定的列列表,即使只有很少或沒有性能優勢。最重要的原因有兩個,它有助於將程序與數據庫模式的變化隔離開來 - 程序不會在某人添加或重新排列列時爆炸,其次是可讀性,您不需要繼續返回數據庫模式來查看您的程序從表中獲得的內容,以及第三,它可以幫助進行影響分析,因爲您可以掃描源代碼以查看特定列的使用情況。

+0

如果要指定列名稱或*,列順序將如何處理? – CJ7 2010-07-06 06:33:20

+0

@Craig SELECT * INTO my_record FROM t1; INSERT my_record INTO t2; – jva 2010-07-06 08:10:20

4

是的,有。它主要是通過選擇較少的列節省IO和網絡流量。這可能非常重要,因爲在客戶端花費的大部分時間來自數據庫服務器上的網絡和磁盤IO。這當然假設你選擇的是較少的列,然後在表中。

通常,您應該只選擇您要使用的字段。

這是一個很好的做法,因爲您還要確保您的查詢不受未來對該表的更改(列的添加)的影響。

+0

+1,但我認爲OP想知道'select *'和'select field1,...'都返回相同數量的列的情況......但我可能是錯誤的offcourse。 – 2010-07-06 06:22:14

+0

是的,這是正確的。我在談論它何時會返回相同數量的列。 – CJ7 2010-07-06 06:32:03

0

我的這個個人的經驗是,任何性能差異不是肉眼可見。但是,您仍然應該指定所需的列而不是*(除非在COUNT(*)之類的事情中),因爲如果表的定義發生更改,則應用程序不太可能以意想不到的方式失敗。

0

使用Microsoft Access時,如果指定字段名稱而不是「*」,則查詢速度會變慢 - 但對於許多着名的數據庫服務器,即使字段數相同,性能也會更好輸出。所以這取決於你選擇的數據庫。

相關問題