3

假设我有一个包含 3 列的表 - 名字、中间名、姓氏 - 按此顺序.. 也没有索引,所有字段都是 varchar。

如果我进行全表扫描以确定表中是否存在给定的名字。Oracle(或 MSSQL)是否也必须通读所有其他列?(或者是否足够聪明地跳过它们?)。

如果我搜索的是第二列而不是第一列呢?必须阅读第一列吗?如果第一列是具有接近 2000 字节数据的 varchar 呢?..是否必须读取所有字节,还是会以某种方式跳过它们?

4

2 回答 2

9

对于程序员来说,“读取”的定义可能是“将查看内存地址并读取每个字节”,但对于数据库,这个定义是不正确的。在数据库中,“读取”意味着“访问磁盘并获取内存中的数据”。由于 Oracle 和 SQL Server 都是面向页面的行存储,因此是的,所有列都将被“读取”。一旦考虑行外存储等,事情就会变得复杂,如果考虑缓冲池,事情就会变得非常混乱。但是对于那个级别的细节,您需要更详细地表达问题(您想要实现什么以及您为什么要问?)并且您还需要非常详细地了解存储格式。

附带说明一下,SQL Server 和 Oracle 都支持列存储格式,该格式明确设计用于以面向列的方式读取(即不读取不需要的列),但这不太可能是您想要的,并且列存储是一种非常,非常,特例。

于 2012-04-05T19:09:27.260 回答
2

数据页中的所有数据都会被读取,除非它没有被查询和越界存储。当 varchar(max) 列超过 8k 数据时,它将在一组新页面中继续。未查询该字段时不会读取这些页面。

于 2012-04-05T19:02:17.510 回答