Résoudre les erreurs de requête

Ce document est destiné à vous aider à résoudre les erreurs les plus courantes renvoyées par les requêtes ayant échoué.

Résolution de schéma Avro

Chaîne d'erreur : Cannot skip stream

Cette erreur peut se produire lors du chargement de plusieurs fichiers Avro avec différents schémas, ce qui entraîne un problème de résolution du schéma et l'échec de la tâche d'importation dans un fichier aléatoire.

Pour résoudre cette erreur, assurez-vous que le dernier fichier alphabétique de la tâche de chargement contient le sur-ensemble (union) des schémas différents. Il s'agit d'une exigence basée sur la manière dont Avro gère la résolution de schéma.

Requêtes simultanées en conflit

Chaîne d'erreur : Concurrent jobs in the same session are not allowed

Cette erreur peut se produire lorsque plusieurs requêtes s'exécutent simultanément dans une session, ce qui n'est pas accepté. Référez-vous aux limites de session.

Instructions LMD en conflit

Chaîne d'erreur : Could not serialize access to table due to concurrent update

Cette erreur peut se produire en cas de conflit lors de l'exécution simultanée de plusieurs instructions LMD (langage de manipulation de données) sur une même table ou lorsque la table est tronquée par une instruction LMD impliquant une mutation. Pour en savoir plus, consultez la section Conflits d'instructions LMD.

Pour résoudre cette erreur, exécutez des opérations LMD qui affectent une seule table afin d'éviter les chevauchements.

Autorisations de contrôle des accès insuffisantes au niveau des colonnes

Chaîne d'erreur : Requires raw access permissions on the read columns to execute the DML statements

Cette erreur se produit lorsque vous tentez d'effectuer une instruction LMD DELETE, UPDATE ou MERGE, sans l'autorisation "Lecteur détaillé" sur les colonnes analysées qui utilisent le contrôle des accès au niveau des colonnes. pour restreindre l'accès au niveau des colonnes. Pour en savoir plus, consultez la page Impact sur les opérations d'écriture avec le contrôle des accès au niveau des colonnes.

Identifiants non valides pour les requêtes programmées

Chaînes d'erreur :

  • Error code: INVALID_USERID
  • Error code 5: Authentication failure: User Id not found
  • PERMISSION_DENIED: BigQuery: Permission denied while getting Drive credentials

Cette erreur peut se produire lorsqu'une requête programmée échoue en raison d'identifiants obsolètes, en particulier lors de l'interrogation de données Google Drive.

Pour résoudre cette erreur, mettez à jour les identifiants de la requête programmée.

Identifiants du compte de service non valides

Chaîne d'erreur : HttpError 403 when requesting returned: The caller does not have permission

Cette erreur peut se produire lorsque vous tentez de configurer une requête programmée avec un compte de service. Pour résoudre cette erreur, consultez la procédure de dépannage dans Problèmes d'autorisation.

Heure d'instantané non valide

Chaîne d'erreur : Invalid snapshot time

Cette erreur peut se produire lorsque vous essayez d'interroger des données historiques en dehors de la fenêtre de fonctionnalité temporelle de l'ensemble de données. Pour résoudre cette erreur, modifiez la requête d'accès aux données historiques afin de l'inclure dans la fenêtre de fonctionnalité temporelle de l'ensemble de données.

Cette erreur peut également se produire si l'une des tables utilisées dans la requête est supprimée puis recréée après le démarrage de la requête. Vérifiez si une requête planifiée ou une application effectuent cette opération en même temps que la requête ayant échoué. Le cas échéant, essayez de déplacer le processus qui effectue l'opération de suppression et de recréation à une heure qui n'entre pas en conflit avec les requêtes qui lisent cette table.

La tâche existe déjà

Chaîne d'erreur : Already Exists: Job <job name>

Cette erreur peut se produire pour les tâches de requête qui doivent évaluer des tableaux volumineux, de telle sorte que la création de la tâche de requête prend plus de temps que la moyenne. Par exemple, une requête avec une clause WHERE telle que WHERE column IN (<2000+ elements array>).

Pour résoudre cette erreur, procédez comme suit :

Job introuvable

Chaîne d'erreur : Job not found

Cette erreur peut se produire en réponse à un appel getQueryResults dans lequel aucune valeur n'est spécifiée pour le champ location. Dans ce cas, réessayez l'appel et fournissez une valeur location.

Pour en savoir plus, consultez la page Évitez plusieurs évaluations des mêmes expressions de table courantes (CTE).

La requête dépasse le délai d'exécution

Chaîne d'erreur : Query fails due to reaching the execution time limit

Si votre requête atteint le Délai d'exécution de la requête, vérifiez la durée des précédentes exécutions de la requête en interrogeant la vue INFORMATION_SCHEMA.JOBS avec une requête semblable à l'exemple suivant :

SELECT TIMESTAMP_DIFF(end_time, start_time, SECOND) AS runtime_in_seconds
FROM `region-us`.INFORMATION_SCHEMA.JOBS
WHERE statement_type = 'QUERY'
AND query = "my query string";

Si les exécutions précédentes de la requête ont pris beaucoup moins de temps, utilisez les insights sur les performances des requêtes pour déterminer et résoudre le problème sous-jacent.

La réponse à la requête est trop volumineuse

Chaîne d'erreur : responseTooLarge

Cette erreur se produit lorsque les résultats de la requête dépassent la taille de réponse maximale.

Pour résoudre cette erreur, suivez les instructions fournies pour le message d'erreur responseTooLarge.

Trop d'instructions LMD

Chaîne d'erreur : Too many DML statements outstanding against <table-name>, limit is 20

Cette erreur se produit lorsque vous dépassez la limite de 20 instructions LMD à l'état PENDING dans une file d'attente pour une seule table. Cette erreur se produit généralement lorsque vous envoyez des tâches LMD sur une seule table plus rapidement que ce que BigQuery peut traiter.

Une solution possible consiste à regrouper plusieurs opérations LMD plus petites en plusieurs tâches plus volumineuses, mais moins nombreuses. Lorsque vous regroupez des tâches plus petites en plus grandes, le coût d'exécution des tâches les plus importantes est amorti et l'exécution est plus rapide. Le regroupement des instructions LMD qui affectent les mêmes données améliore généralement l'efficacité des tâches LMD et est moins susceptible de dépasser la limite de quota de la file d'attente. Pour plus d'informations sur l'optimisation de vos opérations LMD, consultez la section Instructions LMD qui mettent à jour ou insèrent des lignes uniques.

D'autres solutions permettant d'améliorer l'efficacité du LMD peuvent être de partitionner ou de mettre en cluster vos tables. Pour en savoir plus, consultez la section Bonnes pratiques.

Problèmes liés à un dépassement de ressources

Les problèmes suivants se produisent lorsque BigQuery ne dispose pas de ressources suffisantes pour traiter votre requête.

La requête dépasse les ressources du processeur

Chaîne d'erreur : Query exceeded resource limits

Cela erreur se produit lorsque les requêtes à la demande utilisent trop de ressources de processeur par rapport à la quantité de données analysée. Pour en savoir plus sur la résolution de ces problèmes, consultez la page Résoudre les problèmes liés au dépassement de ressources.

La requête dépasse les ressources mémoire

Chaîne d'erreur : Resources exceeded during query execution: The query could not be executed in the allotted memory

Pour les instructions SELECT, cette erreur se produit lorsque la requête utilise trop de ressources. Pour résoudre cette erreur, consultez la section Résoudre les problèmes liés au dépassement de ressources.

La requête dépasse les ressources de brassage

Chaîne d'erreur : Resources exceeded during query execution: Your project or organization exceeded the maximum disk and memory limit available for shuffle operations

Cette erreur se produit lorsqu'une requête ne peut pas accéder à suffisamment de ressources de brassage.

Pour résoudre cette erreur, provisionnez plus d'emplacements ou réduisez la quantité de données traitée par la requête. Pour en savoir plus, consultez la section Quota de brassage insuffisant.

Pour en savoir plus sur la résolution de ces problèmes, consultez la section Résoudre les problèmes liés au dépassement de ressources.

Requête trop complexe

Chaîne d'erreur : Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex

Cette erreur se produit lorsqu'une requête est trop complexe. Les principales causes de la complexité sont les suivantes :

  • Clauses WITH profondément imbriquées ou utilisées à plusieurs reprises.
  • Vues profondément imbriquées ou utilisées à plusieurs reprises.
  • Utilisation répétée de l'opérateur UNION ALL.

Pour résoudre cette erreur, essayez les options suivantes :

  • Divisez la requête en plusieurs requêtes, puis utilisez un langage procédural pour exécuter ces requêtes en séquence, avec un état partagé.
  • Utilisez des tables temporaires au lieu des clauses WITH.
  • Réécrivez votre requête pour réduire le nombre d'objets référencés et de comparaisons.

Pour en savoir plus sur la résolution de ces problèmes, consultez la section Résoudre les problèmes liés au dépassement de ressources.

Résoudre les problèmes liés au dépassement de ressources

Pour les tâches de requête :

Pour optimiser vos requêtes, procédez comme suit :

  • Essayez de retirer une clause ORDER BY.
  • Si la requête utilise JOIN, assurez-vous que la plus grande table se trouve à gauche de la clause.
  • Si la requête utilise FLATTEN, déterminez si elle est nécessaire pour ce cas d'utilisation. Pour en savoir plus, consultez la section sur les données imbriquées et répétées.
  • Si la requête utilise EXACT_COUNT_DISTINCT, pensez à utiliser plutôt COUNT(DISTINCT).
  • Si votre requête utilise COUNT(DISTINCT <value>, <n>) avec une valeur <n> élevée, pensez à utiliser GROUP BY à la place. Pour en savoir plus, consultez la section consacrée à COUNT(DISTINCT).
  • Si votre requête utilise UNIQUE, utilisez plutôt GROUP BY ou une fonction de fenêtre dans une instruction subselect.
  • Si votre requête matérialise plusieurs lignes à l'aide d'une clause LIMIT, envisagez de filtrer une autre colonne telle que ROW_NUMBER(), ou de supprimer complètement la clause LIMIT pour autoriser le chargement en parallèle des écritures.
  • Si votre requête utilise des vues profondément imbriquées et une clause WITH, cela peut entraîner une croissance exponentielle de complexité, atteignant ainsi les limites.
  • Ne remplacez pas les tables temporaires par des clauses WITH. La clause peut devoir être recalculée plusieurs fois, ce qui peut compliquer la requête et la ralentir. La persistance des résultats intermédiaires dans les tables temporaires facilite la complexité.
  • Évitez d'utiliser des requêtes UNION ALL.

Pour en savoir plus, consultez les ressources suivantes :

Pour les tâches de chargement :

Si vous chargez des fichiers Avro ou Parquet, réduisez la taille des lignes dans les fichiers. Recherchez les restrictions de taille spécifiques au format de fichier que vous chargez :

Si cette erreur se produit lors du chargement des fichiers ORC, contactez l'assistance.

Pour l'API Storage :

Chaîne d'erreur : Stream memory usage exceeded

Lors d'un appel ReadRows à l'API Storage Read, certains flux avec une utilisation élevée de mémoire peuvent obtenir une erreur RESOURCE_EXHAUSTED avec ce message. Cela peut se produire lors de la lecture de tables volumineuses ou de tables avec un schéma complexe. Pour résoudre le problème, réduisez la taille des lignes de résultat en sélectionnant moins de colonnes à lire (à l'aide du paramètre selected_fields), ou en simplifiant le schéma de la table.

Étapes suivantes