redshift に 2 つのテーブルがあります。
- tbl_current_day - 約 450 万行
- tbl_previous_day - 約 450 万行、tbl_current_day とまったく同じデータ
それに加えて、次のように定義されたqry_both_daysというビューがあります。
CREATE OR REPLACE qry_both_days AS
SELECT * FROM tbl_current_day
UNION SELECT * FROM tbl_previous_day;
別のテーブルの 1 つでクエリを実行すると、期待どおりの非常に優れたパフォーマンスが得られます。たとえば、次のクエリは 5 秒間実行されます。
select count(distinct person_id) from tbl_current_day;
-- (person_id is of type int)
計画の説明:
XN Aggregate (cost=1224379.82..1224379.82 rows=1 width=4)
-> XN Subquery Scan volt_dt_0 (cost=1224373.80..1224378.61 rows=481 width=4)
-> XN HashAggregate (cost=1224373.80..1224373.80 rows=481 width=4)
-> XN Seq Scan on tbl_current_day (cost=0.00..979499.04 rows=97949904 width=4)
私の列はint型であるため、幅は想定どおり4バイトであることに注意してください。
ただし、qry_both_daysで同じクエリを実行すると、クエリの実行速度は 20 倍遅くなりますが、2 倍の行を超える必要があるため、実行速度は 2 倍しか遅くないと予想されます。
select count(distinct person_id) from qry_both_days;
計画の説明:
XN Aggregate (cost=55648338.34..55648338.34 rows=1 width=4)
-> XN Subquery Scan volt_dt_0 (cost=55648335.84..55648337.84 rows=200 width=4)
-> XN HashAggregate (cost=55648335.84..55648335.84 rows=200 width=4)
-> XN Subquery Scan qry_both_days (cost=0.00..54354188.49 rows=517658938 width=4)
-> XN Unique (cost=0.00..49177599.11 rows=517658938 width=190)
-> XN Append (cost=0.00..10353178.76 rows=517658938 width=190)
-> XN Subquery Scan "*SELECT* 1" (cost=0.00..89649.20 rows=4482460 width=190)
-> XN Seq Scan on tbl_current_day (cost=0.00..44824.60 rows=4482460 width=190)
-> XN Subquery Scan "*SELECT* 2" (cost=0.00..90675.00 rows=4533750 width=187)
-> XN Seq Scan on tbl_previous_day (cost=0.00..45337.50 rows=4533750 width=187)
問題:幅が本来の 4 バイトではなく 190 になりました!!! UNION SELECT で RedShift に関連する列のみを選択させる方法を知っている人はいますか?
ありがとう!