假设我有一个包含3列的表 - firstname,middlename,lastname - 按顺序排列..也没有索引,所有字段都是varchar。
如果我进行全表扫描以确定表中是否存在给定的名字.. Oracle(或MSSQL)是否也必须读取所有其他列? (或者它是否足够聪明,可以跳过它们?)。
如果我搜索第二列而不是第一列,该怎么办?第一列是否必须阅读?如果第一列是一个接近2000字节数据的varchar怎么办? ..将要读取所有字节,还是会以某种方式跳过它们?
答案 0 :(得分:8)
对于程序员来说,'read'的定义可能是'将查看内存地址并读取每个字节',但对于数据库,此定义不正确。在数据库中,“读取”意味着“访问磁盘并获取内存中的数据”。由于Oracle和SQL Server都是面向页面的行存储,然后是,所有列都将被“读取”。一旦你考虑off-row storage等问题就会变得复杂,如果你考虑buffer pool,事情会变得很糟糕。但是对于这个详细程度,您需要更详细地表达问题(您要实现的目标以及为什么要问?)并且您还需要非常详细地了解存储格式。
作为旁注,SQL Server和Oracle都支持columnstore格式,明确设计用于以列为导向的方式进行读取(即不读取不需要的列),但这不太可能是你的想要和列式存储是一个非常非常特殊的案例。
答案 1 :(得分:2)
除非未查询并存储超出范围,否则将读取数据页中的所有数据。当varchar(max)列超过8k数据时,它将在一组新页面中继续。未查询字段时,不会读取这些页面。