2017-08-11 12 views
1

したがって、私は非常に大きなテーブル(日付分割)を持っています(例えば、table1)。複数列の索引があります(shop_id、g_id、check_date)。集計関数とグループを使用するクエリを書き換える方法

そして、私はクエリを実行しようとしています:

SELECT shop_id, g_id, max(check_date) 
FROM table1 
GROUP BY shop_id, g_id; 

実行が本当に遅いです - 配列をスキャン。 どのようにインデックスを使用できるように、クエリを最適化/書き換えますか。 一意のG_IDを含むテーブルと、一意のSHOP_IDを持つ別のテーブルもあります。

+0

あなたは秒off'とインデックススキャン野生がbenefitial可能かどうかを確認するためにenable_secscan 'で、一時的にスキャンをオフに切り替えることができます。

SELECT t.shop_id, t.g_id, t.check_date FROM ( SELECT shop_id, g_id, check_date, DENSE_RANK() OVER (PARTITION BY shop_id, g_id ORDER BY check_date DESC) dr FROM table1 ) t WHERE t.dr = 1; 

パーティション全体をカバーするために、両方のshop_idg_id列にインデックスを追加します。もしそうなら少なくともテーブルを再分析する –

+0

@ VaoTsun確かに、index_scanは動作するだろうが、クエリプランは依然としてawfull –

答えて

2

分析関数を使用してこのクエリを書き直すことができます。

CREATE INDEX your_idx ON table1 (shop_id, g_id); 
+0

それは本当に助けにはならない.Subquery on t(cost = 75752739.31..89811591.81 rows = 2008408 width = 16)。以前のクエリの場合クエリプラン HashAggregate(コスト= 14497422.24..14505112.79行= 769055幅= 16) –

+0

@AntonBondarパーティションに関連する列にインデックスを追加します。 –

関連する問題