SQL Server - 在存储过程中选择* vs选择列

时间:2013-06-20 13:26:28

标签: sql sql-server database tsql stored-procedures

在使用Select ColumnName的即席查询中更好,但在保存在计划指南中后,它是否在存储过程中有用?

6 个答案:

答案 0 :(得分:5)

始终明确说明列,即使在存储过程中也是如此。 SELECT *被视为不良做法。

例如,您不知道将返回的列顺序,某些应用程序可能依赖于特定的列顺序。

即。应用程序代码可能类似于:

Id = Column[0]; // bad design

如果您使用过SELECT * ID,则可能不再是第一列,导致应用程序崩溃。此外,如果修改了数据库并添加了另外5个字段,则返回可能不相关的其他字段。

答案 1 :(得分:1)

这些主题总是会引起诸如总是这样或者从不这样做的一揽子陈述,但事实是,与大多数情况一样,它取决于具体情况。我会承认列出专栏通常是一种好习惯,但是使用SELECT *是不好的做法取决于具体情况。

考虑各种都有一个或两个共同字段的表,例如我们有许多具有不同布局的表,但它们都有'access_dt'和'host_ip'。这些表通常不一起使用,但有些可疑活动会提示所有活动的完整报告。这些并不常见,并且它们是手动审查的,因此,它们可以通过循环遍历每个日志表并使用SELECT *利用所有表之间的公共字段来生成报告的存储过程提供良好的服务。 p>

在这种情况下列出字段将是浪费时间。

同样,我同意列出字段通常是一种很好的做法,但使用SELECT *不是 总是 不良做法。

编辑:试图澄清一些例子。

答案 2 :(得分:0)

这是一般的最佳实践,但如果您确实需要所有列,则最好使用快速阅读“SELECT *”。
重要的是避免检索你不需要的数据。

答案 3 :(得分:0)

当您使用表扫描查询大型数据集时,在存储过程等情况下,这被认为是不好的做法。您希望避免使用表扫描,因为它会导致查询性能受到影响。这也是一个可读性问题。

答案 4 :(得分:0)

SOme其他值得思考的东西。如果您的查询有任何联接,则返回您不需要的数据,因为连接列中的数据是相同的。此外,如果稍后更改表以添加一些您不需要的内容(例如用于审计目的的列),您可能会向用户返回他们不应该看到的数据。

答案 5 :(得分:0)

当您需要表中的所有列时,没有人提到过这种情况,即使列发生了变化,例如:将表行存档为XML时。我同意不应该使用“SELECT *”代替“我需要表中当前存在的所有列”,只是出于懒惰或可读性。需要有正当理由。当需要“表中存在可能的所有列时,它可能是必不可少的。”

此外,在为表创建“包装”视图时如何?