3

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

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

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

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

4

3 回答 3

6

你说的是对的,但还有更多。

“select *”的另一个非常重要的问题是如果表模式发生变化会发生什么。如果客户端使用“select *”,它将获得一组可能意想不到的列(更多列,更少列,不同顺序......)。这真是太糟了。

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

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

于 2012-08-01T05:54:30.317 回答
4

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

你可以在这里阅读一篇非常相关的文章

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

于 2012-08-01T05:49:36.087 回答
1

如果您使用select a,b,c from table. 例如,您正在从作为非聚集索引的键列的列中提取记录;在这种情况下,记录将从非聚集索引页面中检索,因此发出的物理数据库页面读取次数较少。更少的物理页面读取总是更好的性能的好兆头。

SQL Server 的注意事项

  1. 默认情况下,SQL Sever 将所有列复制到缓冲池,而与 SELECT 查询中使用的列无关。
  2. 尽管您在 SQL Server 查询处理中没有发现太大的性能影响,但最好只使用您需要的列,因为这会提高整体系统性能。

更多:SELECT * Vs。SELECT COLUMNS – SQL Server 优化技术

于 2012-08-01T05:48:49.707 回答