> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# optimize_* セッション設定

> optimize_* グループに含まれる ClickHouse のセッション設定。

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>型</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>デフォルト値</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          再起動せずに変更可能
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

これらの設定は [system.settings](/docs/ja/reference/system-tables/settings) で確認でき、[ソースコード](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp) から自動生成されています。

<div id="optimize_aggregators_of_group_by_keys">
  ## optimize\_aggregators\_of\_group\_by\_keys
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

SELECT 句の GROUP BY キーに対する min/max/any/anyLast 集約関数を削除します

<div id="optimize_append_index">
  ## optimize\_append\_index
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

索引条件を追加するには、[制約](/docs/ja/reference/statements/create/table#constraints)を使用します。デフォルトは `false` です。

設定可能な値:

* true, false

<div id="optimize_arithmetic_operations_in_aggregate_functions">
  ## optimize\_arithmetic\_operations\_in\_aggregate\_functions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

算術演算を集計関数の外に移動する

<div id="optimize_const_name_size">
  ## optimize\_const\_name\_size
</div>

<SettingsInfoBlock type="Int64" default_value="256" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "256"},{"label": "大きな定数はスカラーに置き換え、名前にはハッシュを使用します（サイズは名前の長さで推定されます）"}]}]} />

大きな定数はスカラーに置き換え、名前にはハッシュを使用します (サイズは名前の長さで推定されます) 。

設定可能な値:

* 正の整数 - 名前の最大長
* 0 — 常に置き換える
* 負の整数 - 置き換えない

<div id="optimize_count_from_files">
  ## optimize\_count\_from\_files
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

さまざまな入力フォーマットのファイルから行数をカウントする際の最適化を有効または無効にします。テーブル関数/エンジン `file`/`s3`/`url`/`hdfs`/`azureBlobStorage` に適用されます。

設定可能な値:

* 0 — 最適化は無効です。
* 1 — 最適化は有効です。

<div id="optimize_dictget_tuple_element">
  ## optimize\_dictget\_tuple\_element
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "tupleElement(dictGet(..., tuple_of_attrs, ...), N) を単一属性の dictGet 呼び出しに書き換えます。"}]}]} />

不要な Dictionary 属性の取得を避けるため、`tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` は `dictGet('dict', 'b', key)` に書き換えられます。位置指定アクセス (`.1`、`.2`、...) と名前付きアクセス (`.b`) に対応しており、デフォルト引数が定数 Tuple または定数のみからなる `tuple(...)` の場合は `dictGetOrDefault` にも適用されます。

<div id="optimize_distinct_in_order">
  ## optimize\_distinct\_in\_order
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

DISTINCT 内の一部のカラムがソート順のプレフィックスになっている場合、DISTINCT の最適化を有効にします。たとえば、MergeTree におけるソートキーのプレフィックスや、ORDER BY ステートメントのプレフィックスです。

<div id="optimize_distributed_group_by_sharding_key">
  ## optimize\_distributed\_group\_by\_sharding\_key
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

イニシエーターサーバーでのコストの高い集約を回避することで、`GROUP BY sharding_key` クエリを最適化します (これにより、イニシエーターサーバー上でそのクエリが使用するメモリ量も削減されます) 。

次の種類のクエリがサポートされています (およびそれらのすべての組み合わせ) :

* `SELECT DISTINCT [..., ]sharding_key[, ...] FROM dist`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...]`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY x`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x`

次の種類のクエリはサポートされていません (このうち一部は今後サポートされる可能性があります) :

* `SELECT ... GROUP BY sharding_key[, ...] WITH TOTALS`
* `SELECT ... GROUP BY sharding_key[, ...] WITH ROLLUP`
* `SELECT ... GROUP BY sharding_key[, ...] WITH CUBE`
* `SELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1`

設定可能な値:

* 0 — 無効。
* 1 — 有効。

関連項目:

* [distributed\_group\_by\_no\_merge](/docs/ja/reference/settings/session-settings/distributed#distributed_group_by_no_merge)
* [distributed\_push\_down\_limit](/docs/ja/reference/settings/session-settings/distributed#distributed_push_down_limit)
* [optimize\_skip\_unused\_shards](/docs/ja/reference/settings/session-settings/optimize-skip#optimize_skip_unused_shards)

<Note>
  現時点では `optimize_skip_unused_shards` が必要です。これは、将来的にこの設定がデフォルトで有効になる可能性がある一方で、データが Distributed テーブル経由で挿入され、すなわち sharding\_key に従って分散されている場合にのみ正しく動作するためです。
</Note>

<div id="optimize_dry_run_check_part">
  ## optimize\_dry\_run\_check\_part
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.2"},{"label": "1"},{"label": "新しい設定"}]}]} />

有効な場合、`OPTIMIZE ... DRY RUN` は `checkDataPart` を使って、マージ後の結果パートを検証します。チェックに失敗すると、例外がスローされます。

<div id="optimize_empty_string_comparisons">
  ## optimize\_empty\_string\_comparisons
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "新しい設定"}]}]} />

col = '' や '' = col のような式を empty(col) に、col != '' や '' != col を notEmpty(col) に変換します。
ただし、col が String または FixedString 型の場合に限ります。

<div id="optimize_extract_common_expressions">
  ## optimize\_extract\_common\_expressions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.1"},{"label": "1"},{"label": "論理積の論理和から共通式を抽出することで、WHERE、PREWHERE、ON、HAVING、QUALIFY の式を最適化します。"}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "論理積の論理和から共通式を抽出して WHERE、PREWHERE、ON、HAVING、QUALIFY の式を最適化する設定を導入しました。"}]}]} />

WHERE、PREWHERE、ON、HAVING、QUALIFY の式で、論理和から共通式を抽出できるようにします。`(A AND B) OR (A AND C)` のような論理式は `A AND (B OR C)` に書き換えられ、これにより次の最適化を活用しやすくなる場合があります。

* 単純なフィルタ式でのインデックス利用
* CROSS JOIN から INNER JOIN への最適化

<div id="optimize_functions_to_subcolumns">
  ## optimize\_functions\_to\_subcolumns
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.8"},{"label": "1"},{"label": "デフォルトで有効"}]}]} />

一部の関数をサブカラムの読み取りに置き換える最適化を有効または無効にします。これにより、読み取るデータ量を削減できます。

変換可能な関数は次のとおりです。

* [length](/docs/ja/reference/functions/regular-functions/array-functions#length) を [size0](/docs/ja/reference/data-types/array#array-size) サブカラムの読み取りに変換します。
* [empty](/docs/ja/reference/functions/regular-functions/array-functions#empty) を [size0](/docs/ja/reference/data-types/array#array-size) サブカラムの読み取りに変換します。
* [notEmpty](/docs/ja/reference/functions/regular-functions/array-functions#notEmpty) を [size0](/docs/ja/reference/data-types/array#array-size) サブカラムの読み取りに変換します。
* [isNull](/docs/ja/reference/functions/regular-functions/functions-for-nulls#isNull) を [null](/docs/ja/reference/data-types/nullable#finding-null) サブカラムの読み取りに変換します。
* [isNotNull](/docs/ja/reference/functions/regular-functions/functions-for-nulls#isNotNull) を [null](/docs/ja/reference/data-types/nullable#finding-null) サブカラムの読み取りに変換します。
* [count](/docs/ja/reference/functions/aggregate-functions/count) を [null](/docs/ja/reference/data-types/nullable#finding-null) サブカラムの読み取りに変換します。
* [mapKeys](/docs/ja/reference/functions/regular-functions/tuple-map-functions#mapKeys) を [keys](/docs/ja/reference/data-types/map#reading-subcolumns-of-map) サブカラムの読み取りに変換します。
* [mapValues](/docs/ja/reference/functions/regular-functions/tuple-map-functions#mapValues) を [values](/docs/ja/reference/data-types/map#reading-subcolumns-of-map) サブカラムの読み取りに変換します。

設定可能な値:

* 0 — 最適化は無効です。
* 1 — 最適化は有効です。

<div id="optimize_inverse_dictionary_lookup">
  ## optimize\_inverse\_dictionary\_lookup
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.12"},{"label": "1"},{"label": "新しい設定"}]}]} />

事前に計算した可能なキー値の集合に対して高速にルックアップすることで、Dictionary の逆引きに対する繰り返しのルックアップを回避します。

<div id="optimize_multiif_to_if">
  ## optimize\_multiif\_to\_if
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

'multiIf' の条件が 1 つだけの場合、'if' に置き換えます。

<div id="optimize_normalize_count_variants">
  ## optimize\_normalize\_count\_variants
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.3"},{"label": "1"},{"label": "意味上 count() と等価な集約関数は、既定で count() に書き換えられます"}]}]} />

意味上 count() と等価な集約関数を count() に書き換えます。

<div id="optimize_on_insert">
  ## optimize\_on\_insert
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.1"},{"label": "1"},{"label": "ユーザー体験向上のため、デフォルトで INSERT 時のデータ最適化を有効にします"}]}]} />

挿入前にデータ変換を有効または無効にします。これは、この block に対して (table engine に応じて) マージ が実行された場合と同様の処理です。

設定可能な値:

* 0 — 無効。
* 1 — 有効。

**例**

有効な場合と無効な場合の違い:

クエリ:

```sql theme={null}
SET optimize_on_insert = 1;

CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable;

INSERT INTO test1 SELECT number % 2 FROM numbers(5);

SELECT * FROM test1;

SET optimize_on_insert = 0;

CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable;

INSERT INTO test2 SELECT number % 2 FROM numbers(5);

SELECT * FROM test2;
```

結果:

```text theme={null}
┌─FirstTable─┐
│          0 │
│          1 │
└────────────┘

┌─SecondTable─┐
│           0 │
│           0 │
│           0 │
│           1 │
│           1 │
└─────────────┘
```

この設定は、[materialized view](/docs/ja/reference/statements/create/view#materialized-view) の動作にも影響する点に注意してください。

<div id="optimize_prewhere_after_pushdown">
  ## optimize\_prewhere\_after\_pushdown
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.6"},{"label": "0"},{"label": "後続の最適化（`JOIN` を介した述語プッシュダウンやプロジェクションの書き換え）によって `MergeTree` の読み取りステップの上に追加されたフィルターを、既存の PREWHERE チェーンにマージするための 2 回目の PREWHERE 昇格パスを有効にする新しい設定。"}]}]} />

後続のクエリプラン最適化によって `MergeTree` の読み取りステップの上に追加のフィルター
(たとえば `JOIN` を介した述語プッシュダウンやプロジェクションの書き換え) が
追加されることがあります。この設定を有効にすると、その後に 2 回目の `PREWHERE` 昇格パスを実行します。既存の
`PREWHERE` がすでにある場合、新しいフィルターは個別のフィルターステップとして残されず、
`AND` でそこにマージされます。

<div id="optimize_qbit_distance_function_reads">
  ## optimize\_qbit\_distance\_function\_reads
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "新しい設定"}]}]} />

`QBit` データ型に対する距離関数を、ストレージから計算に必要なカラムだけを読み込む等価な関数に置き換えます。

<div id="optimize_read_in_order">
  ## optimize\_read\_in\_order
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

[MergeTree](/docs/ja/reference/engines/table-engines/mergetree-family/mergetree) テーブルのデータ読み取り時に、[SELECT](/docs/ja/reference/statements/select/index) クエリでの [ORDER BY](/docs/ja/reference/statements/select/order-by#optimization-of-data-reading) 最適化を有効にします。

設定可能な値:

* 0 — `ORDER BY` 最適化は無効です。
* 1 — `ORDER BY` 最適化は有効です。

**関連項目**

* [ORDER BY 句](/docs/ja/reference/statements/select/order-by#optimization-of-data-reading)

<div id="optimize_respect_aliases">
  ## optimize\_respect\_aliases
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

true に設定すると、WHERE/GROUP BY/ORDER BY で別名が考慮されるようになり、パーティションプルーニング、セカンダリ索引、optimize\_aggregation\_in\_order、optimize\_read\_in\_order、optimize\_trivial\_count に役立ちます

<div id="optimize_sorting_by_input_stream_properties">
  ## optimize\_sorting\_by\_input\_stream\_properties
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

入力ストリームのソート特性に基づいてソートを最適化します

<div id="optimize_substitute_columns">
  ## optimize\_substitute\_columns
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

カラムの置換には[制約](/docs/ja/reference/statements/create/table#constraints)を使用します。既定値は`false`です。

設定可能な値:

* true, false

<div id="optimize_syntax_fuse_functions">
  ## optimize\_syntax\_fuse\_functions
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.3"},{"label": "1"},{"label": "この最適化は本番環境に対応しています"}]}]} />

同一の引数を持つ集約関数を統合するかどうかを有効にします。[sum](/docs/ja/reference/functions/aggregate-functions/sum)、[count](/docs/ja/reference/functions/aggregate-functions/count)、または [avg](/docs/ja/reference/functions/aggregate-functions/avg) のうち、同一の引数を持つ集約関数が少なくとも 2 つ含まれるクエリを、[sumCount](/docs/ja/reference/functions/aggregate-functions/sumCount) を使用する形に書き換えます。

設定可能な値:

* 0 — 同一の引数を持つ関数は統合されません。
* 1 — 同一の引数を持つ関数は統合されます。

**例**

クエリ:

```sql theme={null}
CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log;
SET optimize_syntax_fuse_functions = 1;
EXPLAIN SYNTAX run_query_tree_passes = 1 SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSV;
```

結果:

```text theme={null}
SELECT
    sum(__table1.a) AS `sum(a)`,
    tupleElement(sumCount(__table1.b), 1) AS `sum(b)`,
    tupleElement(sumCount(__table1.b), 2) AS `count(b)`,
    divide(tupleElement(sumCount(__table1.b), 1), toFloat64(tupleElement(sumCount(__table1.b), 2))) AS `avg(b)`
FROM default.fuse_tbl AS __table1
```

<div id="optimize_throw_if_noop">
  ## optimize\_throw\_if\_noop
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

[OPTIMIZE](/docs/ja/reference/statements/optimize)クエリでマージが実行されなかった場合に、例外をスローするかどうかを有効または無効にします。

デフォルトでは、`OPTIMIZE` は何も実行しなかった場合でも成功として扱われます。この設定を使うと、こうした状況を区別し、その理由を例外メッセージで確認できます。

設定可能な値:

* 1 — 例外のスローが有効です。
* 0 — 例外のスローが無効です。

<div id="optimize_time_filter_with_preimage">
  ## optimize\_time\_filter\_with\_preimage
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.2"},{"label": "1"},{"label": "関数を、変換を伴わない等価な比較式に書き換えることで、Date および DateTime の述語を最適化します（例: toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31'）"}]}]} />

関数を、変換を伴わない等価な比較式に書き換えることで、Date および DateTime の述語を最適化します (例: `toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31'`)

<div id="optimize_truncate_order_by_after_group_by_keys">
  ## optimize\_truncate\_order\_by\_after\_group\_by\_keys
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.4"},{"label": "1"},{"label": "ORDER BY のプレフィックスですべての GROUP BY キーがカバーされている場合、末尾の ORDER BY 要素を削除します。"}]}]} />

ORDER BY のプレフィックスですべての GROUP BY キーがカバーされている場合、末尾の ORDER BY 要素を削除します。

<div id="optimize_uniq_to_count">
  ## optimize\_uniq\_to\_count
</div>

<SettingsInfoBlock type="Bool" default_value="1" />

サブクエリに DISTINCT または GROUP BY 句がある場合、uniq とその variants (uniqUpTo を除く) を count に書き換えます。

<div id="optimize_using_constraints">
  ## optimize\_using\_constraints
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

クエリ最適化のために[制約](/docs/ja/reference/statements/create/table#constraints)を使用します。デフォルトは`false`です。

設定可能な値:

* true, false
