2011-12-16 3 views
1

列は結合にのみ使用されると言います。 (つまり、私は列で注文するつもりはなく、列内の特定の値を個別に検索することもありません)...私が列を使用する唯一の方法は、別の表に結合することです。列が(ハッシュ)結合にのみ使用されている場合、インデックスに何か利点はありますか?

データベースがハッシュ結合をサポートしている場合(私の理解ではインデックスから利益を得られない)..インデックスの追加は完全に冗長ではないでしょうか? (そして無駄な)?

+2

データベースが(常に)このテーブルへの結合にハッシュ結合を使用することをどのように知っていますか? – tbone

+0

適切な統計情報...私はコストベースのオプティマイザが、はるかに高価なネストされたループ(インデックスなし)でハッシュ結合を選択するのに十分にスマートであると仮定します。 – vicsz

+0

OracleがSQLをどのように実行するか、計画の変更、データの変更、統計の変更などを保証する方法はありません。 – tbone

答えて

2

SQLサーバーでは、それでもKey Lookupを防ぎます。

索引付けされていないフィールドにJOINがある場合、サーバーはそのフィールドの値をクラスタード・インデックスから取得する必要があります。

NCインデックスのJOINの場合は、クラスタからすべてのデータページ(実際はテーブル全体)をロードせずに値を直接取得できます。

基本的に、ディスクからロードされたテーブル全体ではなく、非常に狭いインデックスに基づいて最初のステップがフィルタリングされるため、多くのIOを節約できます。

+0

あなたがどういう意味をしているのか分かりません...どちらの方法でも、ハッシュ結合は各テーブルを一度反復する必要があります。つまり、各結合句のハッシュ値を生成するためのテーブル生成されたハッシュテーブルまでの行。私は、クラスタ化されていないインデックス(普通の古いヒープテーブル)を使用すると、少し速くなると思っています(データはヒープテーブル内のスペースを少なくし、インデックスをクラスタリングします)。 – vicsz

+0

いいえ、**インデックス**を反復するのは、テーブルではありません。それはデータが少ない=少ないページ=より少ないIO =より速いです。 – JNK

+0

多分私は何かが不足している..しかし、私はすべて(100%の行)を反復している場合..インデックスを持つことからスピードゲインはどこですか? – vicsz