次のような約500万行のテーブルがあります。
Erp_in:
corr_id varchar(50) (almost Unique)
corr_type nvarchar(1) (4 distinct values)
interface varchar(20) (around 10 distinct values)
indate DateTime
3つの異なるインデックス(corr_id、interface、およびindate)を使用して、通常
は元のテーブルと結合したままにしておいた別のテーブルがあり、約100000行あります
Erp_In_failed:
corr_id
interface
error (clob)
input (clob)
インデックス付き (corr_id およびインターフェイス)
最適化したいクエリは次のようにシンプルです。
SELECT a.corr_id, a.interface, a.indate, b.error
FROM erp_in a left join erp_in_failed b on a.corr_id = b.corr_id and a.interface = b.interface
Order by a.indate desc;
order by を削除すると、クエリにそれほど時間はかかりませんが、データの並べ替えには約 3 分かかります。
クエリを最適化するにはどうすればよいですか? 私はパーティショニング/履歴テーブルへの古いデータの削除/おそらくシーケンスの主キーとそれによる順序の作成、またはあなたが念頭に置いている何かについて考えていました...
編集:
実行計画はフルテーブルスキャンを示しており、注文に時間がかかるのは結合ではありません。
このクエリでさえ永遠にかかります:
SELECT * FROM erp_in
ORDER BY indate;
ページングを使用してみましたが、それも機能せず、20 の結果が得られるまでに数分かかります。間違っているのでしょうか?
indate フィールドに WHERE 句を追加すると、インデックスが使用されますが、作成後 20 日未満の場合に限り、それ以外は引き続きフル テーブル スキャンを使用します。(40 日であっても、INDEX ヒントを追加すると、クエリの実行が速くなりましたが、それでも十分ではありません)。
好奇心のために、私は100万行の単純なテーブルを持っています.order byは数秒かかります.違いは何ですか? RAMでソートするには100万で十分ですか?
ありがとう、