(Presto)AWSSQLPrestoAthena動機Athenaを扱うスクリプトを書いていたときに、クエリキャンセル時のテストを行う必要がありました。Athenaは検索が早いため、処理に時間かかるクエリを実データに対して投げると、それなりにデータスキャンが行われ、それなりに課金が発生する可能性があります。任意の長さの時間がかかりそうな処理を書けるようになろうと考えました。ついでに自分の理解度や表現力でどのような処理ができるか試すため、プログラミングの定番の素数列挙をテーマにしました。_(num)),sequence関数を使って連番の配列を生成します。生成した配列をUNNEST句を使って展開し、numカラムに格納したテーブルのように扱います。_(lower_num)),seqテーブルで生成した数字に対して、それより小さい値を全て組み合わせたテーブルを作ります。UNNEST句はJOINとセットで使うことで、行ごとの値を参照した配列を作ることができます。JOINされることになります。1となる(num,lower_num)の全組について、numがlower_numで割り切れる行の数をnumごとに集計します。ASC)cntテーブルから素数を抽出します。2になっているはずです。prime235これで列挙完了です。WITHの使いどころこの例のようにWITHを使って数珠繋ぎに処理を進めていくことで、行数やメモリ消費と引き換えに複数の処理をシンプルに保つことができます。計算量の改善n以下の素数を列挙するとき、lower_setテーブルにて(num,lower_num)の組がnum^2通りあるのでO(n^2)の計算量になってしまいます。lower_numとなる割り切れる組が存在するので、この対称性を利用してクエリを一部見直すことでO(n^(3/2))に減らせます。ASC)素数列挙の計算量はもう少し少なくできるはずですが、現状良い実装が思いつかなかったので、これより少ない計算量の実装が出来た人がいればお知らせください。時間計測O(n^(3/2))の方のクエリを使って、nまでの素数を列挙する処理時間を計測しました。66少しRUNNINGにさせる目的ならnを6桁前半くらいにするのが良さそうです。意外にも列挙できることがわかった。注意もし素数列を使用する場合は、ソートされているとは限らないので必要があればソートしましょう。upLoginユーザーは見つかりませんでした。