6

次の 3 つのクエリを検討してください。

select sampleno from sample
    where markupdate > '1/1/2010'

select sampleno, markupdate from sample
    where markupdate > '1/1/2010'

select sampleno, markuptime from sample
    where markupdate > '1/1/2010'

samplenoおよびmarkupdateインデックス付きフィールド (samplenoは主キー)

markuptimeインデックスされていません

クエリ 1 と 2 の実行には約 1 秒かかります (237K 行を返します)。クエリ 3 は 3 分後も実行中です。

インデックスのないフィールドを SELECT 句に含めると、なぜパフォーマンスが低下するのでしょうか?

これは SQL 6.5 データベースです。

4

1 に答える 1

5

テーブルのデータ (基本的にはすべての列) はクラスター化インデックスに格納されます。クラスター化インデックスは、インデックス付きの列でのバイナリ検索を可能にするバイナリ ツリーです。これは、リーフ レベルで他のすべての列を含むという点で特別な (クラスター化された) ものです。通常、クラスター化インデックスは主キーでもあります。あなたの場合、それは次のとおりです。

(sampleno) include (markupdate, markuptime, ...)

非クラスター化インデックスには、インデックス付きの列と (リーフ レベルの) クラスター化インデックスが含まれます。非クラスター化インデックスを使用する場合、データベースはクラスター化インデックス内の他のすべての列を検索する必要があります。そのプロセスは、ルックアップと呼ばれます。あなたの場合、非クラスター化インデックス(markupdate)は次のとおりです。

(markupdate) include (sampleno)

このインデックスには、 に対するクエリのすべてのデータが含まれますmarkupdate, sampleno。このような指数の専門用語はカバリング指数です。ただし、クエリに追加markuptimeすると、インデックスはカバーされなくなります。markuptimeクラスター化インデックスで値を検索する必要があります。そしてルックアップは広大です。

ルックアップが必要なのは 3 番目のクエリだけです。そのため、3 番目のクエリは遅くなります。

于 2013-02-08T16:59:23.307 に答える