1–33). Les requêtes d’une même famille (a, b, c, …) partagent le même graphe de jointure, mais diffèrent par leurs prédicats de sélection.
Références
- How Good Are Query Optimizers, Really? (Leis et al., VLDB 2015)
- Dépôt Join Order Benchmark
Création des tables
init_cloud.sql du dépôt ClickHouse.
Chaque table utilise le moteur MergeTree, avec un tri sur sa colonne de clé primaire id, en miroir du schéma PostgreSQL d’origine dans lequel chaque table déclare id integer NOT NULL PRIMARY KEY. Les colonnes PostgreSQL pouvant contenir des valeurs NULL sont mappées sur des types Nullable(...).
Créez les tables :
Chargement des données
aka_name.csv, title.csv, …).
Ces fichiers CSV utilisent la sémantique COPY de PostgreSQL avec ESCAPE '\' : un backslash n’échappe le caractère de guillemet qu’à l’intérieur d’un champ entre guillemets, tandis qu’en dehors des guillemets, un backslash est un caractère littéral.
ClickHouse attend des CSV conformes à la RFC 4180 (guillemets doublés, sans échappement par backslash), les fichiers doivent donc d’abord être réencodés.
convert_csv.py effectue ce réencodage.
Il lit le CSV d’origine sur stdin et écrit un CSV standard sur stdout, en doublant les guillemets internes et en conservant les champs vides non entre guillemets (que ClickHouse associe à NULL pour les colonnes Nullable).
Pour créer les tables à partir des CSV d’origine :
- Créez les tables (voir ci-dessus).
- Téléchargez le jeu de données IMDb sous la forme d’un fichier
imdb.tgz, en suivant les instructions du dépôt Join Order Benchmark. - Convertissez et importez les données :
clickhouse client --database job --query "SELECT * FROM title ORDER BY id FORMAT Parquet" > title.parquet.
Tailles détaillées des tables :
| Table | taille (en lignes) | taille (compressée dans ClickHouse) |
|---|---|---|
| aka_name | 901,343 | 31.86 MiB |
| aka_title | 361,472 | 14.32 MiB |
| cast_info | 36,244,344 | 296.25 MiB |
| char_name | 3,140,339 | 107.95 MiB |
| comp_cast_type | 4 | 132.00 B |
| company_name | 234,997 | 8.38 MiB |
| company_type | 4 | 162.00 B |
| complete_cast | 135,086 | 748.80 KiB |
| info_type | 113 | 1.25 KiB |
| keyword | 134,170 | 1.88 MiB |
| kind_type | 7 | 177.00 B |
| link_type | 18 | 284.00 B |
| movie_companies | 2,609,129 | 21.20 MiB |
| movie_info | 14,835,720 | 300.46 MiB |
| movie_info_idx | 1,380,035 | 8.01 MiB |
| movie_keyword | 4,523,930 | 21.06 MiB |
| movie_link | 29,997 | 178.21 KiB |
| name | 4,167,491 | 131.16 MiB |
| person_info | 2,963,664 | 154.12 MiB |
| role_type | 12 | 246.00 B |
| title | 2,528,312 | 78.04 MiB |
| Total | 74,190,187 | 1.15 GiB |
system.tables.total_bytes et sont basées sur les définitions de table ci-dessus.)
Requêtes
settings.json.
Consultez le README pour connaître les problèmes connus et les remarques concernant certaines requêtes.
Les requêtes font référence aux tables par leur nom ; exécutez-les donc sur la base de données job (par exemple avec clickhouse client --database job).
Exemple de requête (1a) :