Soluciona errores de consultas
El objetivo de este documento es ayudarte a solucionar los errores más comunes que muestran las consultas con errores.
Resolución de esquema de Avro
Cadena del error: Cannot skip stream
Este error puede ocurrir cuando se cargan varios archivos de Avro con diferentes esquemas, lo que genera un problema de resolución del esquema y hace que el trabajo de importación falle en un archivo aleatorio.
Para abordar este error, asegúrate de que el último archivo alfabético en el trabajo de carga contenga el superconjunto (unión) de los esquemas diferentes. Este es un requisito basado en cómo Avro maneja la resolución de esquema.
Consultas simultáneas en conflicto
Cadena del error: Concurrent jobs in the same session are not allowed
Este error puede ocurrir cuando varias consultas se ejecutan de forma simultánea en una sesión, lo que no se admite. Consulta las limitaciones de sesión.
Declaraciones DML en conflicto
Cadena del error: Could not serialize access to table due to concurrent update
Este error puede ocurrir cuando las mutaciones de declaraciones de lenguaje de manipulación de datos (DML) que se ejecutan en simultáneo en la misma tabla entran en conflicto entre sí o cuando la tabla se trunca durante una mutación de DML. Para obtener más información, consulta Conflictos de declaraciones DML.
Para abordar este error, ejecuta operaciones DML que afecten a una sola tabla, de modo que no se superpongan.
Permisos insuficientes de control de acceso a nivel de columna
Cadena del error: Requires raw access permissions on the read columns to execute the DML statements
Este error se produce cuando intentas realizar una declaración DELETE
, UPDATE
o MERGE
de DML, sin tener el permiso detallado de lector en las columnas analizadas que usan el control de acceso a nivel de columna para restringir el acceso a nivel de columna. Para obtener más información, consulta Impacto en las operaciones de escritura del control de acceso a nivel de columna.
Las credenciales no son válidas para las consultas programadas
Cadenas de error:
Error code: INVALID_USERID
Error code 5: Authentication failure: User Id not found
PERMISSION_DENIED: BigQuery: Permission denied while getting Drive credentials
Este error puede ocurrir cuando una consulta programada falla debido a credenciales desactualizadas, en especial cuando se consultan datos de Google Drive.
Para abordar este error, actualiza las credenciales de consulta programada.
Las credenciales de la cuenta de servicio no son válidas.
Cadena del error: HttpError 403 when requesting returned: The caller does not have permission
Este error puede aparecer cuando intentas configurar una consulta programada con una cuenta de servicio. Para resolver este error, consulta los pasos para solucionar problemas en Problemas de autorización y permisos.
El tiempo de la instantánea no es válido
Cadena del error: Invalid snapshot time
Este error puede ocurrir cuando intentas consultar datos históricos que están fuera del período de viaje en el tiempo del conjunto de datos. Para abordar este error, cambia la consulta a fin de acceder a los datos históricos dentro del período de viaje en el tiempo del conjunto de datos.
Este error también puede aparecer si una de las tablas usadas en la consulta se descarta y se vuelve a crear después de que comienza la consulta. Verifica si hay una consulta programada o una aplicación que realice esta operación que se ejecutó al mismo tiempo que la consulta con errores. Si es así, intenta mover el proceso que realiza la operación de descarte y recreación para que se ejecute en un momento que no entre en conflicto con las consultas que leen esa tabla.
El trabajo ya existe
Cadena del error: Already Exists: Job <job name>
Este error puede ocurrir en los trabajos de consulta que deben evaluar arrays grandes, de modo que la creación de un trabajo de consulta tome más tiempo que el promedio. Por ejemplo, una consulta con una cláusula WHERE
como WHERE column IN (<2000+ elements array>)
.
Para abordar este error, sigue estos pasos:
- Permite que BigQuery genere un valor
jobId
aleatorio en lugar de especificar uno. - Usa una consulta parametrizada para cargar el arreglo.
Trabajo no encontrado
Cadena del error: Job not found
Este error puede ocurrir en respuesta a una llamada getQueryResults
, en la que no se especifica ningún valor para el campo location
. Si ese es el caso,
vuelve a intentar la llamada y proporciona un valor location
.
Para obtener más información, consulta Evita varias evaluaciones de las mismas expresiones de tabla comunes (CTE).
La consulta excede el límite de tiempo de ejecución
Cadena del error: Query fails due to reaching the execution time limit
Si tu consulta llega al límite de tiempo de ejecución de la consulta, verifica el tiempo de ejecución de las ejecuciones anteriores de la consulta mediante una consulta a la vista INFORMATION_SCHEMA.JOBS
con una consulta similar al siguiente ejemplo:
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 las ejecuciones anteriores de la consulta tomaron mucho menos tiempo, usa las estadísticas de rendimiento de las consultas para determinar y abordar el problema subyacente.
La respuesta de la consulta es demasiado grande
Cadena del error: responseTooLarge
Este error ocurre cuando los resultados de tu consulta son más grandes que el tamaño máximo de respuesta.
A fin de abordar este error, sigue las instrucciones proporcionadas para el mensaje de error responseTooLarge
.
Demasiadas declaraciones DML
Cadena del error: Too many DML statements outstanding against <table-name>, limit is 20
Este error se produce cuando superas el límite de 20 declaraciones DML en el estado PENDING
en una cola para una sola tabla. Por lo general, este error ocurre
cuando envías trabajos DML en una sola tabla más rápido de lo que puede
procesar BigQuery.
Una solución posible es agrupar varias operaciones DML más pequeñas en trabajos más grandes, pero menos numerosos. Cuando agrupas trabajos más pequeños en trabajos más grandes, el costo de ejecutar los trabajos más grandes se amortiza y la ejecución es más rápida. Por lo general, la consolidación de declaraciones DML que afectan a los mismos datos mejora la eficiencia de los trabajos DML y es menos probable que exceda el límite de cuota de tamaño de las colas. Para obtener más información acerca de cómo optimizar tus operaciones DML, consulta Declaraciones DML que actualizan o insertan filas individuales.
Otras soluciones para mejorar la eficiencia del DML podrían ser particionar o agrupar en clústeres tus tablas. Para obtener más información, consulta las Prácticas recomendadas.
El usuario no tiene permiso
Cadenas de error:
Access Denied: Project [project_id]: User does not have bigquery.jobs.create permission in project [project_id].
User does not have permission to query table project-id:dataset.table.
Este error ocurre cuando ejecutas una consulta sin el
permiso bigquery.jobs.create
en el proyecto en el que ejecutas la consulta,
sin importar los permisos en el proyecto que contiene los datos. También
debes tener el permiso bigquery.tables.getData
en todas las
tablas y vistas a las que hace referencia la consulta.
Este error también puede ocurrir si la tabla no existe en la región consultada,
como asia-south1
. Para consultar las vistas, también necesitas este permiso en todas
las tablas y vistas subyacentes. Para obtener más información acerca de los permisos necesarios,
consulta Ejecuta una consulta.
Cuando abordas este error, ten en cuenta lo siguiente:
Cuentas de servicio: Las cuentas de servicio deben tener el permiso
bigquery.jobs.create
en el proyecto desde el que se ejecutan.Roles personalizados: Los roles personalizados de IAM deben tener el permiso
bigquery.jobs.create
incluido de forma explícita en el rol relevante.Conjuntos de datos compartidos: cuando trabajas con conjuntos de datos compartidos en un proyecto diferente, es posible que aún necesites el permiso
bigquery.jobs.create
en el proyecto para ejecutar consultas o trabajos en ese conjunto de datos.
Otorga permiso para acceder a la tabla
Para otorgar a un principio permiso para acceder a una tabla, sigue estos pasos:
Ve a la página de BigQuery.
En Explorador, navega a la tabla a la que necesitas acceder, selecciona
Ver acciones, selecciona Compartir. y, luego, haz clic en Administrar permisos.En Agregar principales, ingresa el nombre de los usuarios, grupos, dominios o cuentas de servicio que deseas agregar.
En Asignar roles, selecciona el permiso
bigquery.jobs.create
. Como alternativa, otorgar el rolroles/bigquery.jobUser
en el proyecto desde el que se realiza la consulta proporciona los permisos necesarios.Haz clic en Guardar.
Problemas de recursos excedidos
Los siguientes problemas se producen cuando BigQuery no tiene recursos suficientes para completar la consulta.
La consulta supera los recursos de CPU
Cadena del error: Query exceeded resource limits
Este error ocurre cuando las consultas a pedido usan demasiada CPU en relación con la cantidad de datos analizados. Si deseas obtener información para resolver estos problemas, consulta Soluciona problemas de recursos excedidos.
La consulta excede los recursos de memoria
Cadena del error: Resources exceeded during query execution: The query could not be executed in the allotted memory
En las sentencias SELECT
, este error se produce cuando la consulta usa demasiados recursos.
Para abordar este error, consulta Soluciona problemas de recursos excedidos.
La consulta excede los recursos de Shuffle
Cadena del error: Resources exceeded during query execution: Your project or organization exceeded the maximum disk and memory limit available for shuffle operations
Este error ocurre cuando una consulta no puede acceder a suficientes recursos de Shuffle.
Para abordar este error, aprovisiona más ranuras o reduce la cantidad de datos que procesa la consulta. Para obtener más información sobre las formas de hacerlo, consulta Cuota de Shuffle insuficiente.
Si deseas obtener información adicional para resolver estos problemas, consulta Soluciona problemas de recursos excedidos.
La consulta es demasiado compleja
Cadena del error: Resources exceeded during query execution: Not enough resources for query planning - too many subqueries or query is too complex
Este error ocurre cuando una consulta es demasiado compleja. Las siguientes son las causas principales de la complejidad:
- Cláusulas
WITH
que se anidan de forma profunda o se usan de forma repetida. - Vistas que se anidan de forma profunda o se usan de manera repetida.
- Uso reiterado del operador
UNION ALL
.
Para resolver este error, prueba las siguientes opciones:
- Divide la consulta en varias consultas y, luego, usa el lenguaje de procedimiento para ejecutar esas consultas en una secuencia con estado compartido.
- Usa tablas temporales en lugar de cláusulas
WITH
. - Vuelve a escribir tu consulta para reducir la cantidad de objetos a los que se hace referencia y las comparaciones.
Si deseas obtener información adicional para resolver estos problemas, consulta Soluciona problemas de recursos excedidos.
Soluciona problemas de recursos excedidos
Para los trabajos de consulta, haz lo siguiente:
Para optimizar tus consultas, prueba los siguientes pasos:
- Intenta quitar una cláusula
ORDER BY
. - Si tu consulta usa
JOIN
, asegúrate de que la tabla más grande se encuentre en el lado izquierdo de la cláusula. - Si tu consulta usa
FLATTEN
, determina si es necesario para tu caso práctico. A fin de obtener más información, consulta los datos anidados y repetidos. - Si tu consulta usa
EXACT_COUNT_DISTINCT
, considera reemplazar este valor porCOUNT(DISTINCT)
. - Si tu consulta usa
COUNT(DISTINCT <value>, <n>)
con un valor<n>
grande, considera usarGROUP BY
en su lugar. Para obtener más información, consultaCOUNT(DISTINCT)
: - Si tu consulta usa
UNIQUE
, considera usarGROUP BY
en su lugar, o una función analítica dentro de una subselección. - Si tu consulta materializa muchas filas mediante una cláusula
LIMIT
, te recomendamos filtrar en otra columna, por ejemplo,ROW_NUMBER()
, o quitar la cláusulaLIMIT
por completo para permitir la paralelización de escritura. - Si tu consulta usó vistas anidadas de manera profunda y una cláusula
WITH
, esto puede causar un crecimiento exponencial de la complejidad y, por lo tanto, alcanzar los límites. - No reemplaces las tablas temporales por cláusulas
WITH
. Es posible que la cláusula deba volver a calcularse varias veces, lo que puede hacer que la consulta sea compleja y, por lo tanto, lenta. Conservar los resultados intermedios en tablas temporales ayuda con la complejidad - Evita usar consultas
UNION ALL
.
Para obtener más información, consulta los siguientes recursos:
- Optimiza el procesamiento de las consultas.
- Obtén más detalles sobre la advertencia de recursos.
- Supervisa el estado, el uso de recursos y los trabajos
Para los trabajos de carga, haz lo siguiente:
Si cargas archivos Avro o Parquet, reduce el tamaño de las filas en los archivos. Comprueba si hay restricciones de tamaño específicas para el formato de archivo que cargas:
Si recibes este error cuando cargas archivos ORC, comunícate con el equipo de asistencia.
Para la API de Storage:
Cadena del error: Stream memory usage exceeded
Durante una llamada ReadRows
a la API de lectura de almacenamiento, algunas transmisiones con uso de memoria alto pueden recibir un error RESOURCE_EXHAUSTED
con este mensaje.
Esto puede suceder cuando se lee desde tablas anchas o con tablas con un esquema complejo. Como resolución, reduce el tamaño de la fila resultante. Para ello, selecciona menos columnas para leer (con el parámetro selected_fields
) o simplifica el esquema de la tabla.
¿Qué sigue?
- Obtén estadísticas de rendimiento de las consultas.
- Obtén más información sobre la optimización de consultas para el rendimiento.
- Revisa las cuotas y límites de las consultas.
- Obtén más información sobre otros mensajes de error de BigQuery.