2012-04-05 1 views
2

私は、3つの列(firstname、middlename、lastname)の表をこの順序で持っているとします。インデックスもなく、すべてのフィールドがvarcharです。フルテーブルスキャンですべての列(すべての行)が読み取られますか?

フルテーブルスキャンを実行して、特定のファーストネームがテーブルに存在するかどうかを判断すると、OracleまたはMSSQLも他のすべてのカラムを読み込む必要がありますか? (またはそれをスキップするほどスマートですか?)

第1列ではなく第2列で検索している場合はどうなりますか?最初の列は読まなければなりませんか?第1列が2000バイトのデータに近いvarcharの場合はどうでしょうか? ..すべてのバイトが読み込まれる必要がありますか、または何とかスキップされますか?

答えて

8

プログラマの場合、 'read'の定義はおそらく 'メモリアドレスを見てすべてのバイトを読み込みます'が、この定義は間違っています。データベースでは、「読み取り」は「ディスクにアクセスしてメモリ内のデータをフェッチする」ことを意味します。 OracleとSQL Serverは両方ともページ指向の行ストアであるため、すべての列は「読み込み」されます。 off-row storageなどを考えれば複雑になり、buffer poolと考えると本当に泥だらけです。しかし、その詳細レベルでは、質問をより詳細に表現する必要があります(達成しようとしていること、なぜ尋ねているのですか)。また、保存フォーマットについても詳細に理解する必要があります。

SQL ServerとOracleはどちらも、カラム指向の方法で読み込みするために明示的に設計された(つまり、不要なカラムを読み込まない)、columnstoreフォーマットをサポートしていますが、これは、ストレージは非常に、非常に特殊なケースです。

2

データページ内のすべてのデータは、照会されずに保存されない限り読み取られます。 varchar(max)列が8kデータを超えると、新しい一連のページに続きます。これらのページは、フィールドが照会されないと読み取られません。

関連する問題