遅延評価
例: 遅延評価と即時評価
遅延評価の利点
- クエリ最適化: 複数の操作が、最適化された単一のSQLクエリにまとめられます
- フィルタのプッシュダウン: フィルタはデータソース側で適用されます
- カラムのプルーニング: 必要なカラムだけが読み込まれます
- 決定の遅延: 実行エンジンは実行時に選択できます
- プランの確認: 実行前にクエリを確認したり、デバッグしたりできます
実行トリガー
自動トリガー
| トリガー | 例 | 説明 |
|---|---|---|
print() / repr() | print(ds) | 結果を表示 |
len() | len(ds) | 行数を取得 |
.columns | ds.columns | カラム名を取得 |
.dtypes | ds.dtypes | カラムの型を取得 |
.shape | ds.shape | 次元を取得 |
.index | ds.index | 行インデックスを取得 |
.values | ds.values | NumPy 配列を取得 |
| 反復処理 | for row in ds | 行を反復処理 |
to_df() | ds.to_df() | pandas DataFrame に変換 |
to_pandas() | ds.to_pandas() | to_df のエイリアス |
to_dict() | ds.to_dict() | dict に変換 |
to_numpy() | ds.to_numpy() | NumPy 配列に変換 |
.equals() | ds.equals(other) | DataStore 同士を比較 |
遅延評価のままの操作
| Operation | Returns | Description |
|---|---|---|
filter() | DataStore | WHERE 句を追加 |
select() | DataStore | カラム選択を追加 |
sort() | DataStore | ORDER BY を追加 |
groupby() | LazyGroupBy | GROUP BY を準備 |
join() | DataStore | JOIN を追加 |
ds['col'] | ColumnExpr | カラム参照 |
ds[['col1', 'col2']] | DataStore | カラム選択 |
3段階の実行モデル
フェーズ1: SQLクエリの構築 (遅延)
フェーズ 2: 実行時点
フェーズ 3: DataFrame の操作 (該当する場合)
実行計画の確認
explain() を使用します。
Query
Response
verbose=True を指定します:
キャッシュ
キャッシュの仕組み
cache の無効化
cacheの手動制御
SQL と Pandas の操作を組み合わせる
SQL互換の操作
filter(),where()select()groupby(),agg()sort(),orderby()limit(),offset()join(),union()distinct()- カラム操作 (算術演算、比較、文字列メソッド)
Pandas のみの操作
- カスタム関数を使った
apply() - 複雑な集計を伴う
pivot_table() stack()、unstack()- 実行済みの DataFrame に対する操作
ハイブリッドパイプライン
実行エンジンの選択
自動モード (既定)
chDB Engine を強制的に使用する
pandasエンジンを強制的に使用する
パフォーマンスへの影響
良い例: 早めにフィルタする
悪い例: フィルタを後回しにする
良い例:早い段階でカラムを絞り込む
良い例: SQLに処理を任せる
ベストプラクティスの概要
- 実行前に処理をまとめる - クエリ全体を組み立ててから、一度だけ実行をトリガーする
- 早い段階でフィルタする - ソース側でデータを絞り込む
- 必要なカラムだけを選択する - カラムのプルーニングによりパフォーマンスが向上する
explain()を使って実行内容を把握する - 実行前にデバッグする- 集計は SQL に任せる - ClickHouse はこの処理向けに最適化されている
- 実行のトリガーを意識する - 意図しない早期実行を避ける
- cacheは適切に使う - cacheが無効化されるタイミングを理解する