【发布时间】:2014-10-29 00:09:07
【问题描述】:
我有超过 10 列的表 Report,其中除自动增量 id 之外的每个字段都是 varchar。 表中任何一行的最大大小约为 80000 字节。
我观察到以下 2 个查询之间存在相当大的差异,其中服务器和客户端都在同一系统上(大约 150 万行)(列名也有索引)
select * from Report;
&
select name from Report;
我经历了其他 stackoverflow 问题,其中 Ans 建议
“选择特定列更好的一个原因是它 提高 SQL Server 可以访问数据的可能性 索引而不是查询表数据。 "
我的问题是:
1) 即使在使用索引时,我们也需要从实际的 DB(即磁盘)中读取,所以相同的磁盘 I/O 将 当我们选择单列或多列时执行(比如说使用 *)。
2)有人可以用很少的内部知识来解释为什么单列选择和多列选择之间存在差异。 据我了解,数据库尝试将完整的行存储在同一磁盘扇区中。
让我们说一些像用户表这样的查询
select first_name from user &
select first_name, age from user
3) DB 是否执行相同的磁盘 I/O(对于上述查询),或者磁盘 I/O 可能不同,如果用户表有超过 10 列并且我们选择 5~8 列仍然磁盘 I/O 怎么办一样吗?
在其他 Ans 中已经读到使用 select * 是不可取的,它可能会导致视图和维护问题(将新列添加到 DB 时的情况)
这可能是一个愚蠢的问题,因为仍在学习数据库(新手到主题)。如果某些问题已经在任何地方得到解答,请提供链接。
【问题讨论】:
-
你的假设是错误的。如果索引包含所有选定的列,SQL Server 将不会访问磁盘来获取它们。
-
stackoverflow.com/questions/609343/… 但 Panagiotis 给出的实际答案完美地击中了头部。
标签: mysql sql sql-server database postgresql