Saltar al contenido principal
El nuevo ajuste allow_asynchronous_read_from_io_pool_for_merge_tree permite que el número de hilos de lectura (stream) sea mayor que el número de hilos en el resto del pipeline de ejecución de la consulta. Normalmente, el ajuste max_threads controla el número de hilos de lectura en paralelo y de hilos de procesamiento de consultas en paralelo: Los datos se leen «en orden», columna a columna, desde el disco.

Lectura asíncrona de datos

La nueva configuración allow_asynchronous_read_from_io_pool_for_merge_tree permite que el número de hilos de lectura (streams) sea mayor que el número de hilos del resto del pipeline de ejecución de la consulta para acelerar las consultas en frío en servicios de ClickHouse Cloud con pocos recursos de CPU y aumentar el rendimiento de las consultas limitadas por la E/S. Cuando esta configuración está habilitada, el número de hilos de lectura se controla mediante la configuración max_streams_for_merge_tree_reading: Los datos se leen de forma asíncrona, en paralelo, desde distintas columnas. Tenga en cuenta que también existe la configuración max_streams_to_max_threads_ratio para definir la proporción entre el número de hilos de lectura (streams) y el número de hilos del resto del pipeline de ejecución de la consulta. Sin embargo, en las pruebas de rendimiento no resultó tan útil como la configuración max_streams_for_merge_tree_reading

¿Y optimize_read_in_order?

Con la optimización optimize_read_in_order, ClickHouse puede evitar reordenar los datos en memoria si el orden de clasificación de las consultas refleja el orden físico de los datos en disco, pero eso requiere leer los datos en orden (a diferencia de la lectura asíncrona):

La optimización optimize_read_in_order tiene prioridad sobre la lectura asíncrona

Cuando ClickHouse detecta que puede aplicarse la optimización optimize_read_in_order, se ignorará o deshabilitará la configuración allow_asynchronous_read_from_io_pool_for_merge_tree.

Ejemplo que demuestra todo lo anterior

  • Cree y cargue la tabla UK Property Price Paid
  • Compruebe el valor configurado de max_threads (de forma predeterminada, es la cantidad de núcleos de CPU que ClickHouse ve en el nodo que ejecuta la consulta
SELECT getSetting('max_threads');

┌─getSetting('max_threads')─┐
│                        10 │
└───────────────────────────┘
  • Comprueba el pipeline de consulta con el número predeterminado de hilos tanto para leer como para procesar los datos
EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid;

┌─explain──────────────────────┐
│ (Expression)                 │
│ ExpressionTransform × 10     │
│   (ReadFromMergeTree)        │
│   MergeTreeThread × 10 0 → 1 │
└──────────────────────────────┘
  • Compruebe el pipeline de la consulta con 60 hilos de lectura asíncrona y el número predeterminado de hilos para el resto del pipeline de ejecución de la consulta
EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
SETTINGS
    allow_asynchronous_read_from_io_pool_for_merge_tree = 1,
    max_streams_for_merge_tree_reading = 60;

┌─explain────────────────────────┐
│ (Expression)                   │
│ ExpressionTransform × 10       │
│   (ReadFromMergeTree)          │
│   Resize 60 → 10               │
│     MergeTreeThread × 60 0 → 1 │
└────────────────────────────────┘
  • Compruebe el pipeline de consulta con 20 hilos tanto para leer como para procesar los datos
EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
SETTINGS
    max_threads = 20;

┌─explain──────────────────────┐
│ (Expression)                 │
│ ExpressionTransform × 20     │
│   (ReadFromMergeTree)        │
│   MergeTreeThread × 20 0 → 1 │
└──────────────────────────────┘
  • Compruebe el pipeline de consulta con 60 hilos de lectura asíncrona y 20 hilos para el resto del pipeline de ejecución de la consulta
EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
SETTINGS
    max_threads = 20,
    allow_asynchronous_read_from_io_pool_for_merge_tree = 1,
    max_streams_for_merge_tree_reading = 60;

┌─explain────────────────────────┐
│ (Expression)                   │
│ ExpressionTransform × 20       │
│   (ReadFromMergeTree)          │
│   Resize 60 → 20               │
│     MergeTreeThread × 60 0 → 1 │
└────────────────────────────────┘
  • Verifique el pipeline de consulta con 60 hilos de lectura asíncrona y 20 hilos para el resto del pipeline de ejecución de la consulta cuando puede aplicarse optimize_read_in_order optimization
EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
ORDER BY postcode1, postcode2
SETTINGS
    max_threads = 20,
    allow_asynchronous_read_from_io_pool_for_merge_tree= 1,
    max_streams_for_merge_tree_reading= 60;

┌─explain───────────────────────────┐
│ (Expression)                      │
│ ExpressionTransform               │
│   (Sorting)                       │
│   MergingSortedTransform 20 → 1   │
│     (Expression)                  │
│     ExpressionTransform × 20      │
│       (ReadFromMergeTree)         │
│       MergeTreeInOrder × 20 0 → 1 │
└───────────────────────────────────┘

-- nota: esto es equivalente a deshabilitar allow_asynchronous_read_from_io_pool_for_merge_tree

EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
ORDER BY postcode1, postcode2
SETTINGS
    max_threads = 20,
    allow_asynchronous_read_from_io_pool_for_merge_tree = 0,
    max_streams_for_merge_tree_reading = 0;

┌─explain───────────────────────────┐
│ (Expression)                      │
│ ExpressionTransform               │
│   (Sorting)                       │
│   MergingSortedTransform 20 → 1   │
│     (Expression)                  │
│     ExpressionTransform × 20      │
│       (ReadFromMergeTree)         │
│       MergeTreeInOrder × 20 0 → 1 │
└───────────────────────────────────┘

-- nota: puedes forzar allow_asynchronous_read_from_io_pool_for_merge_tree deshabilitando optimize_read_in_order

EXPLAIN PIPELINE
SELECT *
FROM uk_price_paid
ORDER BY
    postcode1 ASC,
    postcode2 ASC
SETTINGS
    max_threads = 20,
    allow_asynchronous_read_from_io_pool_for_merge_tree = 1,
    max_streams_for_merge_tree_reading = 60,
    optimize_read_in_order = 0;

┌─explain──────────────────────────────┐
│ (Expression)                         │
│ ExpressionTransform                  │
│   (Sorting)                          │
│   MergingSortedTransform 20 → 1      │
│     MergeSortingTransform × 20       │
│       (Expression)                   │
│       ExpressionTransform × 20       │
│         (ReadFromMergeTree)          │
│         Resize 60 → 20               │
│           MergeTreeThread × 60 0 → 1 │
└──────────────────────────────────────┘

Última modificación el 10 de junio de 2026