Gérer les données de sortie de requêtes

Lors de l'évaluation de vos données de sortie, tenez compte du nombre d'octets écrits par votre requête. Combien d'octets sont écrits pour votre ensemble de résultats ? Limitez-vous correctement la quantité de données écrites ? Écrivez-vous à plusieurs reprises les mêmes données ? La quantité de données écrites par une requête a une incidence sur les performances de celle-ci (E/S). Si vous écrivez les résultats dans une table permanente (de destination), la quantité de données écrites a également un coût.

Les bonnes pratiques présentées ci-dessous vous aideront à mieux contrôler vos données de sortie.

Évitez les jointures et les sous-requêtes répétées

Bonne pratique : Évitez de fusionner plusieurs fois les mêmes tables et d’utiliser les mêmes sous-requêtes.

Si vous fusionnez plusieurs fois les mêmes tables, songez à revoir votre schéma. Au lieu de fusionner les données à plusieurs reprises, il est plus efficace d'utiliser des données répétées imbriquées pour représenter les relations. Ces données ont moins d'incidence sur les performances de la bande passante de communication requise par une jointure. Vous limitez également les coûts E/S induits par la lecture et l'écriture répétées des mêmes données. Pour en savoir plus, consultez la section Utiliser des champs imbriqués et répétés.

De même, la répétition de sous-requêtes identiques a un impact sur les performances en raison du traitement répétitif des requêtes. Si vous utilisez les mêmes sous-requêtes dans plusieurs requêtes, pensez à matérialiser les résultats des sous-requêtes dans une table. Ensuite, utilisez les données matérialisées dans vos requêtes.

La matérialisation des résultats de vos sous-requêtes améliore les performances, et réduit la quantité globale de données lues et écrites par BigQuery. L'impact sur les performances du traitement répété des E/S et des requêtes est largement compensé par le faible coût de stockage des données matérialisées.

Songez à matérialiser de grands ensembles de résultats

Bonne pratique : Réfléchissez bien avant d'envisager de matérialiser de grands ensembles de résultats sur une table de destination. En effet, l'écriture de ces volumes importants de données a un impact sur les performances et les coûts.

BigQuery limite les résultats mis en cache à environ 128 Mo compressés. Les requêtes qui renvoient des résultats plus volumineux dépassent cette limite et provoquent fréquemment l'erreur Response too large.

Cette erreur est souvent renvoyée lors de la sélection d'un grand nombre de champs dans une table contenant une quantité considérable de données. Des problèmes d'écriture des résultats mis en cache peuvent également se produire dans les requêtes de type ETL qui normalisent les données sans réduction ni agrégation.

Pour contourner la limite de taille des résultats mis en cache, envisagez ces options :

  • Utiliser des filtres pour limiter l'ensemble de résultats
  • Utiliser une clause LIMIT pour réduire l'ensemble de résultats, en particulier si vous incluez une clause ORDER BY
  • Écrire les données de sortie dans une table de destination

Sachez que l'écriture d'ensembles de résultats très volumineux dans des tables de destination a un impact sur les performances des requêtes (E/S). En outre, vous devrez prévoir de faibles coûts supplémentaires pour le stockage de la table de destination. Pour supprimer automatiquement une grande table de destination, appliquez le paramètre d'expiration de la table par défaut de l'ensemble de données. Pour en savoir plus, consultez la section Utiliser les paramètres d'expiration du document relatif aux bonnes pratiques de stockage.

Utilisez une clause LIMIT avec des tris importants

Bonne pratique : Si vous triez un très grand nombre de valeurs, utilisez une clause LIMIT.

L'écriture des résultats d'une requête avec une clause ORDER BY peut entraîner des erreurs Resources exceeded. Comme le tri final doit être effectué sur un seul emplacement, si vous tentez d'ordonner un ensemble de résultats très volumineux, l'emplacement qui traite les données peut être surchargé. Avec une clause ORDER BY, utilisez également une clause LIMIT.

Par exemple, la requête suivante ordonne un ensemble de résultats très volumineux et génère une erreur Resources exceeded. La requête est triée en fonction de la colonne title dans la table Wiki1B. La colonne title contient des millions de valeurs.

SELECT title
FROM `bigquery-samples.wikipedia_benchmark.Wiki1B`
ORDER BY title

Pour supprimer l'erreur, envoyez une requête semblable à celle-ci :

SELECT title
FROM bigquery-samples.wikipedia_benchmark.Wiki1B
ORDER BY title DESC
LIMIT 1000
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

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