-1

私の試みは、顧客と注文のテーブルを結合し、品目と注文のテーブルを結合することでした。c_mktsegment フィールドにもインデックスを付けました。私の結果のクエリはこれです。それを改善するために私にできることはありますか?

select
    o_shippriority,
    l_orderkey,
    o_orderdate,
    sum(l_extendedprice * (1 - l_discount)) as revenue
from
    cust As c
    join ord As o on c.c_custkey = o.o_custkey
    join line As l on o.o_orderkey = l.l_orderkey
where
    c_mktsegment = ':1'
    and o_orderdate < date ':2'
    and l_shipdate > date ':2'
group by
    l_orderkey,
    o_orderdate,
    o_shippriority
order by
    revenue desc,
    o_orderdate;
4

1 に答える 1

2

このクエリには明らかに問題はありません。良好なパフォーマンスを得るには、orders.o_custkeyとlineitem.l_orderkeyにインデックスを付ける必要があります。c_mktsegmentのインデックスを使用すると、DBは顧客レコードをすばやく見つけることができますが、そこから注文レコードとラインアイテムレコードを見つけることができる必要があります。

Explainを実行して、dbがクエリをどのように処理しているかを確認する必要があります。これは、各テーブルのレコード数やキーの分布など、多くの要因に依存するため、クエリを見ただけでは計画が何であるかはわかりません。ただし、Explainを実行して、テーブルのフルファイル読み取りを実行していることがわかった場合は、それを防ぐためにインデックスを追加する必要があります。これは、クエリ最適化のほぼルール1です。

于 2012-05-04T14:49:00.887 に答える