为什么单列选择和多列选择之间存在性能差异

a.m*_*.m. 2 mysql sql database sql-server postgresql

我的表 Report 有 10 多列,其中除自动增量 id 之外的每个字段都是 varchar。表中任何行的最大大小约为 80000 字节。

我观察到以下 2 个查询之间存在相当大的差异,其中服务器和客户端都位于同一系统上(大约 150 万行)(列名上也有索引)

select * from Report;
Run Code Online (Sandbox Code Playgroud)

&

select name from Report;
Run Code Online (Sandbox Code Playgroud)

我经历了其他 stackoverflow 问题,Ans 建议

“选择特定列更好的原因之一是它提高了 SQL Server 可以从索引访问数据而不是查询表数据的可能性。”

我的问题是:

1)即使在使用索引时,我们也需要从实际的数据库(即磁盘)中读取数据,因此当我们选择单列或多列(假设使用*)时,将执行相同的磁盘I/o。

2)有人可以用很少的内部知识解释为什么单列选择和多列选择之间存在差异。据我了解,数据库尝试将完整的行存储在同一磁盘扇区中。

假设对用户表进行一些查询,例如

select first_name from user & 
select first_name, age from user 
Run Code Online (Sandbox Code Playgroud)

3)数据库是否执行相同的磁盘I/O(对于上述查询),或者磁盘I/O可能不同,如果用户表有超过10列并且我们选择5~8列,但磁盘I/O保持不变怎么办?

已经在其他答案中读到,使用 select * 并不可取,它可能会导致视图和维护问题(向数据库添加新列时的情况)

这可能是一个愚蠢的问题,因为仍在学习数据库(学科新手)。如果某些问题已在任何地方得到解答,请提供链接。

Pan*_*vos 5

你的假设是错误的。如果索引包含所有选定的列,SQL Server将不会从磁盘上获取它们,而是从索引数据中检索它们。索引比数据页更有可能保存在内存中,因此查询可能根本不需要访问磁盘。

如果您select包含不需要但未包含在任何索引中的列,则服务器将无缘无故地从磁盘读取数据。

另一件发生变化的事情是网络 I/O。生产服务器可能每分钟必须为数百个客户端提供数千个查询。数据中包含无用的列会影响所有客户端。如果您考虑流行网站中使用的服务器,其中客户端可能有数千个,情况会更糟。