3

在使用 Select ColumnName 的临时查询中更好,但是在存储过程中保存在计划指南中之后是否重要?

4

6 回答 6

5

始终显式声明列,即使在存储过程中也是如此。SELECT *被认为是不好的做法。

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

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

Id = Column[0]; // bad design

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

于 2013-06-20T13:28:29.427 回答
1

这些话题总是会引发笼统的陈述,比如总是这样做或从不这样做,但现实情况是,就像大多数事情一样,这取决于情况。我承认列出列通常是一种好的做法,但使用它是否是不好的做法SELECT *取决于具体情况。

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

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

同样,我同意列出字段通常是一种好习惯,使用SELECT *.

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

于 2013-06-20T13:59:27.427 回答
0

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

另外,为表创建“包装器”视图时怎么样?

于 2013-06-20T14:41:03.083 回答
0

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

于 2013-06-20T13:28:36.353 回答
0

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

于 2013-06-20T14:31:14.793 回答
0

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

于 2013-06-20T13:36:31.963 回答