我搜索了這個問題,似乎無法找到一致的意見,或許多基於實體數據的觀點。我只是想知道,如果在SQL SELECT語句中使用通配符會導致額外的開銷,而不是單獨調用每個項目。我在幾個不同的測試查詢中比較了兩者的執行計劃,看起來估計總是一樣的。是否可能在其他地方招致一些開銷,或者他們的處理方式是否相同?Sql通配符:性能開銷?
我指專門:
SELECT *
與
SELECT item1, item2, etc.
我搜索了這個問題,似乎無法找到一致的意見,或許多基於實體數據的觀點。我只是想知道,如果在SQL SELECT語句中使用通配符會導致額外的開銷,而不是單獨調用每個項目。我在幾個不同的測試查詢中比較了兩者的執行計劃,看起來估計總是一樣的。是否可能在其他地方招致一些開銷,或者他們的處理方式是否相同?Sql通配符:性能開銷?
我指專門:
SELECT *
與
SELECT item1, item2, etc.
SELECT * FROM...
而且因爲都是一個未優化的掃描
SELECT every, column, list, ... FROM...
將執行相同的
的區別是:
其他SO對同一主題的問題...
要添加,我認爲與通過磁盤獲取數據所需的實際工作相比,此通配符分辨率中的「開銷」可以忽略不計。 – 2009-12-08 16:21:53
確實如此,但人們經常提到它。當然,對於300列和10行..;-) – gbn 2009-12-08 16:23:11
感謝您的信息! – 2009-12-08 16:41:53
編輯:如果你正在談論的星號通配符作爲Select * From ...
然後看其他的反應...
如果您在謂詞子句中使用通配符,或者使用Like運算符(_ , %)
來描述其他查詢表達式,則:
這與使用通配符是否影響SQL是否是「SARG-ABLE」無關。 SARGABLE(Search-ARGument-able)表示查詢的搜索或排序參數是否可用作現有索引的入口參數。如果你在前面加上外卡的參數
Where Name Like '%ing'
年初那麼有沒有方法來遍歷的名稱字段的索引來查找節點是年底在「荷蘭國際集團」。
如果OTOH你追加通配符結束,
Where Name like 'Donald%'
那麼優化器仍然可以使用上的名字列的索引和查詢仍然是特區政府,能夠
我應該更具體。我編輯要這樣做。我指的是SELECT *與SELECT列表。但是,這個答案讓我對一個我沒有考慮過的問題有了一些瞭解。謝謝! – 2009-12-08 16:48:47
你的意思是select * from ...
而不是select col1, col2, col3 from ...
?
我認爲這是總是更好的名字列和檢索信息的最小量,因爲
*
將會是這種情況。在數據庫遷移等情況下可能會非常危險。如果你的意思是「通配符」的其他內容,只是忽略我的答案...
這就是我所指的情況,雖然我期待看到除執行計劃之外可能發生的性能表現。不過,我同意你不使用它的理由。 – 2009-12-08 16:50:50
如果您調用SQL野車是*。它並不意味着它自身的性能開銷。但是,如果表格被擴展,您可能會發現自己檢索不搜索的字段。 一般而言,在您搜索或插入的字段中不具體,這是一個壞習慣。 考慮
insert into mytable values(1,2)
如果表擴展到三個字段會發生什麼?
從執行計劃的角度來看,它可能不是更多的工作。但是,如果您正在提取實際上不需要的列,那就是在數據庫和應用程序之間使用的額外網絡帶寬。另外,如果您使用高級客戶端API對返回的數據執行一些操作(例如,Perl的selectall_hashref
),那麼這些額外的列將在客戶端上強加性能成本。多少?依靠。
你能用一個小例子來澄清一下嗎? – 2009-12-08 16:13:20
另請注意,在生產代碼中使用通配符99%是不良設計的一個症狀。你永遠不應該這樣做。永遠永遠。永遠。我沒有足夠的揹包記憶。 – 2009-12-08 16:20:43
我同意,並且我從未使用過*的確切原因。但是,我讀到了一些模糊的觀點,認爲SELECT語句中的通配符會產生一些開銷,只是想根據事實做一些澄清,而這些事實我很難找到。 – 2009-12-08 16:45:56