1

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 に関連する列のみを選択させる方法を知っている人はいますか?

ありがとう!

4

2 に答える 2

5

UNION単独で使用すると、重複する行が削除されます。たとえば、DISTINCTSQL 仕様に従って暗黙の を使用します。

これは、出力を準備するためにさらに多くの処理が必要であることを意味します。

結果が必要ない場合DISTINCTは、常に を使用UNION ALLして、データベースが重複の可能性をチェックしていないことを確認する必要があります。

于 2015-04-01T14:40:32.537 に答える
1

ビューは として作成されるSELECT *ため、常にすべての列を照会してビューのデータを作成します。次に、別のSELECT列が使用され、ビューから要求された列のみが返されます。

選択した列の数が限られている場合 (常に使用される 2 つ、3 つのセットなど)、列セットごとに個別のビューを作成します。

もう 1 つの方法 (以前よりもさらに洗練されていません) は、各ビューを呼び出して、その名前にどの列が含まれているかを示すようにすることです (並べ替えられ、'__' で区切られているとしましょう) qry_both_days__age__name__person_id。次に、各クエリの前に、必要なビューが存在するかどうかを確認し、存在しない場合は作成します。

于 2013-11-20T08:58:04.363 に答える