Dans la plupart des cas, vous n’avez pas besoin de clé de partitionnement, et dans la plupart des autres, vous n’avez pas besoin d’une clé de partitionnement plus fine qu’un partitionnement mensuel, sauf dans les cas d’usage d’observabilité où un partitionnement quotidien est courant.Vous ne devez jamais utiliser un partitionnement trop fin. Ne partitionnez pas vos données par identifiant ou nom de client. Utilisez plutôt un identifiant ou un nom de client comme première colonne de l’expression ORDER BY.
PARTITION BY expr lors de la création d’une table. La clé de partitionnement peut être n’importe quelle expression basée sur les colonnes de la table. Par exemple, pour spécifier un partitionnement par mois, utilisez l’expression toYYYYMM(date_column):
Une fusion ne fonctionne que pour les parties de données ayant la même valeur pour l’expression de partitionnement. Cela signifie qu’il ne faut pas créer des partitions trop granulaires (plus d’environ mille partitions). Sinon, la requête
SELECT offre de mauvaises performances en raison d’un nombre excessif de fichiers dans le système de fichiers et de descripteurs de fichier ouverts.visits avec un partitionnement par mois. Exécutons la requête SELECT sur la table system.parts :
partition contient les noms des partitions. Il y a deux partitions dans cet exemple : 201901 et 201902. Vous pouvez utiliser la valeur de cette colonne pour indiquer le nom de la partition dans les requêtes ALTER … PARTITION.
La colonne name contient les noms des parties de données de la partition. Vous pouvez utiliser cette colonne pour indiquer le nom de la partie dans la requête ALTER ATTACH PART.
Décomposons le nom de la partie : 201901_1_9_2_11 :
201901est le nom de la partition.1est le numéro minimal du bloc de données.9est le numéro maximal du bloc de données.2est le niveau du fragment (la profondeur de l’arbre de fusion dont il est issu).11est la version de la mutation (si une partie a subi une mutation)
Les parties des tables de l’ancien type portent le nom suivant :
20190117_20190123_2_2_0 (date minimale - date maximale - numéro minimal de bloc - numéro maximal de bloc - niveau).active indique l’état de la partie. 1 signifie active ; 0, inactive. Les parties inactives sont, par exemple, des parties source restantes après leur fusion dans une partie plus grande. Les parties de données corrompues sont également indiquées comme inactives.
Comme vous pouvez le voir dans l’exemple, il existe plusieurs parties distinctes pour une même partition (par exemple, 201901_1_3_1 et 201901_1_9_2). Cela signifie que ces parties n’ont pas encore été fusionnées. ClickHouse fusionne périodiquement les parties de données insérées, environ 15 minutes après l’insertion. En outre, vous pouvez effectuer une fusion non planifiée à l’aide de la requête OPTIMIZE. Exemple :
/var/lib/clickhouse/data/<database>/<table>/. Par exemple :
detached contient les parties qui ont été détachées de la table à l’aide de la requête DETACH. Les parties corrompues sont également déplacées dans ce répertoire au lieu d’être supprimées. Le serveur n’utilise pas les parties du répertoire detached. Vous pouvez ajouter, supprimer ou modifier les données de ce répertoire à tout moment : le serveur n’en aura pas connaissance tant que vous n’aurez pas exécuté la requête ATTACH.
Notez que, sur un serveur en fonctionnement, vous ne pouvez pas modifier manuellement le jeu de parties ni leurs données dans le système de fichiers, car le serveur n’en aura pas connaissance. Pour les tables non répliquées, vous pouvez le faire lorsque le serveur est arrêté, mais ce n’est pas recommandé. Pour les tables répliquées, le jeu de parties ne peut en aucun cas être modifié.
ClickHouse vous permet d’effectuer des opérations sur les partitions : les supprimer, les copier d’une table à une autre ou créer une sauvegarde. Consultez la liste complète des opérations dans la section Manipulations avec les partitions et les parties.
Optimisation de Group By à l’aide de la clé de partitionnement
Les performances d’une telle requête dépendent de la structure de la table. L’optimisation est activée par défaut depuis la version 26.7 ; les heuristiques d’exécution l’ignorent automatiquement lorsque la structure des partitions est défavorable — plus précisément, lorsqu’il y a trop peu de partitions (moins de
max_threads / 2), trop de partitions (plus de max_number_of_partitions_for_independent_aggregation) ou lorsque la taille des partitions est très déséquilibrée (la plus grande partition contient plus de lignes que deux fois le nombre total de lignes divisé par max_threads). La liste ci-dessous décrit les facteurs de structure qui favorisent de bonnes performances de manière générale ; parmi eux, seuls le nombre de partitions et le déséquilibre des tailles sont pris en compte par les heuristiques d’exécution.- le nombre de partitions impliquées dans la requête doit être suffisamment élevé (plus de
max_threads / 2), sinon la requête sous-exploitera la machine - les partitions ne doivent pas être trop petites, afin que le traitement par lot ne dégénère pas en traitement ligne par ligne
- les partitions doivent être de taille comparable, afin que tous les threads effectuent approximativement la même quantité de travail
Il est recommandé d’appliquer une fonction de hachage aux colonnes de la clause
partition by afin de répartir uniformément les données entre les partitions.allow_aggregate_partitions_independently- détermine si l’utilisation de l’optimisation est activéeforce_aggregate_partitions_independently- force son utilisation lorsqu’elle est applicable du point de vue de la validité du résultat, mais désactivée par la logique interne qui en évalue la pertinencemax_number_of_partitions_for_independent_aggregation- limite stricte du nombre maximal de partitions que la table peut avoir