0

更新: Oracle データベース、すべてのフィールドにインデックスが作成されました。これは私の最初の投稿です。これを正しく尋ねていない場合はお詫び申し上げます。

私は3つのテーブルA、B、Cを持っています。2 つは非常に大きい (B、C)。B と C の基準に適合する A の結果のみが必要です。しかし、データベース (Oracle) は AB と AC をマージしようとしてしまい、クエリ全体の実行が予想よりもはるかに遅くなります。

実際の例:

  • A- 顧客: 名前、CustomerId
  • B- 注文: OrderId、CustomerId、OrderType
  • B- SupportTickets: TicketId、CustomerId、TicketType

上記のフィールドはすべて索引付けされています。

私のデータベースでは、顧客ごとに 1 つの OrderType に対して数千の注文があり、顧客ごとに各 TicketType に対して数千のサポート チケットがある場合があります。

  1. OrderType が「squirrelcatcher」で、TicketType が「ragingescapedsquirrel」であるすべての顧客を一覧表示したいと考えています。
  2. 顧客の一意のリストのみが必要であり、Orders または SupportTickets からの行を含める必要はありません。

私は簡単なステートメントを使用しています:

SELECT C.Name 
FROM 
 Customers C,
 JOIN Orders O ON O.CustomerId = C.CustomerId,
 JOIN SupportTickets S ON S.CustomerId = C.CustomerId
WHERE 
 O.OrderType='squirrelcatcher'
 AND S.TicketType='ragingescapedsquirrel'
GROUP BY 
 C.Name

クエリを実行すると、タイムアウトします。実行にそれほど時間がかかるとは思わない。すべてのテーブルまたは一致するすべてのレコードをリンクしようとしていると思います。しかし、それぞれに 1 つの一致を見つけて、次の顧客に進むだけでよいと思います。したがって、非常に高速に実行する必要があります。

パフォーマンスを改善するための提案はありますか?

4

1 に答える 1