WINDOWフレーム句のROWSとRANGEの違い
ウィンドウ関数の指定をROWでなくRANGEで指定するパターンを学んだ。 直前の日付のレコードがない場合は計算しない、などの使い方ができるから便利だ。
インターポレーション / interpolation
インターポレーション / interpolation
内挿の意。
少なくともterraformの記述においては、
- ${...}の中に与えられた式を評価し、
- 必要に応じてその結果を文字列に変換し、
- 最終的な文字列に挿入する補完処理
例
"Hello, ${var.name}!"
↓
"Hello, John!"
データ処理言語の使い分け
『前処理大全』を読んでいる。
SQL・R・Pythonの特徴を活かした使い分け
前処理のフェーズの向き・不向き
処理による言語の向き・不向き
- データサイズが大きいデータから抽出処理をするときはSQL
- R/Pythonではメモリ上に展開できるデータサイズしか通常扱うことができない
- データを縦持ちから横持ちに変換するときはR/Python
- 前処理をシステム化するならSQLやPython
- システム化環境が充実しており、他システムとの連携も容易
- 実行結果を記録しつつ分析作業を進めるアドホック分析の実現はR/Python
- 容易なのはRだが、PythonもJupyterNotebookを用いれば実現可能
弊社の環境ではSQL in BigQuery + Pythonで、Rはほぼ使わない。 アドホック分析はBQのログを溜めていくか、Pythonでやるしかない。 そうか、縦横変換はPythonなら楽なのか...
BigQueryのコスト削減メモ
見つけたので読む。
- BigQueryにおける
limit
句は、メインのクエリ実行後に適用され、スキャン時間・コストを削減するためには使えない - スキャン時間・スキャンコストを削減するためには、
join
かwhere
句を使う - テーブルの上位100けんならプレビューで見れる
UIのクエリ画面で、Ctrl押しながらテーブル名をクリックすると。スキーマ/詳細/プレビュー が見れる
exists
句ではselect *
を使ってもよい- 以下の場合、select *でもselect 1でもスキャン量、実行時間は同じ。
select s.name from blog_perf.stations as s where exists ( select 1 --"select *" ではなく from blog_perf.rides as r where s.id = r.start_station_id )
- SQL文の途中で
order by
が発生すると、分散ノードからデータをマージした上でソートし、戻さなければならないので、パフォーマンスに影響する。 ソートする場合は最後に行う
常に大きなテーブルから始め、
where
句で可能な限りフィルタリングしてから(できれば小さい)テーブルにジョインする
クエリ①
select s.name, s.install_date, count(*) as ride_count from blog_perf.rides r inner join blog_perf.stations s on s.id = r.start_station_id where s.name like ‘%Park%’ group by 1,2
クエリ②
select s.name, s.install_date, count(*) as ride_count from blog_perf.rides r inner join blog_perf.stations s on s.id = r.start_station_id where r.start_station_name like ‘%Park%’ group by 1,2
BigQueryのクエリパフォーマンス最適化を学ぶ①
ベストプラクティスを学ぶシリーズ、どんどん続けていくぞ。
クエリパフォーマンスの概要
クエリパフォーマンスに影響する要素
- 入力データとデータソース(I/O): クエリで何バイト読み取るか。
- ノード間の通信(シャッフル): クエリから次の段階に何バイト転送するか。クエリは各スロットに何バイトずつ渡すか。
- コンピューティング: クエリにはどのくらいの CPU 作業が必要か。
- 出力(実体化): クエリは何バイト書き込むか。
- クエリのアンチパターン: クエリは SQL のベスト プラクティスに従っているか。
チェック方法
- クエリごとに生成されるクエリプランで、実行の統計情報を確認できる
- 詳細→クエリプランとタイムライン
クエリプランとタイムライン
- BigQuery のクエリジョブには、診断で使用できるクエリプランとタイミング情報が埋め込まれる
- 長期実行されるクエリの場合は定期的に更新される
実行リソースを使用しないクエリジョブ(ドライランやキャッシュ利用)の場合は、他の統計情報が提供されるか、何もないかのいずれか
クエリアーキテクチャは動的である
- クエリ実行中にクエリプランが変更される可能性がある
- クエリ実行中に追加されるステージは、ワーカー全体にわたるデータ分散を向上させる
- 変更されたクエリプランでは、ステージに”パーティション再設定ステージ”とラベルがつく
クエリ全体の進行状況を把握する際、実行のタイムラインを確認する
- ワーカー内で完了・保留中_アクティブな作業単位の数が確認できる
- クエリの複数ステージにアクティブワーカーが複数存在する場合がある
用語説明
- 実行グラフ
クエリステージ
- 実行グラフを分割したもの
- 実行ステップで構成される
- 多くのワーカーを同時に実行できる作業単位をモデル化
- 高速の分散シャッフルアーキテクチャを介して相互通信
- In-memory query execution in Google BigQuery
クエリプランの用語
- 作業単位
- ワーカー
- スロット
- コンピューティング、メモリ、I/O リソースなど、クエリの実行に必要な複数のファセットを抽象的に表す
- ジョブ統計の概要では、この抽象的な単位に基づき、個々のクエリの
totalSlotMs
を表示