0

実行に約4秒かかるため、誰かがこのクエリをより適切に最適化するのを手伝ってくれるかどうか疑問に思っています.

SELECT discount.*, retailer.name AS retailer_name, 
sub_category.type AS subcategory_type 
FROM discount 
  JOIN retailer ON retailer.id = discount.retailer 
  JOIN sub_category ON sub_category.id = discount.sub_category 
WHERE discount.start_date <= 1348133607 
AND retailer.closed = 0  
AND ( discount.only_for = 'PROC' OR discount.only_for = '' ) 
ORDER BY discount.updated_on DESC LIMIT 25

私はインデックスを持っています:

  • 割引小売業者
  • 割引.sub_category
  • 割引.開始日
  • 小売業者.閉鎖
  • discount.only_for
4

2 に答える 2

0

3つのインデックスが必要です。

CREATE INDEX discount_ndx ON discount (only_for, start_date, retailer, sub_category);
CREATE INDEX retailer_ndx ON retailer (id, closed, name);
CREATE INDEX sub_category_ndx ON sub_category(id, type);

最初のインデックスでは、とWHEREに基づいてすぐに一致させることができます(インデックス内のこれらの2つのキーを反転してみることができます。データの分散によって異なります。これを決定するには、の出力が必要です)。この値により、データをまったく取得せずにを完了することができます。only_fordateEXPLAINretailerJOINdiscount

テーブルからretailer必要なのはid(直接結合)とclosed;WHEREだけです。nameインデックスに保存することも価値があるかもしれません。最後に、subcategoryテーブルは、のみを提供します。したがって、とをほとんど含まない非常に薄いテーブルでない限りtype、その上にインデックスを付けることは理にかなっています。 subcategoryidtype

それがどのように機能するか教えてください。

于 2012-09-20T10:03:11.667 に答える
0

かつて私は問題を抱えていました。みたいな問い合わせがありましたselect * from ViewName v where v.column1 = 'ABCD'

「ABCD」は文字でした。説明計画では、Oracle が私のスクリプトに FAST FULL SCAN INDEX を配置していることを確認しましたが、これはインデックスとして不十分です (コストは 105 でした)。

次に、同じ値を返す関数を書き、次のように置き換えましたselect * from ViewName v where v.column1 = FUNCTIONX

興味深いことに、Oracle は FULL SCAN INDEX (コストは 32) を使用し、私の実行時間は著しく改善されました。

最適化は苦手ですが、参考になるかなと思いました

于 2012-09-20T10:33:40.340 に答える