3

firstname、middlename、lastname の 3 つの列をこの順序で持つテーブルがあるとします。インデックスもなく、すべてのフィールドが varchar です。

特定のファーストネームがテーブルに存在するかどうかを判断するためにフル テーブル スキャンを実行すると、Oracle (または MSSQL) は他のすべての列も読み取る必要がありますか? (または、それらをスキップするのに十分賢いですか?)。

1 列目ではなく 2 列目を検索するとどうなりますか? 最初の列を読む必要がありますか? 1 番目の列が 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 に答える