2009-12-08 82 views
3

我搜索了這個問題,似乎無法找到一致的意見,或許多基於實體數據的觀點。我只是想知道,如果在SQL SELECT語句中使用通配符會導致額外的開銷,而不是單獨調用每個項目。我在幾個不同的測試查詢中比較了兩者的執行計劃,看起來估計總是一樣的。是否可能在其他地方招致一些開銷,或者他們的處理方式是否相同?Sql通配符:性能開銷?

我指專門:

SELECT * 

SELECT item1, item2, etc. 
+0

你能用一個小例子來澄清一下嗎? – 2009-12-08 16:13:20

+3

另請注意,在生產代碼中使用通配符99%是不良設計的一個症狀。你永遠不應該這樣做。永遠永遠。永遠。我沒有足夠的揹包記憶。 – 2009-12-08 16:20:43

+0

我同意,並且我從未使用過*的確切原因。但是,我讀到了一些模糊的觀點,認爲SELECT語句中的通配符會產生一些開銷,只是想根據事實做一些澄清,而這些事實我很難找到。 – 2009-12-08 16:45:56

回答

9
SELECT * FROM... 

而且因爲都是一個未優化的掃描

SELECT every, column, list, ... FROM... 

將執行相同的

的區別是:

  • 在SYS.COLUMNS進行額外的查找,解決*
  • 合同/簽名更改時表架構cha nges
  • 無法創建覆蓋指數。事實上,根本沒有調整選項,真的
  • 必須刷新需要,如果非架構綁定意見
  • 不能索引或使用schemabind視圖*
  • ...和其他的東西

其他SO對同一主題的問題...

+0

要添加,我認爲與通過磁盤獲取數據所需的實際工作相比,此通配符分辨率中的「開銷」可以忽略不計。 – 2009-12-08 16:21:53

+0

確實如此,但人們經常提到它。當然,對於300列和10行..;-) – gbn 2009-12-08 16:23:11

+0

感謝您的信息! – 2009-12-08 16:41:53

1

編輯:如果你正在談論的星號通配符作爲Select * From ...然後看其他的反應...

如果您在謂詞子句中使用通配符,或者使用Like運算符(_ , %)來描述其他查詢表達式,則:

這與使用通配符是否影響SQL是否是「SARG-ABLE」無關。 SARGABLE(Search-ARGument-able)表示查詢的搜索或排序參數是否可用作現有索引的入口參數。如果你在前面加上外卡的參數

Where Name Like '%ing' 

年初那麼有沒有方法來遍歷的名稱字段的索引來查找節點是年底在「荷蘭國際集團」。

如果OTOH你追加通配符結束,

Where Name like 'Donald%' 

那麼優化器仍然可以使用上的名字列的索引和查詢仍然是特區政府,能夠

+0

我應該更具體。我編輯要這樣做。我指的是SELECT *與SELECT列表。但是,這個答案讓我對一個我沒有考慮過的問題有了一些瞭解。謝謝! – 2009-12-08 16:48:47

2

你的意思是select * from ...而不是select col1, col2, col3 from ...

我認爲這是總是更好的名字列和檢索信息的最小量,因爲

  • 您的代碼將獨立工作,在數據庫中列的物理順序的。列順序不應該影響您的應用程序,但如果您使用*將會是這種情況。在數據庫遷移等情況下可能會非常危險。
  • 如果您命名列,DBMS可以進一步優化執行。例如,如果存在包含您感興趣的所有數據的索引,則根本不會訪問該表。

如果你的意思是「通配符」的其他內容,只是忽略我的答案...

+0

這就是我所指的情況,雖然我期待看到除執行計劃之外可能發生的性能表現。不過,我同意你不使用它的理由。 – 2009-12-08 16:50:50

0

如果您調用SQL野車是*。它並不意味着它自身的性能開銷。但是,如果表格被擴展,您可能會發現自己檢索不搜索的字段。 一般而言,在您搜索或插入的字段中不具體,這是一個壞習慣。 考慮

insert into mytable values(1,2) 

如果表擴展到三個字段會發生什麼?

0

從執行計劃的角度來看,它可能不是更多的工作。但是,如果您正在提取實際上不需要的列,那就是在數據庫和應用程序之間使用的額外網絡帶寬。另外,如果您使用高級客戶端API對返回的數據執行一些操作(例如,Perl的selectall_hashref),那麼這些額外的列將在客戶端上強加性能成本。多少?依靠。