簡體   English   中英

SQL Server - 在存儲過程中選擇* vs選擇列

[英]SQL Server - Select * vs Select Column in a Stored Procedure

在使用Select ColumnName的臨時查詢中更好,但在保存在計划指南中后,它是否在存儲過程中重要?

始終明確說明列,即使在存儲過程中也是如此。 SELECT *被認為是不好的做法。

例如,您不知道將返回的列順序,某些應用程序可能依賴於特定的列順序。

即應用程序代碼可能類似於:

Id = Column[0]; // bad design

如果您已使用SELECT * ID可能不再是第一列並導致應用程序崩潰。 此外,如果修改了數據庫並添加了另外5個字段,則返回可能不相關的其他字段。

這些話題總是引出一致的陳述,如總是這樣做或從不這樣做,但事實是,就像大多數情況一樣,它取決於具體情況。 我會承認列出列通常是一種好習慣,但使用SELECT *的不良做法取決於具體情況。

考慮各種都有一個或兩個共同字段的表,例如我們有許多具有不同布局的表,但它們都有'access_dt'和'host_ip'。 這些表通常不一起使用,但有些可疑活動會提示所有活動的完整報告。 這些並不常見,它們是人工審查的,因此,它們可以通過循環遍歷每個日志表並使用SELECT *利用所有表之間的公共字段生成報告的存儲過程提供良好的服務。

在這種情況下列出字段將是浪費時間。

同樣,我同意列出字段通常是一種好習慣,但使用SELECT *並不總是不好的做法。

編輯:試圖澄清一些例子。

這是一般的最佳實踐,但如果您確實需要所有列,則最好使用快速閱讀“SELECT *”。
重要的是避免檢索您不需要的數據。

當您使用表掃描查詢大型數據集時,在存儲過程等情況下,這被認為是不好的做法。 您希望避免使用表掃描,因為它會導致查詢性能受到影響。 這也是可讀性的問題。

想想其他的食物。 如果您的查詢有任何聯接,則返回您不需要的數據,因為連接列中的數據是相同的。 此外,如果稍后更改表以添加一些您不需要的內容(例如用於審計目的的列),您可能會向用戶返回他們不應該看到的數據。

當您需要表中的所有列時,即使列發生更改,例如將表行存檔為XML時,也沒有人提到過這種情況。 我同意不應該使用“SELECT *”代替“我需要表中當前存在的所有列”,只是出於懶惰或可讀性。 需要有正當理由。 當需要“表中可能存在的所有列”時,它可能是必不可少的。

另外,為表創建“包裝”視圖時怎么樣?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM