2011-10-25 3 views
0

私はインデックスに関して質問がありますこのクエリでインデックスを使用する必要がありますか?

なぜ私はこのテーブルに問い合わせるだけでなく、予約テーブルに参加しているので、顧客テーブルでCIDのインデックスを使用しています。

スキーマ予約テーブル

Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
BID          NOT NULL NUMBER(16) 
CID            NUMBER(16) 
FNO            NUMBER(16) 
OID            NUMBER(16) 
SEAT            NUMBER(6) 
SEAT_PRICE           NUMBER(6) 
FLIGHT_DATE          DATE 

顧客

CID          NOT NULL NUMBER(16) 
FIRSTNAME         NOT NULL VARCHAR2(10) 
LASTNAME         NOT NULL VARCHAR2(10) 
STREET         NOT NULL VARCHAR2(20) 
TOWN          NOT NULL VARCHAR2(10) 

クエリ

SELECT bo.bid, cu.cid 
FROM ass2master_booking bo, ass2master_customer cu 
WHERE bo.cid = cu.cid and rownum < 135000; 

私の質問です:それは本当に私はインデックスtを追加するかどうかを任意の違いを作るんクエリを参照してCID?

私はそれが結合され、選択されているので追加しました。

私は(インデックスなし)非構造化データと、このクエリをテストし、CPUの大幅な減少決してありませんが、トレースファイル内のディスクの列がインデックスの337で、1800 337 1800からドロップ

非構造化ディスクでした

インデックスでは、顧客テーブルで高速フルスキャンを実行しています。

+2

すみません...私は抵抗できません.. .Ass2Master? AssMasterはどこですか?ああ、略語が間違ってしまった! –

+1

暗黙の構文を使用するのは、SQLの反パターンです。 – HLGEM

答えて

2

パフォーマンスが向上すれば答えは「はい」です。

インデックスを追加するだけではインデックスを追加しないでください。テストするのは簡単です。索引付けされた問合せは高速か、そうではありません。インデックスは、挿入中にテーブルの速度を落とすことを忘れないでください。したがって、特定のデータとパフォーマンスのニーズを検討する必要があります。

1

1)あなたが説明したCUSTOMERテーブルのCIDの列が表示されません。少し混乱します。クエリがFNO列を参照することを意図していたか、おそらくコマンドの出力から偶然切断したCID列があります。

2)テーブルには何行ありますか?任意の135,000行をフェッチしていて意味のある述語がないため、Oracleは表をスキャンするのではなく索引をスキャンできるので、索引がカバリング索引以外の場合に特に役立ちます。しかし、その利点は、SELECTリストに列を追加する必要がある場合に消えます。

3)あなたがそれを投稿したときに質問が出された場合、あなたがCUSTOMERテーブルに参加している理由はわかりません。 BOOKINGにはBIDCIDの両方が含まれているため、この結合は有益なことをしているようには見えません。おそらくテーブルに参加して、SELECTリストに列を追加できるようにすることが考えられます。ただし、そうである場合は、カバーするインデックスの利点が失われる可能性があります(もちろん、インデックスに追加の列を追加しない限り)

+0

ちょっとちょっと私は顧客テーブルを更新しました。私は間違ったテーブルを提供していた – paktrick

関連する問題