亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

哪個更快/最好?選擇*或選擇列1、列2、列3等

哪個更快/最好?選擇*或選擇列1、列2、列3等

智慧大石 2019-06-13 17:37:26
哪個更快/最好?選擇*或選擇列1、列2、列3等我聽說過SELECT *在編寫sql命令時使用通常是不好的做法,因為SELECT你特別需要的列。如果我需要SELECT表中的每一列,我是否應該使用SELECT * FROM TABLE或SELECT column1, colum2, column3, etc. FROM TABLE在這種情況下,效率真的很重要嗎?我覺得SELECT *如果您真的需要所有的數據,那么在內部就會更理想,但我是說這一點并沒有真正了解數據庫。我很想知道這種情況下的最佳做法是什么。最新情況:我也許應該明確指出,我唯一能做到的就是想要做SELECT *當我從一個表中選擇數據時,我知道所有的列都需要被檢索,即使添加了新的列。然而,考慮到我所看到的回應,這似乎仍然是個壞主意,SELECT *不應該因為我想過的更多的技術原因而使用。
查看完整描述

3 回答

?
精慕HU

TA貢獻1845條經驗 獲得超8個贊

選擇特定列的一個更好的原因是,它提高了SQLServer可以從索引訪問數據的可能性,而不是查詢表數據。

這是我寫的一篇文章:選擇查詢的真正原因是索引覆蓋率不好。

更改也不那么脆弱,因為任何使用數據的代碼都將得到相同的數據結構,而不管將來對表模式做什么更改。


查看完整回答
反對 回復 2019-06-13
?
Smart貓小萌

TA貢獻1911條經驗 獲得超7個贊

給出你的說明你選擇所有列,差別不大。此時..但是,要意識到數據庫模式確實會發生變化。如果你用SELECT *您將獲得添加到表中的任何新列,即使您的代碼可能不準備使用或表示這些新數據。這意味著您將系統暴露在意外的性能和功能更改中。

您可能愿意將此視為一項小成本,但要意識到,您不需要的列仍然必須是:

  1. 從數據庫讀取
  2. 通過網絡發送
  3. 編組到您的進程中
  4. (用于ado類型技術)保存在內存中的數據表中。
  5. 被忽視和丟棄/垃圾收集

第1項有許多隱藏成本,包括消除一些潛在的覆蓋索引,導致數據頁負載(和服務器緩存崩潰),產生行/頁/表鎖,否則可能會避免。

這與指定列相對于*唯一可能的節省是:

  1. 程序員不需要重新訪問SQL來添加列
  2. SQL的網絡傳輸更小/更快。
  3. SQLServer查詢解析/驗證時間
  4. SQLServer查詢計劃緩存

對于第1項,實際情況是,您將添加/更改代碼,以使用您可能添加的任何新列,因此這是一次清洗。

對于第2項,這種差異很少足以將您推入不同的數據包大小或網絡數據包數量。如果您到了SQL語句傳輸時間是主要問題的地步,那么您可能首先需要降低語句的速率。

對于第3項,由于*無論如何都必須發生,這意味著無論如何都要查閱表模式。實際上,列出列將導致相同的成本,因為它們必須根據模式進行驗證。換句話說,這是一次徹底的清洗。

對于第4項,當指定特定列時,查詢計劃緩存可能會變大,但是如果您正在處理不同的列集(這不是您指定的)。在這種情況下,你不想不同的緩存條目,因為您需要不同的計劃。

因此,由于您指定問題的方式,這一切都歸結到了最終模式修改的問題彈性上。如果將此模式刻錄到ROM中(發生這種情況),則*是完全可以接受的。

但是,我的一般指導原則是,您應該只選擇所需的列,這意味著有時看起來您需要所有這些內容,但是DBA和模式演進意味著可能會出現一些新列,這些列可能會對查詢產生很大影響。

我的建議是你應該始終選擇特定列..記住,你一遍又一遍地做你所做的事情,所以要養成正確做好它的習慣。

如果您想知道為什么模式可能更改而不更改代碼,請考慮審計日志記錄、有效/過期日期以及DBA為系統地為遵從性問題添加的其他類似內容。另一個暗地更改的來源是系統或用戶定義字段中其他地方的性能去或錯誤。


查看完整回答
反對 回復 2019-06-13
?
慕萊塢森

TA貢獻1810條經驗 獲得超4個贊

只應選擇所需的列。即使您需要所有的列,最好還是列出列名,這樣SQL服務器就不必查詢系統表中的列。

此外,如果有人向表中添加列,則應用程序可能會中斷。您的程序將獲得它沒有預料到的列,而且它可能不知道如何處理它們。

除此之外,如果表中有一個二進制列,那么查詢就會慢得多,并且使用更多的網絡資源。


查看完整回答
反對 回復 2019-06-13
  • 3 回答
  • 0 關注
  • 464 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號