Interroger des tables en cluster

Interroger des tables en cluster

Lorsque vous créez une table en cluster dans BigQuery, les données de cette table sont automatiquement organisées en fonction du contenu d'une ou de plusieurs colonnes de son schéma de table. Les colonnes que vous spécifiez sont utilisées pour rapprocher les données associées. Lorsque vous mettez une table en cluster à l'aide de plusieurs colonnes, l'ordre des colonnes que vous spécifiez est important. L'ordre des colonnes spécifiées détermine l'ordre de tri des données.

Afin d'optimiser les performances des requêtes exécutées sur des tables en cluster, l'expression que vous utilisez doit filtrer sur une plusieurs colonnes en cluster dans l'ordre où elles ont été spécifiées. Les requêtes qui filtrent sur des colonnes en cluster fonctionnent généralement mieux que celles qui ne filtrent que sur des colonnes hors cluster.

BigQuery trie les données d'une table en cluster selon les valeurs figurant dans les colonnes de clustering, et organise ces données en blocs.

Lorsque vous soumettez une requête qui contient un filtre sur une colonne en cluster, BigQuery utilise les informations de clustering pour déterminer efficacement si un bloc contient des données pertinentes pour la requête. Ce processus, appelé "élimination en bloc", permet à BigQuery de n'analyser que les blocs pertinents.

Vous pouvez interroger les tables en cluster :

  • en utilisant la console GCP ou l'UI Web classique de BigQuery ;
  • en utilisant la commande bq query de l'outil de ligne de commande ;
  • en appelant la méthode API jobs.insert et en configurant une tâche de requête.

Actuellement, vous ne pouvez utiliser que le SQL standard avec les tables en cluster.

Autorisations requises

Au niveau de l'ensemble de données, l'interrogation d'une table en cluster nécessite l'accès READER à l'ensemble de données contenant la table.

Au lieu d'utiliser des autorisations au niveau de l'ensemble de données, vous pouvez exploiter un rôle IAM au niveau du projet incluant l'autorisation bigquery.tables.getData. Les autorisations bigquery.tables.getData sont obligatoires pour lire les données de la table interrogée. Tous les rôles IAM prédéfinis au niveau du projet incluent les autorisations bigquery.tables.getData, à l'exception de bigquery.user, bigquery.jobUser et bigquery.metadataViewer.

Vous devez également disposer d'autorisations bigquery.jobs.create pour pouvoir exécuter des tâches de requête. Voici les rôles IAM prédéfinis au niveau du projet qui incluent les autorisations bigquery.jobs.create :

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Contrôle des accès. Pour en savoir plus sur les rôles au niveau de l'ensemble de données, consultez la section Rôles primitifs pour les ensembles de données.

Bonnes pratiques

Voici quelques exemples de bonnes pratiques visant à améliorer les performances des requêtes portant sur des tables en cluster.

Description de la table utilisée dans les exemples

La table utilisée dans les exemples de cette page est une table en cluster créée via une instruction DDL. Cette instruction DDL crée une table nommée ClusteredSalesData. Cette table est organisée en cluster d'après la colonne customer_id, puis la colonne product_id et, enfin, la colonne order_id.

CREATE TABLE
  `mydataset.ClusteredSalesData`
PARTITION BY
  DATE(timestamp)
CLUSTER BY
  customer_id,
  product_id,
  order_id AS
SELECT
  *
FROM
  `mydataset.SalesData`

Filtrer les colonnes en cluster dans l'ordre où elles ont été spécifiées

Lorsque vous spécifiez un filtre, utilisez des expressions qui filtrent sur les colonnes en cluster selon l'ordre spécifié.

La requête suivante contient une expression de filtre portant sur la colonne customer_id puis sur la colonne product_id. Cette requête optimise les performances en filtrant sur les colonnes en cluster dans l'ordre où elles ont été spécifiées.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000
  AND product_id LIKE 'gcp_analytics%'

La requête suivante ne filtre pas sur les colonnes en cluster selon l'ordre spécifié. Par conséquent, ses performances ne sont pas optimales. Cette requête filtre sur la colonne product_id, puis sur la colonne order_id (en ignorant la colonne customer_id).

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  product_id LIKE 'gcp_analytics%'
  AND order_id = 20000

Ne pas utiliser de colonnes en cluster dans des expressions de filtre complexes

Si vous utilisez une colonne en cluster dans une expression de filtre complexe, les performances de la requête ne sont pas optimisées dans la mesure où l'élimination en bloc ne peut pas être appliquée.

Par exemple, la requête suivante n'élimine pas de blocs, car la colonne en cluster customer_id est utilisée dans une fonction au sein de l'expression de filtre.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  CAST(customer_id AS STRING) = "10000"

Pour optimiser les performances des requêtes via l'élimination en bloc, utilisez des expressions de filtre simples comme celle qui suit. Dans cet exemple, un filtre simple est appliqué à la colonne en cluster : customer_id.

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = 10000

Ne pas comparer une colonne en cluster à une autre colonne

Si une expression de filtre compare une colonne en cluster à une autre colonne (que celle-ci soit en cluster ou hors cluster), les performances de la requête ne sont pas optimisées dans la mesure où l'élimination en bloc ne peut pas être appliquée.

La requête suivante n'élimine pas de blocs, car l'expression de filtre compare la colonne en cluster customer_id à une autre colonne (order_id).

SELECT
  SUM(totalSale)
FROM
  `mydataset.ClusteredSalesData`
WHERE
  customer_id = order_id

Étapes suivantes

Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Besoin d'aide ? Consultez notre page d'assistance.