2008-09-24 45 views

回答

35

從不,一直使用「選擇*」!

這是查詢設計的基本規則!

有多種原因。其中之一是,如果你的表只有三個字段,並且你在調用查詢的代碼中使用了所有三個字段,那麼隨着應用程序的增長,你很可能會在表中添加更多的字段,如果您的select *查詢只是爲了返回調用代碼的這3個字段,那麼您將從數據庫中獲取比您需要更多的數據。

另一個原因是性能。在查詢設計中,不要像這個咒語那樣考慮可重用性:

帶着所有你可以吃,但吃掉你所有的東西。

+1

您應該嘗試使用「select *」的唯一時間是在exists()中,但不要!改爲使用「選擇1」。 – 2008-09-25 01:11:53

0

如果你真的選擇所有列,不應做出任何明顯的區別你是否要求*或者如果你是明確的。 SQL服務器將以幾乎相同的時間以相同的方式解析請求。

11

最好的做法是按名稱選擇每一列。將來,您的數據庫模式可能會更改,以添加您不需要特定查詢的列。我會建議按名稱選擇每一列。

0

總是從視圖中選擇col1,col2等。我知道的兩種方法之間沒有效率差別,但使用「select *」可能很危險。如果修改視圖定義添加新列,則可以使用「select *」分解程序,而選擇一組預定義的列(即使所有列都已命名)仍然可以工作。

0

我想這一切都取決於查詢優化器的功能。

如果我想獲得行中的每條記錄,我通常會使用「SELECT * ...」選項,因爲我不必擔心是否應該更改基礎表結構。同樣,對於維護代碼的人來說,看到「SELECT *」告訴他們這個查詢是爲了返回每一列,而單獨列出這些列並不表達同樣的意圖。

2

Select *是一種不好的編程習慣。它可能會導致事情中斷,因爲它可以避免中斷事件。如果您只查詢一個表或視圖,那麼效率增益可能不在那裏(儘管如果您不打算實際使用每個字段,則可能會有這種效果)。如果您有一個內部聯接,那麼至少有兩個字段返回相同的數據(聯接字段),因此您正在浪費網絡資源將冗餘數據發送迴應用程序。您一開始不會注意到這一點,但隨着結果集越來越大,您很快就會擁有一個完整且不需要的網絡管道。我可以想到沒有任何情況下,select *會帶給你什麼。如果添加了新列,並且不需要轉到代碼中對其執行任何操作,那麼按照定義,列不應該由您的查詢返回。如果有人以不同的順序刪除並重新創建表格,那麼所有的查詢都會顯示錯誤的信息,或者會導致錯誤的結果,例如將價格放入新記錄中的零件編號字段中。

再加上從對象瀏覽器拖動列名很快,所以這只是懶惰而不是編碼效率。

0

對於性能 - 查看查詢計劃(應該沒有區別)。

可維護性。 - 始終提供一個字段列表(也適用於INSERT INTO)。

3

只是爲了澄清一些人已經提出的觀點,Select *效率低下的原因是因爲必須先向數據庫發出一個初始呼叫,以確定哪些字段可用,然後進行第二次呼叫,查詢是使用顯式列進行的。

隨意使用當您正在調試,運行臨時查詢或處於開發查詢的早期階段時,請選擇*,但只要您知道所需的列,請明確說明它們。

0

這取決於。視圖繼承可以是一個方便的事情,易於維護(SQL Anywhere的):

create view v_fruit as select F.id, S.strain from F key join S; 
create view v_apples as select v_fruit.*, C.colour from v_fruit key join C; 
0
select 
column1 
,column2 
,column3 
. 
. 
. 
from Your-View 

這一個比使用HTTP的

select * 
from Your View