1Partitionnement et clustering
Question discriminante
Quelle est la différence entre partitionnement et clustering dans BigQuery ? Comment choisir ?
- Partitionnement — divise la table par colonnes date/timestamp ou par ingestion time. BigQuery scanne uniquement les partitions filtrées. Réduction des coûts directe
- Clustering — trie les données dans chaque partition selon 1-4 colonnes. Réduit le volume scanné pour les filtres et les agrégations. Gratuit (pas de surcoût)
- Combo optimal — PARTITION BY date + CLUSTER BY (region, product_id). La partition réduit les partitions scannées, le clustering réduit les octets dans la partition
- Partition pruning — fonctionne uniquement si le filtre porte sur la colonne de partition. WHERE DATE(created_at) = '2025-01-01' active le pruning. WHERE EXTRACT(YEAR FROM created_at) = 2025 ne l'active pas
-- Table partitionnée et clusterisée
CREATE TABLE analytics.fct_orders
PARTITION BY DATE(order_date)
CLUSTER BY region, product_category
AS
SELECT order_id, customer_id, amount, region, product_category, order_date
FROM raw.orders;
-- Vérifier l'efficacité du partitionnement avec INFORMATION_SCHEMA
SELECT
table_name,
partition_id,
total_rows,
total_logical_bytes / POW(1024, 3) AS gb_size
FROM analytics.INFORMATION_SCHEMA.PARTITIONS
WHERE table_name = 'fct_orders'
ORDER BY partition_id DESC
LIMIT 30;
2INFORMATION_SCHEMA : audit et monitoring
Question discriminante
Comment utilisez-vous INFORMATION_SCHEMA pour monitorer les coûts et les performances BigQuery ?
-- Top 10 requêtes les plus coûteuses des dernières 24h
SELECT
user_email,
job_id,
ROUND(total_bytes_billed / POW(1024, 4), 4) AS tb_billed,
ROUND(total_bytes_billed / POW(1024, 4) * 5, 4) AS cost_usd,
total_slot_ms / 1000 AS slot_seconds,
SUBSTR(query, 1, 200) AS query_preview,
creation_time
FROM `region-eu`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE creation_time >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR)
AND job_type = 'QUERY'
AND state = 'DONE'
ORDER BY total_bytes_billed DESC
LIMIT 10;
-- Tables les plus grosses du dataset
SELECT table_name, row_count,
ROUND(size_bytes / POW(1024, 3), 2) AS size_gb
FROM analytics.INFORMATION_SCHEMA.TABLE_STORAGE
ORDER BY size_bytes DESC;
- JOBS_BY_PROJECT — toutes les requêtes exécutées : user, durée, octets scannés, coût estimé
- TABLE_STORAGE — taille des tables, nombre de lignes, date de dernière modification
- PARTITIONS — métadonnées sur chaque partition : lignes, taille, dernière modification
- RESERVATIONS — monitoring des slots alloués (en mode Capacity)
3Maîtrise des coûts BigQuery
Question discriminante
Quelles sont vos pratiques pour contrôler les coûts BigQuery en production ?
- SELECT * interdit — BigQuery facture sur les colonnes scannées. Toujours sélectionner uniquement les colonnes nécessaires
- Cost controls — configurer un maximum de 1TB par requête (custom quotas) pour les développeurs
- Partitioning obligatoire — toute table >10GB sans partitionnement est un anti-pattern
- BI Engine — cache en mémoire pour les dashboards Looker Studio. Évite de rescanner la table à chaque actualisation
- Slots vs on-demand — on-demand : 5$/TB scanné. Slots réservés : coût fixe mensuel, rentable à >10TB/jour de requêtes
-- Quotas par utilisateur (Cloud Console → IAM → Quotas)
-- Ou via gcloud :
gcloud alpha services quota update --consumer=project:mon-projet --service=bigquery.googleapis.com --metric=bigquery.googleapis.com/quota/query/usage --value=1099511627776 # 1TB max par requête
-- Dry run : estimer le coût avant d'exécuter
bq query --dry_run --use_legacy_sql=false "SELECT * FROM analytics.fct_orders WHERE order_date = '2025-01-01'"
# → This query will process 245 MB when run.
4BigQuery ML : ML directement en SQL
Question discriminante
Quand utilisez-vous BigQuery ML plutôt qu'un framework Python (sklearn, XGBoost) ?
-- Entraîner un modèle de régression logistique directement en SQL
CREATE OR REPLACE MODEL analytics.churn_model
OPTIONS(
model_type='LOGISTIC_REG',
input_label_cols=['churned'],
max_iterations=20,
learn_rate=0.1
) AS
SELECT
nb_commandes_30j,
montant_total_90j,
jours_depuis_derniere_connexion,
segment,
churned
FROM analytics.features_churn
WHERE split = 'TRAIN';
-- Scorer les clients actuels
SELECT customer_id, predicted_churned, predicted_churned_probs
FROM ML.PREDICT(MODEL analytics.churn_model,
(SELECT * FROM analytics.features_churn WHERE split = 'PREDICT'));
-- Évaluer le modèle
SELECT * FROM ML.EVALUATE(MODEL analytics.churn_model);
- Quand BQML — équipes SQL-first sans infra Python, prototypage rapide, données déjà dans BigQuery
- Quand Python — modèles complexes (DNN, transformers), feature engineering avancé, plus de contrôle sur l'entraînement
- Modèles disponibles — régression linéaire/logistique, XGBoost, DNN, k-means, ARIMA, import de modèles TensorFlow/PyTorch
5BigQuery Omni et BigLake
Question discriminante
Qu'est-ce que BigLake ? Dans quel cas l'utilisez-vous ?
- BigLake — requêter des fichiers Parquet/CSV dans GCS, AWS S3 ou Azure Blob comme des tables BigQuery, avec les mêmes permissions Unity Catalog-like et le fine-grained access
- BigQuery Omni — exécuter des requêtes BigQuery sur AWS/Azure sans déplacer les données. Utile pour le multi-cloud
- Connexions externes — connecter BigQuery à des APIs externes ou à des fonctions Cloud Run pour enrichir les données
- Avantage BigLake — gérer les permissions d'accès aux fichiers S3/GCS via BigQuery IAM plutôt que des ACLs stockage complexes
6Bonnes pratiques en production
Question discriminante
Quelles sont vos règles non-négociables pour BigQuery en production ?
- Partitionnement systématique — toute table >5GB partitionnée par date
- Clustering sur les colonnes de filtre — les colonnes les plus souvent utilisées dans WHERE et GROUP BY
- Pas de SELECT * — politique de revue de code qui bloque les PR avec SELECT *
- Labels sur les jobs — labelliser les requêtes par équipe et projet pour l'attribution des coûts
- Monitoring INFORMATION_SCHEMA — dashboard de coûts hebdomadaire par utilisateur/équipe
- Dataset par environnement — analytics_dev, analytics_staging, analytics_prod. Pas de dev sur le dataset de prod
- BI Engine - cache en memoire pour les dashboards Looker Studio. Evite de rescanner la table a chaque actualisation. Facturation au Go de memoire reserve
- Slots vs on-demand - on-demand : 5 USD/TB scanne. Slots reserves : cout fixe mensuel, rentable a plus de 10TB/j de requetes
- BigLake - requeter des fichiers Parquet dans GCS, AWS S3 ou Azure Blob comme des tables BigQuery, avec les memes permissions et le fine-grained access
- BigQuery ML - BQML : quand equipes SQL-first sans infra Python, prototypage rapide. Python : modeles complexes (DNN, transformers), feature engineering avance
- Labels sur les jobs - labelliser les requetes par equipe et projet pour l attribution des couts. Configurer dans les settings BigQuery ou via les APIs
7Grille par niveau
| Niveau | Maîtrise | Signal GO | NO-GO |
| Confirmé | Partitionnement, clustering, contrôle des coûts basique | Configure systématiquement le partitionnement, connaît l'impact du SELECT *, utilise INFORMATION_SCHEMA | Crée des tables sans partitionnement, fait des SELECT * en production |
| Senior | BQML, BigLake, optimisation slots, architecture multi-projet | A utilisé BQML pour du ML en SQL, configure des slots réservés, gère les coûts par équipe via labels | Ne sait pas la différence entre on-demand et slots réservés |