ClickHouse settings.

Per-query

SELECT ... SETTINGS max_threads = 16, max_memory_usage = 10000000000;

SET max_threads = 16;
SET max_memory_usage = 10000000000;

Profiles

/etc/clickhouse-server/users.xml:

<profiles>
  <default>
    <max_memory_usage>10000000000</max_memory_usage>
    <max_threads>0</max_threads>
    <readonly>0</readonly>
  </default>
  <readonly>
    <readonly>1</readonly>
  </readonly>
</profiles>

Common settings

max_threads                 # parallelism (0=auto)
max_memory_usage            # bytes per query
max_bytes_before_external_group_by
max_execution_time          # seconds
max_rows_to_read
max_result_rows
max_result_bytes
join_use_nulls
allow_experimental_*        # opt-in features

Quotas

<quotas>
  <default>
    <interval>
      <duration>3600</duration>
      <queries>10000</queries>
      <errors>100</errors>
      <result_rows>1000000</result_rows>
      <read_rows>100000000</read_rows>
      <execution_time>3600</execution_time>
    </interval>
  </default>
</quotas>

Users + permissions

<users>
  <readonly_user>
    <password_sha256_hex>...</password_sha256_hex>
    <profile>readonly</profile>
    <quota>default</quota>
    <networks><ip>::/0</ip></networks>
    <access_management>0</access_management>
  </readonly_user>
</users>

Resource isolation

  • Per-user memory cap.
  • Per-user thread cap.
  • Workload management (v23+).

Hot config reload

SYSTEM RELOAD CONFIG;

Common mistakes

  • Default max_memory_usage too low for big queries.
  • No quotas → one user breaks others.
  • Anonymous default user open.
  • Allow_experimental on prod.

Read this next

If you want my CH tuning config, it’s at rajpoot.dev .


Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .