在使用 Select ColumnName 的临时查询中更好,但是在存储过程中保存在计划指南中之后是否重要?
6 回答
始终显式声明列,即使在存储过程中也是如此。SELECT *
被认为是不好的做法。
例如,您不知道将返回的列顺序,某些应用程序可能依赖于特定的列顺序。
即应用程序代码可能类似于:
Id = Column[0]; // bad design
如果你使用过的SELECT *
ID 可能不再是第一列而导致应用程序崩溃。此外,如果修改了数据库并添加了额外的 5 个字段,您将返回可能不相关的其他字段。
这些话题总是会引发笼统的陈述,比如总是这样做或从不这样做,但现实情况是,就像大多数事情一样,这取决于情况。我承认列出列通常是一种好的做法,但使用它是否是不好的做法SELECT *
取决于具体情况。
考虑具有一个或两个公共字段的各种表,例如,我们有许多具有不同布局的表,但它们都有“access_dt”和“host_ip”。这些表格通常不会一起使用,但在某些情况下,可疑活动会提示所有活动的完整报告。这些并不常见,并且它们是手动审查的,因此,它们由存储过程很好地服务,该存储过程通过循环遍历每个日志表并使用SELECT *
所有表之间的公共字段来生成报告。
在这种情况下列出字段是浪费时间。
同样,我同意列出字段通常是一种好习惯,但使用SELECT *
.
编辑:试图澄清一下例子。
没有人提到当您需要表中的所有列时,即使列发生变化,例如当将表行归档为 XML 时。我同意不应该使用“SELECT *”来代替“我需要表中当前存在的所有列”,只是出于懒惰或为了可读性。需要有一个正当的理由。当需要“表中可能存在的所有列”时,它可能是必不可少的。
另外,为表创建“包装器”视图时怎么样?
一般而言,这是一种最佳做法,但如果您确实需要所有列,则最好使用快速阅读的“SELECT *”。
重要的是避免检索您不需要的数据。
其他一些值得思考的食物。如果您的查询有任何连接,那么您将返回不需要的数据,因为连接列中的数据是相同的。此外,如果稍后更改表以添加一些您不需要的内容(例如用于审计目的的列),您可能会向用户返回他们不应该看到的数据。
在使用表扫描查询大型数据集时,在存储过程等情况下,这被认为是不好的做法。您希望避免使用表扫描,因为它会影响查询的性能。这也是可读性的问题。