> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# query_cache_* session settings

> ClickHouse session settings in the query_cache_* generated group.

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["Version", "Default value", "Comment"];
  const border = "1px solid rgba(128, 128, 128, 0.3)";
  const cell = {
    border,
    padding: "0.25rem 0.5rem",
    textAlign: "start",
    verticalAlign: "top"
  };
  return <details className="not-prose" style={{
    border,
    borderRadius: "0.5rem",
    margin: "0.5rem 0",
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <summary style={{
    cursor: "pointer",
    fontWeight: 600,
    opacity: 0.72
  }}>
        Version history
      </summary>
      <table style={{
    borderCollapse: "collapse",
    width: "100%",
    margin: "0.5rem 0 0"
  }}>
        <thead>
          <tr>
            {headers.map(header => <th key={header} style={{
    ...cell,
    fontWeight: 600,
    opacity: 0.72
  }}>
                {header}
              </th>)}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, row_index) => <tr key={row.id ?? row_index}>
              {(row.items ?? []).map((item, item_index) => <td key={item_index} style={{
    ...cell,
    overflowWrap: "anywhere"
  }}>
                  {item?.label}
                </td>)}
            </tr>)}
        </tbody>
      </table>
    </details>;
};

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
  }}>Type</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Default</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Changeable without restart
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

These settings are available in [system.settings](/reference/system-tables/settings) and are autogenerated from [source](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp).

<h2 id="query_cache_compress_entries">
  query\_cache\_compress\_entries
</h2>

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

Compress entries in the [query cache](/concepts/features/performance/caches/query-cache). Lessens the memory consumption of the query cache at the cost of slower inserts into / reads from it.

Possible values:

* 0 - Disabled
* 1 - Enabled

<h2 id="query_cache_for_subqueries">
  query\_cache\_for\_subqueries
</h2>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "0"},{"label": "New setting to enable propagation of `use_query_cache` into all subqueries. Without it, subqueries are only cached on explicit per-subquery `SETTINGS use_query_cache = true` opt-in."}]}]} />

If turned on, subquery results may be written to and read from the [query cache](/concepts/features/performance/caches/query-cache). This enables propagation of `use_query_cache` into all subqueries.

Possible values:

* 0 - Disabled
* 1 - Enabled

<h2 id="query_cache_max_entries">
  query\_cache\_max\_entries
</h2>

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

The maximum number of query results the current user may store in the [query cache](/concepts/features/performance/caches/query-cache). 0 means unlimited.

Possible values:

* Positive integer >= 0.

<h2 id="query_cache_max_size_in_bytes">
  query\_cache\_max\_size\_in\_bytes
</h2>

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

The maximum amount of memory (in bytes) the current user may allocate in the [query cache](/concepts/features/performance/caches/query-cache). 0 means unlimited.

Possible values:

* Positive integer >= 0.

<h2 id="query_cache_min_query_duration">
  query\_cache\_min\_query\_duration
</h2>

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

Minimum duration in milliseconds a query needs to run for its result to be stored in the [query cache](/concepts/features/performance/caches/query-cache).

Possible values:

* Positive integer >= 0.

<h2 id="query_cache_min_query_runs">
  query\_cache\_min\_query\_runs
</h2>

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

Minimum number of times a `SELECT` query must run before its result is stored in the [query cache](/concepts/features/performance/caches/query-cache).

Possible values:

* Positive integer >= 0.

<h2 id="query_cache_nondeterministic_function_handling">
  query\_cache\_nondeterministic\_function\_handling
</h2>

<SettingsInfoBlock type="QueryResultCacheNondeterministicFunctionHandling" default_value="throw" />

Controls how the [query cache](/concepts/features/performance/caches/query-cache) handles `SELECT` queries with non-deterministic functions like `rand()` or `now()`.

Possible values:

* `'throw'` - Throw an exception and don't cache the query result.
* `'save'` - Cache the query result.
* `'ignore'` - Don't cache the query result and don't throw an exception.

<h2 id="query_cache_share_between_users">
  query\_cache\_share\_between\_users
</h2>

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

If turned on, the result of `SELECT` queries cached in the [query cache](/concepts/features/performance/caches/query-cache) can be read by other users.
It is not recommended to enable this setting due to security reasons.

Possible values:

* 0 - Disabled
* 1 - Enabled

<h2 id="query_cache_squash_partial_results">
  query\_cache\_squash\_partial\_results
</h2>

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

Squash partial result blocks to blocks of size [max\_block\_size](/reference/settings/session-settings/max#max_block_size). Reduces performance of inserts into the [query cache](/concepts/features/performance/caches/query-cache) but improves the compressability of cache entries (see [query\_cache\_compress-entries](/reference/settings/session-settings/query-cache#query_cache_compress_entries)).

Possible values:

* 0 - Disabled
* 1 - Enabled

<h2 id="query_cache_system_table_handling">
  query\_cache\_system\_table\_handling
</h2>

<SettingsInfoBlock type="QueryResultCacheSystemTableHandling" default_value="throw" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.4"},{"label": "throw"},{"label": "The query cache no longer caches results of queries against system tables"}]}]} />

Controls how the [query cache](/concepts/features/performance/caches/query-cache) handles `SELECT` queries against system tables, i.e. tables in databases `system.*` and `information_schema.*`.

Possible values:

* `'throw'` - Throw an exception and don't cache the query result.
* `'save'` - Cache the query result.
* `'ignore'` - Don't cache the query result and don't throw an exception.

<h2 id="query_cache_tag">
  query\_cache\_tag
</h2>

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.8"},{"label": ""},{"label": "New setting for labeling query cache settings."}]}]} />

A string which acts as a label for [query cache](/concepts/features/performance/caches/query-cache) entries.
The same queries with different tags are considered different by the query cache.

Possible values:

* Any string

<h2 id="query_cache_ttl">
  query\_cache\_ttl
</h2>

<SettingsInfoBlock type="Seconds" default_value="60" />

After this time in seconds entries in the [query cache](/concepts/features/performance/caches/query-cache) become stale.

Possible values:

* Positive integer >= 0.

<h2 id="query_cache_use_only_when_data_was_not_changed">
  query\_cache\_use\_only\_when\_data\_was\_not\_changed
</h2>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "0"},{"label": "New setting to restrict query cache entries to cases when none of the referenced tables were changed since the entry was cached."}]}]} />

If turned on, a [query cache](/concepts/features/performance/caches/query-cache) entry is reused only if none of the tables referenced by the query were changed since the entry was cached. This makes the query cache consistent with respect to data changes, at the cost of recomputing the result whenever the underlying data changes (and of an extra check of the referenced tables on each lookup, which may be expensive for `Merge`, `Distributed` and `URL` tables). The referenced tables are examined once, at the start of the query, and the decision to reuse a cache entry is made against that snapshot; there is no second check just before the cached result is returned, so a write that commits after the query started can still be missed by that particular query, which observes the same data as if it had started slightly earlier. For `URL` and object-storage tables this check is based on the resource's strong `ETag` and is best-effort: a result could in rare cases be reused if the content is rewritten back to a byte-identical state during the read. `Merge` and `Distributed` are likewise best-effort if the set of their underlying tables changes during a query, and row policies that exist only on remote shard servers of a `Distributed` table are not seen by the check. The check covers a table's regular columns and data only; it does not cover query-visible virtual columns that expose placement or external metadata (for example `_disk_name`, `_tags` or `_headers`), so a query selecting such a column may reuse a cached result after only that column changed (e.g. a part moved between disks, or object tags or response headers changed).

If consistency cannot be guaranteed, the query cache is not used for the query. This happens when the query references a table that cannot tell whether its data changed (e.g. a table function such as `url`), when the query calls a non-deterministic function (whose result can change while every referenced table is unchanged), when the query runs inside a transaction (the check sees the live table state, not the transaction's snapshot), or when a referenced table has an active row policy for the current user (the policy can change what the user reads while every referenced table is unchanged).

Possible values:

* 0 - Disabled.
* 1 - Enabled.
