Saltar al contenido principal
Join Order Benchmark (JOB) pone a prueba el optimizador de consultas con 113 consultas analíticas sobre un conjunto de datos real y altamente correlacionado (una instantánea de IMDb). Desde su introducción, el benchmark JOB se ha convertido en el estándar de facto para evaluar el rendimiento de los optimizadores de consultas de bases de datos relacionales, incluida la estimación de cardinalidad y la optimización del orden de los joins. A diferencia de los benchmarks sintéticos, que asumen datos uniformes e independientes, JOB utiliza datos reales con sesgos y correlaciones, lo que lo convierte en una prueba exigente para el orden de los joins y la estimación de cardinalidad. El conjunto de datos contiene alrededor de 74 millones de filas distribuidas en 21 tablas y ocupa aproximadamente 1.15 GiB comprimidos en ClickHouse. Las 113 consultas están organizadas en 33 familias (133). Las consultas dentro de una misma familia (a, b, c, …) comparten el mismo grafo de joins, pero difieren en sus predicados de selección. Referencias

Creación de las tablas

El conjunto de datos JOB es una instantánea de IMDb con 21 tablas. Las definiciones de las tablas están disponibles en init_cloud.sql en el repositorio de ClickHouse. Cada tabla usa el motor MergeTree, ordenado por su columna de clave primaria id, reflejando el esquema original de PostgreSQL, donde cada tabla declara id integer NOT NULL PRIMARY KEY. Las columnas anulables de PostgreSQL se asignan a tipos Nullable(...). Cree las tablas:

Carga de los datos

Los datos provienen de la instantánea original de IMDb utilizado por JOB, distribuido como un archivo CSV por tabla (aka_name.csv, title.csv, …). Estos CSV usan la semántica de COPY de PostgreSQL con ESCAPE '\': una barra invertida solo escapa el carácter de comillas dentro de un campo entrecomillado, mientras que fuera de las comillas la barra invertida es un carácter literal. ClickHouse espera archivos CSV conformes con RFC 4180 (comillas duplicadas, sin escapes con barra invertida), por lo que primero hay que volver a codificar los archivos. convert_csv.py realiza esa recodificación. Lee el CSV original desde stdin y escribe un CSV estándar en stdout, duplicando las comillas incrustadas y conservando los campos vacíos sin comillas (que ClickHouse asigna a NULL en las columnas Nullable). Para crear las tablas a partir de los CSV originales:
  • Cree las tablas (consulte más arriba).
  • Descargue el data set de IMDb como un archivo imdb.tgz, siguiendo las instrucciones del repositorio Join Order Benchmark.
  • Convierta e importe los datos:
Una vez pobladas las tablas, pueden exportarse a Parquet para volver a importarlas más rápidamente más adelante; p. ej. clickhouse client --database job --query "SELECT * FROM title ORDER BY id FORMAT Parquet" > title.parquet. Tamaños detallados de las tablas:
Tablatamaño (en filas)tamaño (comprimido en ClickHouse)
aka_name901,34331.86 MiB
aka_title361,47214.32 MiB
cast_info36,244,344296.25 MiB
char_name3,140,339107.95 MiB
comp_cast_type4132.00 B
company_name234,9978.38 MiB
company_type4162.00 B
complete_cast135,086748.80 KiB
info_type1131.25 KiB
keyword134,1701.88 MiB
kind_type7177.00 B
link_type18284.00 B
movie_companies2,609,12921.20 MiB
movie_info14,835,720300.46 MiB
movie_info_idx1,380,0358.01 MiB
movie_keyword4,523,93021.06 MiB
movie_link29,997178.21 KiB
name4,167,491131.16 MiB
person_info2,963,664154.12 MiB
role_type12246.00 B
title2,528,31278.04 MiB
Total74,190,1871.15 GiB
(Los tamaños comprimidos en ClickHouse se obtienen de system.tables.total_bytes y se basan en las definiciones de tabla anteriores.)

Consultas

Las 113 consultas de JOB se pueden encontrar aquí en el repositorio de ClickHouse. Los ajustes utilizados para ejecutarlas están en settings.json. Consulta el README para ver los problemas conocidos y las notas sobre consultas concretas. Las consultas hacen referencia a las tablas por su nombre, así que ejecútalas en la base de datos job (por ejemplo, con clickhouse client --database job). Una consulta de ejemplo (1a):
Última modificación el 25 de junio de 2026