2012-02-01 58 views
5

我聽說這是一般編寫查詢的錯誤方式,但我不知道有人對SQL的新用戶說些什麼。使用`select table_name。*`有什麼優點和缺點?

這是真的很糟糕的形式還是隻是簡單的懶惰?

因此,不要在這方面徵求太多的意見,除了不必輸入每個字段名稱之外,在查詢中使用它有什麼好的理由。另外,這些原因是否超過了使用中的傷害?

+0

這是一個像任何其他工具。如果你從不使用它,請不要擔心。 – 2012-02-01 17:34:15

+0

如果您的模式發生變化並且您的代碼取決於數據集中列的排序,它可能會在稍後結束。除此之外,沒有任何技術上的錯誤。 – 2012-02-01 17:35:48

+0

@Marc B.我一直都在使用它,這可能令我擔心。 – Matthew 2012-02-01 17:37:39

回答

11

當您的程序在編譯時或通過配置瞭解了表的結構時,使用select *並不是一個好主意:表的結構中的任何更改都可能會破壞查詢返回的結果的結構最終導致運行時錯誤。

然而,有些情況下*是不可或缺的。特別是,如果程序通過讀取來自查詢的元數據來動態地瞭解表的結構,那麼使用「所有列」請求可讓您的程序動態獲取對錶的更改。

毫無疑問,使用*作爲您最喜歡的SQL Studio/SQLPlus/etc的臨時查詢。非常普通和方便。

+0

這是一個很好的例子,說明爲什麼我認爲我最近一直在做的事情沒問題。我有通用的Java類,它們獲取查詢結果併爲字段獲取getter。如果我使用*,則這些對象將拾取添加到表中的任何新字段。 – Matthew 2012-02-01 17:43:01

+0

@Matthew - 但大概你需要編寫消耗這些額外列的代碼,否則你最終會帶回一堆永不被使用的數據?那麼,爲什麼不在擴展代碼的同時改變查詢呢? – 2012-02-01 17:45:57

+0

@Mthethew你說得對,你的例子是在程序中使用'select *'來獲得結果的經典案例,否則需要付出更多的努力。 – dasblinkenlight 2012-02-01 17:47:28

3

當使用通配符*時,系統必須處理該表的所有列名,並返回它們。

因此,使用*的性能會比實際手動輸入全部更差。

如果不需要,一般的規則是避免使用它,而是指定實際需要的列。

+6

無論如何,db已經必須處理字段名稱的表,以確保您不要求不存在的字段。問題在於額外的數據檢索 - 加載/解碼/格式化字段中的任何一點都沒有意義,因爲用戶只需要一個字段而不是表中的其他50個字段,所以這些字段只會被丟棄。 – 2012-02-01 17:39:23

+0

@Marc B您的評論也適用於這樣一個事實,即如果表格更改並且字段被刪除,則較少的代碼因爲它而被破壞。 – Matthew 2012-02-01 17:56:04

+0

@marcB,你的評論不正確,當你使用select *的時候會有性能問題。 – HLGEM 2012-02-01 18:11:12

1

使用select *依賴於保留列的順序。從關係的角度來看,列的順序是不相關的。當對它們進行操作時,以下兩個表格相同:

create table alpha (int id, int value); 
create table beta (int value, int id); 

它們之間唯一不同的是列的順序。列名稱&類型是相同的。列的順序在所有情況下都應該作爲內部實現細節來處理,因此永遠不應該編程。

有偶爾的情況下,你只想選擇所有列,沒有關於訂單。 (例如,數據分析程序可能會執行某些類型的查詢來確定表的結構 - 但同樣,結構是列的名稱/數據類型,而不是它們的順序。

請勿使用它。

1

本書SQL Antipatterns涵蓋了篇「隱列」。

在查詢中最典型的使用通配符的字段名寫一個即席查詢時,在深入這個話題。這是更快要輸入'*'而不是輸入你想要返回的每個字段名稱,程序員的時間相當昂貴,所以在運行臨時查詢時不必擔心性能會有輕微的增益,會浪費更多時間輸入姓名。

但是,您仍然應該對數據庫模式有所瞭解,因爲等待大量行上的blob列中的值可能會浪費大量時間,特別是如果您想要的只是主鍵值。

使用SELECT *,您可能會在特定的查詢中獲得良好的性能,因爲它返回的結果集可能只有幾百個字節,但是,爲某些其他函數添加一些blob字段到表中,也許現在結果集是數百萬字節,並且突然間查詢速度很慢,即使您實際使用的數據非常小。爲避免此問題,請在查詢中命名列。

如果您使用的是SELECT *,那麼您在添加新列時會自動獲得新列的值,但仍然會成爲上述情況的受害者。這是一種折衷,你必須選擇。

只要你有一個原因,除了懶惰不是一個有效的理由,它是有效的使用SELECT *

+0

不要擔心,我絕不會建議在所有情況下都使用它。然而,我最近大量使用它。我相信我已經取得了足夠的進展,並且當我從一張桌子「需要獲取某些數據」時,我不再使用它了。 – Matthew 2012-02-01 18:01:23

相關問題