2012-04-05 82 views
2

說我有一個表3列 - firstname,middlename,lastname - 按順序..也沒有索引,所有的字段都是varchar。全表掃描是否讀取所有列(對於每一行)?

如果我進行全表掃描以確定表中是否存在給定的名字,那麼Oracle(或MSSQL)是否也必須通讀所有其他列? (或者它足夠聰明,可以跳過它們?)。

如果我通過第二列而不是第一列搜索,那麼怎麼辦?第一列是否需要閱讀?如果第一列是一個接近2000bytes數據的varchar,那麼怎麼辦? ..所有的字節都必須被讀取,否則它們會以某種方式被跳過?

回答

8

對於程序員來說,'read'的定義可能是'將查看內存地址並讀取每個字節',但對於數據庫來說,這個定義是不正確的。在數據庫中,「讀取」意味着「訪問磁盤並獲取內存中的數據」。既然Oracle和SQL Server都是面向頁面的行存儲,那麼是的,所有列都將被「讀取」。一旦你考慮off-row storage等事情會變得複雜,如果你考慮buffer pool,事情會變得非常混亂。但是對於這種詳細程度,您需要更詳細地表達問題(您要實現的目標以及爲什麼要問?),並且您還需要詳細瞭解存儲格式。

作爲一個附註,SQL Server和Oracle都支持columnstore格式,該格式明確設計用於以列爲導向的方式進行讀取(即不讀取不需要的列),但這不太可能是您想要的並且列狀存儲是一個非常非常特殊的情況。

2

除非不查詢和存儲,否則將讀取數據頁中的所有數據。當varchar(max)列超過8k數據時,它將繼續在一組新頁面中。當字段沒有被查詢時,這些頁面不會被讀取。