2010-12-28 8 views
0

可能性の重複:
SQL — How is DISTINCT so fast without an index?SELECT DISTINCTはとても速いのですか?

こんにちは、

私はSQLiteの中で600万行と 'リンク' と呼ばれるテーブルを持つデータベースを持っています。データベースには、「src」列と「dest」列の2つの列があります。現在、指数はありません。

srcとdestの間にはかなりの数の共通の値がありますが、かなりの数の重複した行もあります。

私がやってみようとしている最初のことは、すべての重複行を削除してから、結果にいくつかの追加処理を実行することですが、私は奇妙な問題に遭遇しています。

まず、SELECT * FROMリンク先のsrc = 434923およびdest = 5010182です。これで1つの結果がかなり速く返され、残りの600m行でテーブルスキャンを実行していると仮定して実行するにはかなり長い時間がかかります。

ただし、SELECT DISTINCT * FROMリンクを実行すると、すぐに行が返されるようになります。質問は:これはどのように可能ですか?確かに各行に対して、その行はテーブル内の他のすべての行と比較されなければなりませんが、これはテーブル内の残りの行のテーブルスキャンを必要とします。SHOULDは時代がかかります!

なぜSELECT DISTINCTが標準SELECTよりもずっと速いのですか?

+2

なぜ同じ質問をもう一度、同じ名前の2つの異なる口座から質問していますか? –

+1

本当に正直なところ、私は分かりません。私は前に質問を投稿しようとしましたが、ここのサーバーからエラーがありました。 元の質問を見つけようとしましたが、私の口座に登録されていませんでした(それはまだありません)。それを検索して見つかりませんでした。間違いに対する謝罪 –

答えて

1

重複質問が重複した答えに値する:

、より正確には、1つのクエリが他よりも高速ではありません。より正確には、クエリが完了するまでに要する時間は、両方のクエリで同じにする必要があります。違いは、DISTINCTを使用した問合せでは返される行が増えているため、高速で行を受け取っているため、より高速に応答するようです。しかし、両方のフードの下で起こっていることは、同じテーブルスキャンです。個別照会には、戻されたものを保管し、重複をフィルターに掛けるデータ構造があります。したがって、実際には照会が完了するまで時間がかかるべきである(SHOULD)が、(行が返される)/時間は一致します。 (また、一部の視聴者は、結果の制限を追加して、結果の制限を超えて停止するため、別個のクエリをより速く実行できるようにすることができます)。

+0

重複の申し立て、正直な間違い(上記の私のコメントを参照してください)。あなたの助けをありがとう、非常に感謝します。 –

関連する問題