* split up select.md * array-join.md basic refactoring * distinct.md basic refactoring * format.md basic refactoring * from.md basic refactoring * group-by.md basic refactoring * having.md basic refactoring * additional index.md refactoring * into-outfile.md basic refactoring * join.md basic refactoring * limit.md basic refactoring * limit-by.md basic refactoring * order-by.md basic refactoring * prewhere.md basic refactoring * adjust operators/index.md links * adjust sample.md links * adjust more links * adjust operatots links * fix some links * adjust aggregate function article titles * basic refactor of remaining select clauses * absolute paths in make_links.sh * run make_links.sh * remove old select.md locations * translate docs/es * translate docs/fr * translate docs/fa * remove old operators.md location * change operators.md links * adjust links in docs/es * adjust links in docs/es * minor texts adjustments * wip * update machine translations to use new links * fix changelog * es build fixes * get rid of some select.md links * temporary adjust ru links * temporary adjust more ru links * improve curly brace handling * adjust ru as well * fa build fix * ru link fixes * zh link fixes * temporary disable part of anchor checks
6.6 KiB
machine_translated | machine_translated_rev | toc_priority | toc_title |
---|---|---|---|
true | 72537a2d52 |
34 | SummingMergeTree |
SummingMergeTree
Le moteur hérite de MergeTree. La différence est que lors de la fusion de parties de données pour SummingMergeTree
tables ClickHouse remplace toutes les lignes avec la même clé primaire (ou, plus précisément, avec la même clé de tri) avec une ligne qui contient des valeurs résumées pour les colonnes avec le type de données numériques. Si la clé de tri est composée de telle sorte qu'une seule valeur de clé correspond à un grand nombre de lignes, cela réduit considérablement le volume de stockage et accélère la sélection des données.
Nous vous recommandons d'utiliser le moteur avec MergeTree
. Stocker des données complètes dans MergeTree
table, et l'utilisation SummingMergeTree
pour le stockage de données agrégées, par exemple, lors de la préparation de rapports. Une telle approche vous empêchera de perdre des données précieuses en raison d'une clé primaire mal composée.
Création d'une Table
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
Pour une description des paramètres de requête, voir demande de description.
Paramètres de SummingMergeTree
-
columns
- un n-uplet avec les noms de colonnes où les valeurs seront résumées. Paramètre facultatif. Les colonnes doivent être d'un type numérique et ne doit pas être dans la clé primaire.Si
columns
non spécifié, ClickHouse résume les valeurs dans toutes les colonnes avec un type de données numérique qui ne sont pas dans la clé primaire.
Les clauses de requête
Lors de la création d'un SummingMergeTree
la table de la même clause sont nécessaires, comme lors de la création d'un MergeTree
table.
Méthode obsolète pour créer une Table
!!! attention "Attention" N'utilisez pas cette méthode dans les nouveaux projets et, si possible, remplacez les anciens projets par la méthode décrite ci-dessus.
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE [=] SummingMergeTree(date-column [, sampling_expression], (primary, key), index_granularity, [columns])
Tous les paramètres excepté columns
ont la même signification que dans MergeTree
.
columns
— tuple with names of columns values of which will be summarized. Optional parameter. For a description, see the text above.
Exemple D'Utilisation
Considérons le tableau suivant:
CREATE TABLE summtt
(
key UInt32,
value UInt32
)
ENGINE = SummingMergeTree()
ORDER BY key
Insérer des données:
INSERT INTO summtt Values(1,1),(1,2),(2,1)
ClickHouse peut résumer toutes les lignes pas complètement (voir ci-dessous), nous utilisons donc une fonction d'agrégation sum
et GROUP BY
la clause dans la requête.
SELECT key, sum(value) FROM summtt GROUP BY key
┌─key─┬─sum(value)─┐
│ 2 │ 1 │
│ 1 │ 3 │
└─────┴────────────┘
Le Traitement Des Données
Lorsque les données sont insérées dans une table, elles sont enregistrées telles quelles. Clickhouse fusionne périodiquement les parties de données insérées et c'est à ce moment que les lignes avec la même clé primaire sont additionnées et remplacées par une pour chaque partie de données résultante.
ClickHouse can merge the data parts so that different resulting parts of data cat consist rows with the same primary key, i.e. the summation will be incomplete. Therefore (SELECT
) une fonction d'agrégation somme() et GROUP BY
la clause doit être utilisé dans une requête comme décrit dans l'exemple ci-dessus.
Règles communes pour la sommation
Les valeurs dans les colonnes avec le type de données numériques sont résumées. L'ensemble des colonnes est défini par le paramètre columns
.
Si les valeurs étaient 0 dans toutes les colonnes pour la sommation, la ligne est supprimée.
Si la colonne n'est pas dans la clé primaire et n'est pas résumée, une valeur arbitraire est sélectionnée parmi celles existantes.
Les valeurs ne sont pas résumés des colonnes de la clé primaire.
La somme dans les colonnes Aggregatefunction
Pour les colonnes de Type AggregateFunction ClickHouse se comporte comme AggregatingMergeTree moteur d'agrégation selon la fonction.
Structures Imbriquées
Table peut avoir des structures de données imbriquées qui sont traitées d'une manière spéciale.
Si le nom d'une table imbriquée se termine avec Map
et il contient au moins deux colonnes qui répondent aux critères suivants:
- la première colonne est numérique
(*Int*, Date, DateTime)
ou une chaîne de caractères(String, FixedString)
, nous allons l'appelerkey
, - les autres colonnes sont arithmétique
(*Int*, Float32/64)
, nous allons l'appeler(values...)
,
ensuite, cette table imbriquée est interprétée comme un mappage de key => (values...)
et lors de la fusion de ses lignes, les éléments de deux ensembles de données sont regroupées par key
avec une sommation du correspondant (values...)
.
Exemple:
[(1, 100)] + [(2, 150)] -> [(1, 100), (2, 150)]
[(1, 100)] + [(1, 150)] -> [(1, 250)]
[(1, 100)] + [(1, 150), (2, 150)] -> [(1, 250), (2, 150)]
[(1, 100), (2, 150)] + [(1, -100)] -> [(2, 150)]
Lorsque vous demandez des données, utilisez sumMap (clé, valeur) fonction pour l'agrégation de Map
.
Pour la structure de données imbriquée, vous n'avez pas besoin de spécifier ses colonnes dans le tuple de colonnes pour la sommation.