1

次のような質問があります

select *
from
( select id,sum(amt) amt from table_t group by id
) t inner join table_v v on (v.id = t.id)
order by t.amt desc;

table_tにはインデックスがなく、738,000行あり、table_vにはidにインデックスがあり、158,000行あります。

クエリは現在、10秒で結果をフェッチします。

Explainクエリプランは全表スキャンを示しています。ここでパフォーマンスを向上させるにはどうすればよいですか?

table_tのidにインデックスを追加すると、役に立ちます。サブクエリで使用しているので?

4

1 に答える 1

2

インデックスがある場合(id,amt)は、group by / summationプロセスでの作業を最小限に抑えることができます(インデックスを読み取ることができるため)。両方の列がnull許容の場合は、「where id is not null」を追加して、インデックスを使用する必要がある場合があります。[これは、後の結合によって暗示されますidが、オプティマイザによって推測されない場合があります。]

次のステップは、おそらくインデックスをオンにして、合計にマテリアライズドビューを使用することです(amt,id)(ソートを回避するために使用できます)。ただし、コミット時、要求時、またはスケジュールされた間隔で更新されます。トランザクションの一部としてこのクエリを実行する必要がある場合は役に立ちません。

インデックスとマテリアライズドビューの両方で、テーブルの挿入/更新/削除に作業が追加されますが、このクエリでは作業が保存されます。

于 2011-08-17T23:44:45.020 に答える