SQL中SELECT *的任何缺点?

时间:2012-08-01 05:44:03

标签: sql select

假设我有一个执行SQL的程序,我想在表中查询A,B和C列中的值(假设有一些我并不严格需要的列)。 SELECT *和SELECT A,B,C之间有什么区别?

我的想法到目前为止。只选择您需要的列:

  • ...将需要更少的内存来存储结果。
  • ...可能会使程序中的结果更容易解析。
  • ...不会更快,除非所选列都可以使用覆盖索引进行检索。

我觉得可能还有其他问题在发挥作用。

3 个答案:

答案 0 :(得分:5)

你所说的是正确的,但还有更多。

“select *”的另一个非常重要的问题是如果表架构发生更改会发生什么。 如果客户端使用“select *”,它将获得一组可能意外的列(更多列,更少列,不同顺序......)。这非常糟糕。

如果客户端选择了它想要的确切列名(A,B,C),那么它将获得具有预期格式(如果可能)的结果集或特定的明显错误。

此外,选择不需要的列的内存消耗和可能的网络流量问题对于“大型”应用程序可能至关重要。

答案 1 :(得分:4)

使用列名选择会提高数据库引擎从索引访问数据的可能性,而不是查询表数据....

一篇非常相关的文章,您可以阅读here

SELECT *会在数据库架构发生更改时将您的系统暴露给意外的性能和功能更改,因为您要将任何新列添加到表中,即使您的代码未准备使用或提出新数据。

答案 2 :(得分:1)

如果您使用select a,b,c from table,查询处理会有所改进。例如,您从一列中提取记录,该列是非聚集索引的键列;在这种情况下,将从非聚集索引页面检索记录,从而减少发布的物理数据库页面读取次数。物理页面读取越少,总是有利于提高性能。

指向SQL Server的注意事项

  1. 默认情况下,SQL Sever会将所有列复制到缓冲池,而不考虑SELECT查询中使用的列。
  2. 虽然您在SQL Server查询处理中没有发现太多性能影响,但最好只使用您需要的列,因为这会提高整体系统性能。
  3. 更多:SELECT * Vs. SELECT COLUMNS – SQL Server Optimization Techniques