我刚刚与我的一位同事讨论了SQL Server在存储过程中指定查询命令的性能。
所以我想知道哪一个比另一个更受欢迎,并说明背后的具体原因。
假设,我们确实有一个名为的表
员工(EmpName,EmpAddress)
我们想要从表中选择所有记录。所以我们可以用两种方式编写查询,
从员工中选择*
从员工中选择EmpName,EmpAddress
所以我想知道上述查询中是否存在任何特定的差异或性能问题,或者它们只是等于SQL Server引擎。
更新:
答案 0 :(得分:8)
如果向表中添加一列,具体差异将显示其丑陋的头部。
突然,您希望返回两列的查询现在返回三个。如果您专门为这两列编码,则其余代码现在已损坏。
在性能方面,应该没有区别。
我总是采用在处理数据库时尽可能具体的方法。如果表有两列,并且您只需要这两列,则具体。指定这两列。它将来会让你头疼不已。
答案 1 :(得分:7)
您应该始终明确引用列。这样,如果表结构发生更改(并且这些更改以智能,向后兼容的方式进行),您的查询将继续工作并可以随时修改。
此外,除非您确实需要表中的所有列(不是典型的),否则使用SELECT *会为应用程序带来比必要更多的数据,并可能强制执行聚簇索引扫描而不是可能已满足的数据。较窄的覆盖指数。
答案 2 :(得分:7)
我是一个狂热的人,尽可能具体。"规则也是。从长远来看,不遵循它会伤害到你。但是,你的问题似乎来自不同的背景,所以让我试着回答它。
当您向SQL Server提交查询时,它会经历几个阶段:
让我们看看每一个:
考虑到所有这些因素,使用*
表示法时可能会节省几纳秒。但是,你的例子非常简单。在一个更复杂的示例中,在多表连接中指定为表的列子集可能会导致与使用*
不同的计划。如果发生这种情况,我们可以非常肯定显式查询会更快。
上述比较还假设SQL Server进程在单个处理器上单独运行,并且不会同时提交其他查询。如果在编译期间进程必须产生,那么额外的周期将远远超过我们试图保存的周期。
因此,与实际执行时间相比,我们所谈论的保存非常微小,不应该被用作“坏”的借口。编码实践。
我希望这能回答你的问题。
答案 3 :(得分:1)
性能方面,我认为这两者之间没有区别。但是这两种情况在不同的情况下使用可能有什么不同。
考虑一个略大的表。如果你的表(Employees)包含10列,那么第一个查询将保留表的所有信息。但是对于第二个查询,你可以指定你需要哪些列信息。所以当你需要所有的时候1号员工的信息是最好的,而不是指定所有列名
当然,当你需要改变一个表时,那些2就不一样了。