給出你的說明你是選擇所有列,差別不大。此時..但是,要意識到數據庫模式確實會發生變化。如果你用SELECT *
您將獲得添加到表中的任何新列,即使您的代碼可能不準備使用或表示這些新數據。這意味著您將系統暴露在意外的性能和功能更改中。
您可能愿意將此視為一項小成本,但要意識到,您不需要的列仍然必須是:
- 從數據庫讀取
- 通過網絡發送
- 編組到您的進程中
- (用于ado類型技術)保存在內存中的數據表中。
- 被忽視和丟棄/垃圾收集
第1項有許多隱藏成本,包括消除一些潛在的覆蓋索引,導致數據頁負載(和服務器緩存崩潰),產生行/頁/表鎖,否則可能會避免。
這與指定列相對于*
唯一可能的節省是:
- 程序員不需要重新訪問SQL來添加列
- SQL的網絡傳輸更小/更快。
- SQLServer查詢解析/驗證時間
- SQLServer查詢計劃緩存
對于第1項,實際情況是,您將添加/更改代碼,以使用您可能添加的任何新列,因此這是一次清洗。
對于第2項,這種差異很少足以將您推入不同的數據包大小或網絡數據包數量。如果您到了SQL語句傳輸時間是主要問題的地步,那么您可能首先需要降低語句的速率。
對于第3項,由于*
無論如何都必須發生,這意味著無論如何都要查閱表模式。實際上,列出列將導致相同的成本,因為它們必須根據模式進行驗證。換句話說,這是一次徹底的清洗。
對于第4項,當指定特定列時,查詢計劃緩存可能會變大,但是只如果您正在處理不同的列集(這不是您指定的)。在這種情況下,你不想不同的緩存條目,因為您需要不同的計劃。
因此,由于您指定問題的方式,這一切都歸結到了最終模式修改的問題彈性上。如果將此模式刻錄到ROM中(發生這種情況),則*
是完全可以接受的。
但是,我的一般指導原則是,您應該只選擇所需的列,這意味著有時看起來您需要所有這些內容,但是DBA和模式演進意味著可能會出現一些新列,這些列可能會對查詢產生很大影響。
我的建議是你應該始終選擇特定列..記住,你一遍又一遍地做你所做的事情,所以要養成正確做好它的習慣。
如果您想知道為什么模式可能更改而不更改代碼,請考慮審計日志記錄、有效/過期日期以及DBA為系統地為遵從性問題添加的其他類似內容。另一個暗地更改的來源是系統或用戶定義字段中其他地方的性能去或錯誤。