2

私はAmazon Redshiftに約6億行のテーブルを持っています。私は、sqlalchemy_redshift接続を介して次のクエリを発行するPythonプロセスがあります:Amazon Redshiftが並行アップデートをシリアル化するのはなぜですか?

begin; 
UPDATE dogs 
SET computed_dog_type = f_get_dog_type(name, breed, age, color) 
WHERE week = :week; 
commit; 

このクエリは正常に動作します。ただし、一度に6億行以上実行するには遅すぎます。 where句は、1週間分の行が2Kから2〜3百万の範囲にある週によって効果的に制限します。

私は実行は次のようになりますPythonのスレッドでクエリコードをラップ:

16:38 $ python dog_classifier.py update_range 2009-10-05 2009-10-26 
11-02 16:39 PTC   INFO  DOG CLASSIFIER STARTED 
11-02 16:39 PTC   INFO  START update of dogs.computed_dog_type for week: 2009-10-05 
11-02 16:39 PTC   INFO  START update of dogs.computed_dog_type for week: 2009-10-12 
11-02 16:39 PTC   INFO  START update of dogs.computed_dog_type for week: 2009-10-19 
11-02 16:39 PTC   INFO  START update of dogs.computed_dog_type for week: 2009-10-26 
11-02 16:45 PTC   INFO  END update of 338378 records in dogs.computed_dog_type for week: 2009-10-12 in 6 minutes 
11-02 16:52 PTC   INFO  END update of 355796 records in dogs.computed_dog_type for week: 2009-10-05 in 13 minutes 
11-02 16:59 PTC   INFO  END update of 337909 records in dogs.computed_dog_type for week: 2009-10-19 in 20 minutes 
11-02 17:07 PTC   INFO  END update of 281617 records in dogs.computed_dog_type for week: 2009-10-26 in 28 minutes 
11-02 17:07 PTC   INFO  DOG CLASSIFIER STOPPED AFTER UPDATING 1313700 RECORDS 
私は一度月実行しているよ

- 一般的に、万行程度であること、データの4-5週間とか、ぐらい。

赤いシフトでクエリがシリアル化されているかのように見えます。これらのクエリが実行されている間にクラウドウォッチダッシュボードからの出力を調べると、ピークと谷は更新クエリに非常に明確に結びついています。

cloudwatch dashboard

私は、デフォルトのクエリキューはおそらく犯人であると考えられますが、実行時にその振る舞いを調べることは困難なようです。

これをどのようにデバッグできますか?何がこのようにシリアル化する原因になるのでしょうか?

答えて

2

ユーザー定義関数(UDF)がスローダウン処理を行っている可能性があります。 UDF Constraint documentationは言う:

をクラスタごとに並行して実行できるのUDFの数は、クラスタの合計同時実行レベルの1/4に制限されます。たとえば、クラスターが並行性15で構成されている場合、最大3つのUDFを並行して実行できます。制限に達すると、UDFはワークロード管理キュー内での実行のためにキューされたになります。

さらに、UDFでIMMUTABLE return typeが使用されている場合、RedshiftはUDFの戻り値をキャッシュすることができます。

によってルックアップテーブルを作成し、すべての値を入力してそのテーブルに参加すると、Redshiftはクエリを最適化できます。このような表は、すべてのノードに表を配布するためにDISTKEY ALLに設定する必要があります。

関連する問題