FROM句
FROM句は、データを読み取るためのソースを指定します:
FROM句の機能を拡張するために、JOIN および ARRAY JOIN句も使用できます。
サブクエリは、FROM句内で括弧で囲まれた別のSELECTクエリです。
FROMには複数のデータソースを含めることができ、カンマで区切られます。これはそれらに対するCROSS JOINを実行することと同等です。
FROMは、SELECT句の前にオプションで表示することができます。これは標準SQLのClickHouse特有の拡張であり、SELECT文を読みやすくします。例:
FROM table
SELECT *
FINAL修飾子
FINALが指定されると、ClickHouseは結果を返す前にデータを完全にマージします。これにより、特定のテーブルエンジンのマージ中に起こるすべてのデータ変換も実行されます。
以下のテーブルエンジンを使用しているテーブルからデータを選択する場合に適用されます:
ReplacingMergeTreeSummingMergeTreeAggregatingMergeTreeCollapsingMergeTreeVersionedCollapsingMergeTree
FINAL付きのSELECTクエリは並列に実行されます。max_final_threads設定は使用するスレッド数を制限します。
欠点
FINALを使用するクエリは、FINALを使用しない類似のクエリよりも若干遅く実行されます。理由は以下の通りです:
- クエリ実行中にデータがマージされる。
FINAL付きのクエリは、クエリで指定したカラムに加えて主キーのカラムを読み取る場合があります。
FINALは通常マージ時に行われる処理をクエリの実行時にメモリ内で行うため、追加の計算リソースとメモリリソースを要求します。しかし、(データがまだ完全にマージされていない可能性があるため)正確な結果を得るためにFINALを使用することが時々必要です。それはマージを強制するOPTIMIZEを実行するよりもコストが低いです。
FINALを使用する代わりに、MergeTreeエンジンのバックグラウンドプロセスがまだ発生していないと仮定し、集計を適用して(例えば、重複を破棄するなど)それに対処する異なるクエリを使用することが時々可能です。クエリで必要な結果を得るためにFINALを使用する必要がある場合、それを行うことは問題ありませんが、追加の処理が必要であることに注意してください。
すべてのテーブルにクエリを自動的に適用するために、セッションまたはユーザープロファイルでFINAL設定を使用してFINALを適用することができます。
使用例
FINALキーワードを使用する場合
SELECT x, y FROM mytable FINAL WHERE x > 1;
クエリレベルでFINALを設定として使用する場合
SELECT x, y FROM mytable WHERE x > 1 SETTINGS final = 1;
セッションレベルでFINALを設定として使用する場合
SET final = 1;
SELECT x, y FROM mytable WHERE x > 1;
実装の詳細
FROM句が省略された場合、system.oneテーブルからデータが読み取られます。
system.oneテーブルは正確に1行を含んでいます (このテーブルは他のDBMSsで見られるDUALテーブルと同じ目的を果たします)。
クエリを実行するために、クエリにリストされたすべてのカラムが適切なテーブルから抽出されます。外部クエリに必要のないカラムはサブクエリから捨てられます。
クエリにカラムがリストされていない場合 (SELECT count() FROM tなど)、いずれかのカラムがテーブルから抽出されます (できるだけ小さいものが好まれます)、行数を計算するためです。