![](/img/trans.png)
[英]Is syntax like “select field1,field2,field3 from A where (a,b) in (select a,b from B)” supported in derby jdbc?
[英]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
只包含id
和column1
,則查詢是相同的。
如果將column2
添加到mytable
會發生什么?
第二個查詢(帶有命名列)仍然使用索引(因為in包含查詢所需的所有內容),但第一個查詢也需要選擇column2
( SQL Server
不知道你會忽略它)。
這會將Clustered Table Seek
添加到計划中,並且您的查詢性能會變差。
使用表中的select col1,col2,col3而不是select * from table1。 如本文和此處所述,這具有許多優點。
另見: http : //weblogs.sqlteam.com/jeffs/jeffs/archive/2007/07/26/60271.aspx
永遠不要聽任何人告訴你總是在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
上明確命名列的原因是
除非您從不引用客戶端代碼中的任何列名稱,否則應使用命名列。
我不會告訴你“ 從來沒有 ”或“ 總是 ”使用其中一個。 從那開始的建議不是字面意思。
如果您正在處理小數據集,請不要堅持使用愚蠢的“優化”,例如將*
替換為字段列表,特別是如果您要指定所有字段。
具有可讀且易於維護的SQL代碼通常比一些節省的CPU周期或少幾千字節的內存使用或網絡流量更有價值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.