Guía de traducción de SQL de Teradata
En este documento, se detallan las similitudes y diferencias que existen en la sintaxis de SQL de Teradata y BigQuery para ayudarte a planificar tu migración. Usa la traducción de SQL por lotes para migrar tus secuencias de comandos de SQL de forma masiva o la traducción de SQL interactiva a fin de traducir consultas ad hoc.
Tipos de datos
En esta sección, se muestran los equivalentes entre los tipos de datos en Teradata y en BigQuery.
Teradata | BigQuery | Notas |
---|---|---|
INTEGER |
INT64 |
|
SMALLINT |
INT64 |
|
BYTEINT |
INT64 |
|
BIGINT |
INT64 |
|
DECIMAL |
Usa Usa los tipos de datos decimales parametrizados de BigQuery si necesitas aplicar dígitos personalizados o límites de escala (restricciones). Teradata te permite insertar valores de mayor precisión mediante el redondeo del valor almacenado. Sin embargo, mantiene la alta precisión en los cálculos. Esto puede generar un comportamiento de redondeo inesperado en comparación con el estándar ANSI. |
|
FLOAT |
FLOAT64 |
|
NUMERIC |
Usa Usa los tipos de datos decimales parametrizados de BigQuery si necesitas aplicar dígitos personalizados o límites de escala (restricciones). Teradata te permite insertar valores de mayor precisión mediante el redondeo del valor almacenado. Sin embargo, mantiene la alta precisión en los cálculos. Esto puede generar un comportamiento de redondeo inesperado en comparación con el estándar ANSI. |
|
NUMBER |
Usa Usa los tipos de datos decimales parametrizados de BigQuery si necesitas aplicar dígitos personalizados o límites de escala (restricciones). Teradata te permite insertar valores de mayor precisión mediante el redondeo del valor almacenado. Sin embargo, mantiene la alta precisión en los cálculos. Esto puede generar un comportamiento de redondeo inesperado en comparación con el estándar ANSI. |
|
REAL |
FLOAT64 |
|
CHAR/CHARACTER |
STRING |
Usa el tipo de datos |
VARCHAR |
STRING |
Usa el tipo de datos |
CLOB |
STRING |
|
JSON |
JSON |
|
BLOB |
BYTES |
|
BYTE |
BYTES |
|
VARBYTE |
BYTES |
|
DATE |
DATE |
BigQuery no admite formatos personalizados similares a los que admite Teradata con DataForm en SDF. |
TIME |
TIME |
|
TIME WITH TIME ZONE |
TIME |
Teradata almacena el tipo de datos TIME en UTC y te permite pasar un desplazamiento de UTC mediante la sintaxis WITH TIME ZONE
. El tipo de datos TIME en BigQuery representa una hora que es independiente de cualquier fecha o zona horaria. |
TIMESTAMP |
TIMESTAMP |
Los tipos de datos TIMESTAMP de Teradata y BigQuery tienen precisión de microsegundos (pero Teradata admite segundos bisiestos, al contrario de BigQuery).Los tipos de datos de Teradata y BigQuery suelen estar asociados con una zona horaria UTC (detalles). |
TIMESTAMP WITH TIME ZONE |
TIMESTAMP |
La TIMESTAMP de Teradata se puede establecer en una zona horaria diferente en todo el sistema, por usuario o por columna (mediante
WITH TIME ZONE ).El tipo TIMESTAMP de BigQuery usa UTC si no especificas una zona horaria de forma explícita. Asegúrate de exportar de forma correcta la información de la zona horaria (no debes concatenar un valor DATE y un valor TIME sin información de la zona horaria) para que BigQuery pueda convertirla en la importación. Como alternativa, asegúrate de convertir la información de la zona horaria en UTC antes de exportarla.BigQuery tiene DATETIME para una abstracción entre la hora civil, que no muestra una zona horaria cuando se genera, y TIMESTAMP , que es un punto preciso en el tiempo que siempre muestra la zona horaria UTC. |
ARRAY |
ARRAY |
|
MULTI-DIMENSIONAL ARRAY |
ARRAY |
En BigQuery, usa un arreglo de structs, en el que cada struct contenga un campo del tipo ARRAY (para obtener más detalles, consulta la documentación de BigQuery). |
INTERVAL HOUR |
INT64 |
|
INTERVAL MINUTE |
INT64 |
|
INTERVAL SECOND |
INT64 |
|
INTERVAL DAY |
INT64 |
|
INTERVAL MONTH |
INT64 |
|
INTERVAL YEAR |
INT64 |
|
PERIOD(DATE) |
DATE ,
DATE |
PERIOD(DATE) debe convertirse en dos columnas DATE que contengan la fecha de inicio y de finalización para que puedan usarse con funciones analíticas. |
PERIOD(TIMESTAMP WITH TIME ZONE) |
TIMESTAMP ,
TIMESTAMP |
|
PERIOD(TIMESTAMP) |
TIMESTAMP ,
TIMESTAMP |
|
PERIOD(TIME) |
TIME ,
TIME |
|
PERIOD(TIME WITH TIME ZONE) |
TIME ,
TIME |
|
UDT |
STRING |
|
XML |
STRING |
|
TD_ANYTYPE |
STRING |
Para obtener más información sobre la conversión de tipos, consulta la siguiente sección.
Formatos de tipos de Teradata
SQL de Teradata usa un conjunto de formatos predeterminados a fin de mostrar expresiones y datos de columnas y para conversiones entre tipos de datos. Por ejemplo, un tipo de datos PERIOD(DATE)
en modo INTEGERDATE
tiene el formato YY/MM/DD
de forma predeterminada. Te sugerimos usar el modo ANSIDATE siempre que sea posible a fin de garantizar el cumplimiento del estándar ANSI SQL y aprovechar esta oportunidad para descartar los formatos heredados.
Teradata permite la aplicación automática de formatos personalizados mediante la cláusula FORMAT
, sin cambiar el almacenamiento subyacente, ya sea como un atributo de tipo de datos cuando creas una tabla mediante DDL o en una expresión derivada. Por ejemplo, una especificación de FORMAT
9.99
redondea cualquier valor FLOAT
a dos dígitos.
En BigQuery, esta función debe convertirse mediante la función ROUND()
.
Esta función necesita controlar casos extremos complejos. Por ejemplo, cuando se aplica la cláusula FORMAT
a una columna NUMERIC
, debes tener en cuenta las reglas de formateo y redondeo especiales.
Se puede usar una cláusula FORMAT
para convertir de manera implícita un valor INTEGER
de ciclo de entrenamiento en un formato DATE
. También puede ocurrir que una especificación de FORMAT
X(6)
en una columna VARCHAR
trunque el valor de la columna y, por lo tanto, se deba convertir en una función SUBSTR()
. Este comportamiento no cumple con el estándar ANSI SQL. Por lo tanto, sugerimos no migrar los formatos de columna a BigQuery.
Si los formatos de columna son obligatorios, usa vistas o funciones definidas por el usuario (UDF).
A fin de obtener información sobre los formatos predeterminados que SQL de Teradata usa para cada tipo de datos, consulta la documentación sobre formatos predeterminados de Teradata.
Tipos de formato de marca de tiempo y fecha
En la siguiente tabla, se resumen las diferencias en los elementos de formato de fecha y marca de tiempo entre el SQL de Teradata y GoogleSQL.
Formato de Teradata | Descripción de Teradata | BigQuery |
---|---|---|
CURRENT_TIMESTAMP
|
La información de TIME y TIMESTAMP en Teradata puede tener datos de zonas horarias diferentes, que se definen mediante WITH
TIME ZONE . |
Si es posible, usa CURRENT_TIMESTAMP() , que tiene formato ISO. Sin embargo, el formato de salida siempre muestra la zona horaria UTC.
(A nivel interno, BigQuery no tiene una zona horaria).Ten en cuenta los siguientes detalles sobre las diferencias en el formato ISO. El formato de DATETIME se basa en las convenciones del canal de salida. En la herramienta de línea de comandos y la consola de BigQuery, se le da formato mediante un separador T según el estándar RFC 3339. Sin embargo, en JDBC de Python y Java, se usa un espacio como separador.Si quieres usar un formato explícito, usa FORMAT_DATETIME() , que hace que una conversión explícita sea una string. Por ejemplo, la siguiente expresión siempre muestra un separador de espacios:CAST(CURRENT_DATETIME() AS STRING) Teradata admite una palabra clave DEFAULT en las columnas TIME para establecer la hora actual (marca de tiempo). En cambio, eso no sucede en BigQuery.
|
CURRENT_DATE |
Las fechas se almacenan en Teradata como valores INT64 mediante la siguiente fórmula:(YEAR - 1900) * 10000 + (MONTH * 100) + DAY Las fechas pueden tener el formato de números enteros. |
BigQuery tiene un formato DATE independiente que siempre muestra una fecha en formato ISO 8601.No se puede usar DATE_FROM_UNIX_DATE porque se basa en 1970.Teradata admite una palabra clave DEFAULT en columnas DATE para establecer la fecha actual. En cambio, eso no sucede en BigQuery.
|
CURRENT_DATE-3 |
Los valores de fecha se representan como números enteros. Teradata admite operadores aritméticos para tipos de fecha. |
Para los tipos de fecha, usa DATE_ADD() o DATE_SUB() .BigQuery usa operadores aritméticos para tipos de datos: INT64 , NUMERIC y FLOAT64 .
|
SYS_CALENDAR.CALENDAR |
Teradata proporciona una vista para que las operaciones de calendario vayan más allá de las operaciones de números enteros. | No se usa en BigQuery. |
SET SESSION DATEFORM=ANSIDATE |
Establece el formato de fecha de la sesión o del sistema en ANSI (ISO 8601). | BigQuery siempre usa ISO 8601, así que asegúrate de convertir las fechas y horas de Teradata. |
Sintaxis de las consultas
En esta sección, se abordan las diferencias que existen en la sintaxis de consultas en Teradata y en BigQuery.
Declaración SELECT
La mayoría de las declaraciones SELECT
de Teradata son compatibles con BigQuery. En la siguiente tabla, se incluye una lista de diferencias menores.
Teradata | BigQuery | |
---|---|---|
SEL |
Se convierte en SELECT . BigQuery no usa la abreviatura SEL . |
|
SELECT
|
En BigQuery, las columnas no pueden hacer referencia al resultado de otras columnas definidas dentro de la misma lista de selección. Es preferible mover una subconsulta a una cláusula WITH .
WITH flags AS (
|
|
SELECT * FROM table
|
BigQuery no usa el predicado lógico ANY .La misma funcionalidad se puede lograr mediante varios operadores OR :SELECT * FROM table En este caso, la comparación de strings también difiere. Consulta Operadores de comparación. |
|
SELECT TOP 10 * FROM table
|
BigQuery usa LIMIT al final de una consulta en lugar de TOP n después de la palabra clave SELECT . |
Operadores de comparación
En la siguiente tabla, se muestran los operadores de comparación de Teradata que son específicos de Teradata y deben convertirse en los operadores compatibles con ANSI SQL:2011 que se usan en BigQuery.
Para obtener información sobre los operadores en BigQuery, consulta la sección Operadores de la documentación de BigQuery.
Teradata | BigQuery | Notas |
---|---|---|
exp EQ exp2 exp IN (exp2, exp3)
|
exp = exp2 exp IN (exp2, exp3) A fin de mantener una semántica que no cumpla con ANSI para NOT CASESPECIFIC , puedes usarRTRIM(UPPER(exp)) = RTRIM(UPPER(exp2)) |
Durante las comparaciones de igualdad de strings, es posible que Teradata ignore los espacios en blanco iniciales y finales, mientras que BigQuery los considera parte de la string. Por ejemplo, 'xyz'=' xyz' es TRUE en Teradata, pero FALSE en BigQuery.Teradata también proporciona un atributo de columna
NOT CASESPECIFIC que le indica a Teradata que ignore las mayúsculas y minúsculas cuando se comparan dos strings. BigQuery siempre distingue entre mayúsculas y minúsculas cuando se comparan strings. Por ejemplo, 'xYz' = 'xyz' es TRUE en Teradata, pero FALSE en BigQuery.
|
exp LE exp2 |
exp <= exp2 |
|
exp LT exp2 |
exp < exp2 |
|
exp NE exp2 |
exp <> exp2
|
|
exp GE exp2 |
exp >= exp2 |
|
exp GT exp2 |
exp > exp2 |
JOIN
condiciones
BigQuery y Teradata admiten las mismas condiciones JOIN
, ON
y USING
. En la siguiente tabla, se incluye una lista de diferencias menores.
Teradata | BigQuery | Notas |
---|---|---|
FROM A LEFT OUTER JOIN B ON A.date >
B.start_date AND A.date < B.end_date
|
FROM A LEFT OUTER JOIN (SELECT d FROM B JOIN
UNNEST(GENERATE_DATE_ARRAY(B.start_date, B.end_date)) d)
B ON A.date = B.date
|
BigQuery admite cláusulas JOIN de desigualdad para todas las uniones internas o si se da al menos una condición de igualdad (=), pero no admite una sola condición de desigualdad (= y <) en una OUTER JOIN .
Estas construcciones a veces se usan para consultar rangos de fechas o de números enteros.
BigQuery evita que los usuarios creen grandes uniones cruzadas por accidente.
|
FROM A, B ON A.id = B.id
|
FROM A JOIN B ON A.id = B.id
|
Usar una coma entre tablas en Teradata equivale a una INNER JOIN , mientras que en BigQuery equivale a una CROSS JOIN (producto cartesiano). Debido a que la coma en SQL heredado de BigQuery se trata como UNION , recomendamos que la operación sea explícita para evitar confusiones.
|
FROM A JOIN B ON
(COALESCE(A.id , 0) = COALESCE(B.id, 0))
|
FROM A JOIN B ON
(COALESCE(A.id , 0) = COALESCE(B.id, 0))
|
No hay diferencias entre las funciones escalares (constantes). |
FROM A JOIN B ON
A.id = (SELECT MAX(B.id) FROM B)
|
FROM A JOIN (SELECT MAX(B.id) FROM B)
B1 ON A.id = B1.id
|
BigQuery evita que los usuarios usen subconsultas, subconsultas correlacionadas o agregaciones en los predicados de la unión. Esto permite que BigQuery realice consultas paralelas. |
Transmisión y conversión de tipos
BigQuery tiene menos tipos de datos, pero estos son más amplios que Teradata, lo que requiere que BigQuery sea más estricto en la transmisión.
Teradata | BigQuery | Notas |
---|---|---|
exp EQ exp2 exp IN (exp2, exp3)
|
exp = exp2 exp IN (exp2, exp3) A fin de mantener una semántica que no cumpla con ANSI para NOT CASESPECIFIC , puedes usarRTRIM(UPPER(exp)) = RTRIM(UPPER(exp2)) |
Durante las comparaciones de igualdad de strings, es posible que Teradata ignore los espacios en blanco iniciales y finales, mientras que BigQuery los considera parte de la string. Por ejemplo, 'xyz'=' xyz' es TRUE en Teradata, pero FALSE en BigQuery.Teradata también proporciona un atributo de columna
NOT CASESPECIFIC que le indica a Teradata que ignore las mayúsculas y minúsculas cuando se comparan dos strings. BigQuery siempre distingue entre mayúsculas y minúsculas cuando se comparan strings. Por ejemplo, 'xYz' = 'xyz' es TRUE en Teradata, pero FALSE en BigQuery.
|
CAST(long_varchar_column AS CHAR(6))
|
LPAD(long_varchar_column, 6)
|
La transmisión de una columna de caracteres en Teradata a veces se usa como una forma no estándar y no óptima de crear una substring con relleno. |
CAST(92617 AS TIME)
92617 (FORMAT '99:99:99')
|
PARSE_TIME("%k%M%S", CAST(92617 AS STRING)) |
Teradata realiza muchas más conversiones implícitas y operaciones de redondeo que BigQuery, que en general es más estricto y aplica los estándares ANSI.
(En este ejemplo, se muestra 9:26:17) |
CAST(48.5 (FORMAT 'zz') AS FLOAT)
|
CAST(SUBSTR(CAST(48.5 AS STRING), 0, 2) AS FLOAT64) |
Los tipos de datos de punto flotante y numéricos pueden requerir reglas de redondeo especiales cuando se aplican con formatos como monedas.
(En este ejemplo, se muestra 48) |
Consulta también las secciones sobre operadores de comparación y formatos de columna. Tanto las comparaciones como el formateo de columnas pueden comportarse como conversiones de tipo.
Cláusulas QUALIFY
, ROWS
La cláusula QUALIFY
en Teradata te permite filtrar resultados para funciones analíticas.
Como alternativa, se puede usar una frase ROWS
para la misma tarea. Estas frases funcionan de manera similar a una condición HAVING
para una cláusula GROUP
, lo que limita el resultado de lo que en BigQuery se llaman funciones analíticas.
Teradata | BigQuery |
---|---|
SELECT col1, col2
|
La cláusula QUALIFY de Teradata con una función analítica como ROW_NUMBER() , SUM() o COUNT() y con OVER PARTITION BY se expresa en BigQuery como una cláusula WHERE en la subconsulta que contiene el valor analítico. Mediante ROW_NUMBER() :SELECT col1, col2 Mediante ARRAY_AGG , que admite particiones más grandes:
SELECT
|
SELECT col1, col2
|
SELECT col1, col2 En BigQuery, se pueden usar RANGE y ROWS en la cláusula de marco de ventana. Sin embargo, las cláusulas analíticas solo se pueden usar con funciones analíticas como AVG() , no con funciones de numeración como ROW_NUMBER() . |
Palabra clave NORMALIZE
Teradata proporciona la palabra clave NORMALIZE
para las cláusulas SELECT
para fusionar períodos o intervalos superpuestos en un solo período o intervalo que abarque todos los valores de períodos individuales.
BigQuery no admite el tipo PERIOD
, por lo que cualquier columna de tipo PERIOD
en Teradata debe insertarse en BigQuery como dos campos DATE
o DATETIME
independientes que correspondan al inicio y al final del período.
Teradata | BigQuery |
---|---|
SELECT NORMALIZE
|
SELECT
|
Funciones
En las siguientes secciones, se muestra una lista de las funciones de Teradata junto con las funciones equivalentes de BigQuery.
Funciones de agregación
En la siguiente tabla, se muestran las funciones comunes de agregación, agregación estadística y agregación aproximada de Teradata junto con las funciones equivalentes de BigQuery. BigQuery ofrece las siguientes funciones de agregación adicionales:
ANY_VALUE
APPROX_COUNT_DISTINCT
APPROX_QUANTILES
APPROX_TOP_COUNT
APPROX_TOP_SUM
COUNTIF
LOGICAL_AND
LOGICAL_OR
STRING_AGG
Teradata | BigQuery |
---|---|
AVG |
AVG |
BITAND |
BIT_AND |
BITNOT |
Operador NOT a nivel de bits (~ ) |
BITOR |
BIT_OR |
BITXOR |
BIT_XOR |
CORR |
CORR |
COUNT |
COUNT |
COVAR_POP |
COVAR_POP |
COVAR_SAMP |
COVAR_SAMP |
MAX |
MAX |
MIN |
MIN |
REGR_AVGX |
AVG( |
REGR_AVGY |
AVG( |
REGR_COUNT |
SUM( |
REGR_INTERCEPT |
AVG(dep_var_expression) - AVG(ind_var_expression) *
(COVAR_SAMP(ind_var_expression,
|
REGR_R2 |
(COUNT(dep_var_expression)* |
REGR_SLOPE |
- COVAR_SAMP(ind_var_expression, |
REGR_SXX |
SUM(POWER(ind_var_expression, 2)) -
COUNT(ind_var_expression) * |
REGR_SXY |
SUM(ind_var_expression * dep_var_expression) -
COUNT(ind_var_expression) |
REGR_SYY |
SUM(POWER(dep_var_expression, 2)) -
COUNT(dep_var_expression) |
SKEW |
Función personalizada definida por el usuario. |
STDDEV_POP |
STDDEV_POP |
STDDEV_SAMP |
STDDEV_SAMP,
STDDEV |
SUM |
SUM |
VAR_POP |
VAR_POP |
VAR_SAMP |
VAR_SAMP,
VARIANCE |
Funciones analíticas de Teradata y BigQuery
En la siguiente tabla, se muestra la relación entre las funciones analíticas y de agregación comunes de Teradata y las funciones analíticas equivalentes de BigQuery. BigQuery ofrece las siguientes funciones adicionales:
Funciones de fecha y hora
En la siguiente tabla, se muestran las funciones de fecha y hora comunes de Teradata junto con sus equivalentes de BigQuery. BigQuery ofrece las siguientes funciones adicionales de fecha y hora:
CURRENT_DATETIME
DATE_ADD
DATE_DIFF
DATE_FROM_UNIX_DATE
DATE_SUB
DATE_TRUNC
DATETIME
DATETIME_ADD
DATETIME_DIFF
DATETIME_SUB
DATETIME_TRUNC
PARSE_DATE
PARSE_DATETIME
PARSE_TIME
PARSE_TIMESTAMP
STRING
TIME
TIME_ADD
TIME_DIFF
TIME_SUB
TIME_TRUNC
TIMESTAMP
TIMESTAMP_ADD
TIMESTAMP_DIFF
TIMESTAMP_MICROS
TIMESTAMP_MILLIS
TIMESTAMP_SECONDS
TIMESTAMP_SUB
TIMESTAMP_TRUNC
UNIX_DATE
UNIX_MICROS
UNIX_MILLIS
UNIX_SECONDS
Teradata | BigQuery |
---|---|
ADD_MONTHS |
DATE_ADD,
TIMESTAMP_ADD
|
CURRENT_DATE |
CURRENT_DATE
|
CURRENT_TIME |
CURRENT_TIME
|
CURRENT_TIMESTAMP |
CURRENT_TIMESTAMP
|
DATE + k |
DATE_ADD(date_expression,
INTERVAL k DAY)
|
DATE - k |
DATE_SUB(date_expression,
INTERVAL k DAY)
|
EXTRACT |
EXTRACT(DATE),
EXTRACT(TIMESTAMP)
|
FORMAT_DATE
|
|
FORMAT_DATETIME
|
|
FORMAT_TIME
|
|
FORMAT_TIMESTAMP
|
|
LAST_DAY |
LAST_DAY
Nota: Esta función admite expresiones de entrada DATE y DATETIME .
|
MONTHS_BETWEEN |
DATE_DIFF(date_expression, date_expression, MONTH)
|
NEXT_DAY |
DATE_ADD( |
OADD_MONTHS |
DATE_SUB( |
td_day_of_month |
EXTRACT(DAY FROM date_expression) |
td_day_of_week |
EXTRACT(DAYOFWEEK FROM date_expression) |
td_day_of_year |
EXTRACT(DAYOFYEAR FROM date_expression) |
td_friday |
DATE_TRUNC( |
td_monday |
DATE_TRUNC( |
td_month_begin |
DATE_TRUNC(date_expression, MONTH)
|
td_month_end |
DATE_SUB( |
td_month_of_calendar |
(EXTRACT(YEAR FROM date_expression) - 1900) * 12 + EXTRACT(MONTH FROM date_expression)
|
td_month_of_quarter |
EXTRACT(MONTH FROM date_expression) |
td_month_of_year |
EXTRACT(MONTH FROM date_expression) |
td_quarter_begin |
DATE_TRUNC(date_expression, QUARTER)
|
td_quarter_end |
DATE_SUB( |
td_quarter_of_calendar |
(EXTRACT(YEAR FROM date_expression) |
td_quarter_of_year |
EXTRACT(QUARTER FROM date_expression) |
td_saturday |
DATE_TRUNC( |
td_sunday |
DATE_TRUNC( |
td_thursday |
DATE_TRUNC( |
td_tuesday |
DATE_TRUNC( |
td_wednesday |
DATE_TRUNC( |
td_week_begin |
DATE_TRUNC(date_expression, WEEK)
|
td_week_end |
DATE_SUB( |
td_week_of_calendar |
(EXTRACT(YEAR FROM date_expression) - 1900) * 52 + EXTRACT(WEEK FROM date_expression)
|
td_week_of_month |
EXTRACT(WEEK FROM date_expression) |
td_week_of_year |
EXTRACT(WEEK FROM date_expression) |
td_weekday_of_month |
CAST( |
td_year_begin |
DATE_TRUNC(date_expression, YEAR)
|
td_year_end |
DATE_SUB( |
td_year_of_calendar |
EXTRACT(YEAR FROM date_expression)
|
TO_DATE |
PARSE_DATE
|
TO_TIMESTAMP |
PARSE_TIMESTAMP
|
TO_TIMESTAMP_TZ |
PARSE_TIMESTAMP
|
Funciones de string
En la siguiente tabla, se muestran las funciones de string de Teradata junto con las funciones equivalentes de BigQuery. BigQuery ofrece las siguientes funciones de string adicionales:
BYTE_LENGTH
CODE_POINTS_TO_BYTES
ENDS_WITH
FROM_BASE32
FROM_BASE64
FROM_HEX
NORMALIZE
NORMALIZE_AND_CASEFOLD
REGEXP_CONTAINS
REGEXP_EXTRACT
REGEXP_EXTRACT_ALL
REPEAT
REPLACE
SAFE_CONVERT_BYTES_TO_STRING
SPLIT
STARTS_WITH
STRPOS
TO_BASE32
TO_BASE64
TO_CODE_POINTS
TO_HEX
Teradata | BigQuery |
---|---|
ASCII |
TO_CODE_POINTS(string_expression)[OFFSET(0)]
|
CHAR2HEXINT |
TO_HEX
|
CHARACTER LENGTH |
CHAR_LENGTH
|
CHARACTER LENGTH |
CHARACTER_LENGTH
|
CHR |
CODE_POINTS_TO_STRING( |
CONCAT, (|| operator) |
CONCAT, (|| operator)
|
CSV |
Función personalizada definida por el usuario. |
CSVLD |
Función personalizada definida por el usuario. |
FORMAT |
FORMAT
|
INDEX |
STRPOS(string, substring)
|
INITCAP |
INITCAP |
INSTR |
Función personalizada definida por el usuario. |
LEFT |
SUBSTR(source_string, 1, length)
|
LENGTH |
LENGTH
|
LOWER |
LOWER
|
LPAD |
LPAD
|
LTRIM |
LTRIM
|
NGRAM |
Función personalizada definida por el usuario. |
NVP |
Función personalizada definida por el usuario. |
OREPLACE |
REPLACE
|
OTRANSLATE |
Función personalizada definida por el usuario. |
POSITION |
STRPOS(string, substring)
|
REGEXP_INSTR |
STRPOS(source_string, Nota: Muestra el primer caso. |
REGEXP_REPLACE |
REGEXP_REPLACE |
REGEXP_SIMILAR |
IF(REGEXP_CONTAINS,1,0) |
REGEXP_SUBSTR |
REGEXP_EXTRACT, |
REGEXP_SPLIT_TO_TABLE |
Función personalizada definida por el usuario. |
REVERSE |
REVERSE
|
RIGHT |
SUBSTR(source_string, -1, length)
|
RPAD |
RPAD
|
RTRIM |
RTRIM
|
STRTOK Nota: Cada carácter en el argumento de string delimitador se considera un carácter delimitador independiente. El delimitador predeterminado es un carácter de espacio. |
SPLIT(instring, delimiter)[ORDINAL(tokennum)] Nota: El argumento de string delimitador completo se usa como único delimitador. El delimitador predeterminado es una coma. |
STRTOK_SPLIT_TO_TABLE |
Función personalizada definida por el usuario |
SUBSTRING , SUBSTR |
SUBSTR
|
TRIM |
TRIM
|
UPPER |
UPPER
|
Funciones matemáticas
En la siguiente tabla, se muestran las funciones matemáticas de Teradata junto con las funciones equivalentes de BigQuery. BigQuery ofrece las siguientes funciones matemáticas adicionales:
Teradata | BigQuery |
---|---|
ABS |
ABS |
ACOS |
ACOS |
ACOSH |
ACOSH |
ASIN |
ASIN |
ASINH |
ASINH |
ATAN |
ATAN |
ATAN2 |
ATAN2 |
ATANH |
ATANH |
CEILING |
CEIL |
CEILING |
CEILING |
COS |
COS |
COSH |
COSH |
EXP |
EXP |
FLOOR |
FLOOR |
GREATEST |
GREATEST |
LEAST |
LEAST |
LN |
LN |
LOG |
LOG |
MOD (Operador % ) |
MOD |
NULLIFZERO |
NULLIF(expression, 0) |
POWER (Operador ** ) |
POWER,
POW
|
RANDOM |
RAND |
ROUND |
ROUND |
SIGN |
SIGN |
SIN |
SIN |
SINH |
SINH |
SQRT |
SQRT |
TAN |
TAN |
TANH |
TANH |
TRUNC |
TRUNC |
ZEROIFNULL |
IFNULL(expression, 0),
COALESCE(expression, 0)
|
Sintaxis del DML
En esta sección, se abordan las diferencias que existen entre la sintaxis del lenguaje de administración de datos de Teradata y de BigQuery.
Declaración INSERT
La mayoría de las declaraciones INSERT
de Teradata son compatibles con BigQuery.
En la siguiente tabla, se muestran las excepciones.
Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Teradata. Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta la sección CREATE INDEX
en este documento.
Teradata | BigQuery |
---|---|
INSERT INTO table VALUES (...);
|
INSERT INTO
table (...) VALUES (...); Teradata ofrece una palabra clave DEFAULT para las columnas que no admiten valores nulos.Nota: En BigQuery, omitir los nombres de las columnas en la declaración INSERT solo funciona si los valores de todas las columnas de la tabla de destino se incluyen en orden ascendente según sus posiciones ordinales. |
INSERT INTO table VALUES (1,2,3);
|
INSERT INTO
table VALUES (1,2,3), Teradata tiene un modelo de solicitud de varias declaraciones (MSR), que envía varias declaraciones INSERT a la vez. En BigQuery, esto no se recomienda debido al límite de transacciones implícito entre las declaraciones.
En su lugar, usa el valor múltiple INSERT .BigQuery permite declaraciones INSERT simultáneas, pero podría poner en cola a la declaración UPDATE .
Para mejorar el rendimiento, considera los siguientes enfoques:
|
Declaración UPDATE
La mayoría de las declaraciones UPDATE
de Teradata son compatibles con BigQuery, excepto los siguientes elementos:
- Cuando usas una cláusula
FROM
, el orden de las cláusulasFROM
ySET
se invierte en Teradata y BigQuery. - En GoogleSQL, cada instrucción
UPDATE
debe incluir la palabra claveWHERE
, seguida de una condición. Para actualizar todas las filas de la tabla, usaWHERE true
.
Como práctica recomendada, debes agrupar varias transformaciones DML en lugar de declaraciones UPDATE
y INSERT
individuales. Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Teradata.
Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta la sección CREATE INDEX
en cualquier otra parte de este documento.
En la siguiente tabla, se muestran las declaraciones UPDATE
de Teradata y las declaraciones de BigQuery que realizan las mismas tareas.
Para obtener más información sobre UPDATE
en BigQuery, consulta los ejemplos de UPDATE
de BigQuery en la documentación del DML.
Teradata | BigQuery | |
---|---|---|
UPDATE table_A
|
UPDATE table_A
|
|
UPDATE table alias
|
UPDATE table
|
|
UPDATE table_A
|
UPDATE table_A
|
Declaraciones DELETE
y TRUNCATE
Las declaraciones DELETE
y TRUNCATE
son alternativas para quitar filas de una tabla sin afectar el esquema ni los índices de esta. TRUNCATE
no se usa en Teradata ni en BigQuery. Sin embargo, puedes usar declaraciones DELETE
para obtener el mismo resultado.
En BigQuery, la declaración DELETE
debe tener una cláusula WHERE
.
Para borrar todas las filas de la tabla (truncar), usa WHERE true
. Para acelerar las operaciones de truncamiento en tablas muy grandes, te recomendamos usar la declaración CREATE OR REPLACE TABLE ... AS SELECT
, mediante un LIMIT 0
en la misma tabla para que se reemplace. Sin embargo, asegúrate de agregar de forma manual la información de la partición y el agrupamiento en clústeres cuando la uses.
Teradata se deshace de las filas borradas más tarde. Esto significa que, al principio, las operaciones DELETE
son más rápidas que en BigQuery, pero requieren recursos más adelante, en especial las operaciones DELETE
a gran escala que afectan la mayor parte de una tabla. Para usar un enfoque similar en BigQuery, sugerimos reducir la cantidad de operaciones DELETE
, por ejemplo, mediante el copiado de las filas que no se borrarán en una tabla nueva. Como alternativa, puedes quitar particiones completas.
Ambas opciones están diseñadas para ser operaciones más rápidas que las transformaciones atómicas del DML.
Para obtener más información sobre DELETE
en BigQuery, consulta los ejemplos de DELETE
en la documentación del DML.
Teradata | BigQuery |
---|---|
BEGIN TRANSACTION;
|
El equivalente a una transacción es reemplazar el contenido de una tabla por el resultado de la consulta. Puedes hacerlo con una operación de consulta o una operación de copiado. Usa una operación de consulta:
bq query --replace --destination_table table_A 'SELECT * FROM table_B';
Usa una operación de copiado: bq cp -f table_A table_B |
DELETE database.table ALL; |
DELETE FROM table WHERE TRUE; Para tablas muy grandes, esta es una opción más rápida: CREATE OR REPLACE table AS SELECT * FROM table LIMIT 0; |
Declaración MERGE
La declaración MERGE
puede combinar declaraciones INSERT
, UPDATE
y DELETE
en una sola declaración “upsert” y realizar las operaciones de forma atómica. La operación MERGE
debe vincular como máximo una fila de origen con cada fila de destino.
BigQuery y Teradata siguen la sintaxis ANSI.
La operación MERGE
de Teradata se limita vincular las claves primarias en un procesador de módulo de acceso (AMP).
Por el contrario, BigQuery no tiene un límite de tamaño ni de columna para las operaciones MERGE
, por lo que usar MERGE
es una optimización útil. Sin embargo, si MERGE
implica una eliminación grande, consulta las optimizaciones para DELETE
en otra parte de este documento.
Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Teradata. Por ejemplo, las tablas SET de Teradata en modo de sesión pueden ignorar duplicados durante una operación MERGE
. Para obtener una descripción general del manejo de tablas MULTISET y SET, el aislamiento de instantáneas y el control de transacciones y sesiones, consulta la sección CREATE INDEX
de este documento.
Variables afectadas por filas
En Teradata, la variable ACTIVITY_COUNT
es una extensión de ANSI SQL de Teradata propagada con la cantidad de filas que afecta una declaración DML.
La variable de sistema @@row_count
en el scripting tiene funciona de manera similar.
En BigQuery, sería más común verificar el valor de retorno numDmlAffectedRows
en los registros de auditoría o en las vistas INFORMATION_SCHEMA
.
Sintaxis del DDL
En esta sección, se abordan las diferencias que existen entre la sintaxis del lenguaje de definición de datos en Teradata y en BigQuery.
Declaración CREATE TABLE
La mayoría de las declaraciones CREATE TABLE
de Teradata son compatibles con BigQuery, excepto los siguientes elementos de la sintaxis, que no se usan en BigQuery:
MULTISET
. Consulta la secciónCREATE INDEX
VOLATILE
. Consulta la sección Tablas temporales[NO] FALLBACK
Consulta la sección Reversión[NO] BEFORE JOURNAL
,[NO] AFTER JOURNAL
CHECKSUM = DEFAULT | val
DEFAULT MERGEBLOCKRATIO
PRIMARY INDEX (col, ...)
. Consulta la secciónCREATE INDEX
UNIQUE PRIMARY INDEX
. Consulta la secciónCREATE INDEX
CONSTRAINT
DEFAULT
IDENTITY
Para obtener más información sobre CREATE TABLE
en BigQuery, consulta los ejemplos de CREATE
de BigQuery en la documentación del DML.
Atributos y opciones de columnas
Las siguientes especificaciones de columna para la declaración CREATE TABLE
no se usan en BigQuery:
FORMAT 'format'
Consulta la sección Formato de tipos de TeradataCHARACTER SET name
. BigQuery siempre usa la codificación UTF-8[NOT] CASESPECIFIC
COMPRESS val | (val, ...)
Teradata extiende el estándar ANSI con una opción de columna TITLE
. Esta función se puede implementar de manera similar en BigQuery mediante la descripción de la columna, como se muestra en la siguiente tabla. Ten en cuenta que esta opción no está disponible para las vistas.
Teradata | BigQuery |
---|---|
CREATE TABLE table (
|
CREATE TABLE dataset.table (
|
Tablas temporales
Teradata admite tablas variables, que a menudo se usan para almacenar resultados intermedios en secuencias de comandos. Existen varias formas de lograr algo similar a las tablas variables en BigQuery:
CREATE TEMPORARY TABLE
se puede usar en el scripting y es válido durante la vida útil de la secuencia de comandos. Si la tabla debe seguir existiendo una vez terminada la vida útil de una secuencia de comandos, puedes usar las otras opciones de esta lista.TTL del conjunto de datos: Crea un conjunto de datos con un tiempo de actividad corto (por ejemplo, 1 hora) para que las tablas creadas en el conjunto de datos sean temporales, ya que no durarán más que el tiempo de actividad del conjunto de datos. Puedes poner prefijos en todos los nombres de las tablas de este conjunto de datos mediante
temp
para indicar con claridad que las tablas son temporales.TTL de la tabla: Crea una tabla que tenga un tiempo de actividad específico para la tabla mediante declaraciones del DDL similares a las siguientes:
CREATE TABLE temp.name (col1, col2, ...) OPTIONS(expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
Cláusula
WITH
: Si se necesita una tabla temporal solo dentro del mismo bloque, usa un resultado temporal mediante una declaración o subconsultaWITH
. Esta es la opción más eficiente.
Un patrón que se usa con frecuencia en las secuencias de comandos de Teradata (BTEQ) consiste en crear una tabla permanente, insertar un valor en ella, usarla como una tabla temporal en las declaraciones en curso y, luego, borrarla o truncarla.
En efecto, esto usa la tabla como una variable constante (un semáforo). Este enfoque no es eficiente en BigQuery y recomendamos usar variables reales en el scripting o usar CREATE OR REPLACE
con la sintaxis de consulta AS SELECT
para crear una tabla que ya tenga valores.
Declaración CREATE VIEW
En la siguiente tabla, se muestran equivalencias de la declaración CREATE VIEW
entre Teradata y BigQuery. Las cláusulas para el bloqueo de tablas, como LOCKING ROW FOR ACCESS
, no son necesarias dentro de BigQuery.
Teradata | BigQuery | Notas |
---|---|---|
CREATE VIEW view_name AS SELECT ...
|
CREATE VIEW
view_name AS SELECT ...
|
|
REPLACE VIEW view_name AS SELECT ...
|
CREATE OR REPLACE VIEW
|
|
No compatible |
CREATE VIEW IF NOT EXISTS
|
Crea una vista nueva solo si la vista no existe en el conjunto de datos especificado. |
Declaración CREATE [UNIQUE] INDEX
Teradata requiere índices para todas las tablas y soluciones especiales, como tablas MULTISET y NoPI Tables, para trabajar con datos que no sean únicos o no estén indexados.
BigQuery no requiere índices. En esta sección, se describen los enfoques en BigQuery para crear una funcionalidad similar al uso de los índices en Teradata, en la que existe una necesidad lógica empresarial real.
Indexa en favor del rendimiento
BigQuery no necesita índices explícitos, ya que es una base de datos orientada a columnas con optimización de consultas y almacenamiento. BigQuery proporciona funciones como la partición y el agrupamiento en clústeres, además de los campos anidados, que pueden aumentar la eficiencia y el rendimiento de las consultas mediante la optimización de la forma en que se almacenan los datos.
Teradata no admite vistas materializadas. Sin embargo, ofrece índices de unión mediante la declaración CREATE JOIN INDEX
, que materializa los datos necesarios para una unión. BigQuery no necesita índices materializados a fin de acelerar el rendimiento, del mismo modo que no necesita un espacio en cola dedicado para las uniones.
Para otros casos de optimización, se pueden usar vistas materializadas.
Indexa en favor de la coherencia (UNIQUE, PRIMARY INDEX)
En Teradata, se puede usar un índice único para evitar filas con claves que no sean únicas en una tabla. Si un proceso intenta insertar o actualizar datos que tienen un valor que ya está en el índice, la operación falla y muestra un incumplimiento del índice (tablas MULTISET) o ignora el proceso sin mostrar ningún aviso (tablas SET).
Debido a que BigQuery no proporciona índices explícitos, se puede usar una declaración MERGE
en su lugar para insertar solo registros únicos en una tabla de destino desde una tabla de etapa de pruebas y descartar los registros duplicados. Sin embargo, no hay forma de evitar que un usuario con permisos de edición inserte un registro duplicado, ya que BigQuery nunca se bloquea durante las operaciones INSERT
.
A fin de generar un error para los registros duplicados en BigQuery, puedes usar una declaración MERGE
desde una tabla de etapa de pruebas, como se muestra en el siguiente ejemplo.
Teradata | BigQuery | |
---|---|---|
CREATE [UNIQUE] INDEX name;
|
MERGE `prototype.FIN_MERGE` t
|
Por lo general, los usuarios prefieren quitar los duplicados de forma independiente para encontrar errores en los sistemas posteriores.
BigQuery no admite las columnas DEFAULT
ni IDENTITY
(secuencias).
Indexa en favor del bloqueo
Teradata proporciona recursos en el procesador del módulo de acceso (AMP); las consultas pueden consumir recursos de todos los AMP, de un solo AMP o de un grupo de AMP. Las declaraciones DDL son de todo el AMP y, por lo tanto, son similares a un bloqueo del DDL global.
BigQuery no tiene un mecanismo de bloqueo como este y puede ejecutar consultas simultáneas y declaraciones INSERT
según tu cuota. Solo las declaraciones DML UPDATE
simultáneas tienen ciertas implicaciones de simultaneidad: las operaciones UPDATE
en la misma partición se ponen en cola a fin de garantizar el aislamiento de instantáneas, por lo que no tienes que bloquearlas para evitar lecturas fantasma o actualizaciones perdidas.
Debido a estas diferencias, los siguientes elementos de Teradata no se usan en BigQuery:
ON COMMIT DELETE ROWS;
ON COMMIT PRESERVE ROWS;
Instrucciones de SQL de procedimiento
En esta sección, se describe cómo convertir las instrucciones de SQL de procedimiento que se usan en funciones, activadores y procedimientos almacenados de Teradata en scripting, procedimientos o funciones definidas por el usuario (UDF) de BigQuery.
Todo esto está disponible para que los administradores de sistemas lo verifiquen mediante las vistas INFORMATION_SCHEMA
.
Declaración CREATE PROCEDURE
Los procedimientos almacenados son compatibles con el scripting de BigQuery.
En BigQuery, el término scripting se refiere a cualquier uso de declaraciones de control, mientras que los procedimientos se denominan secuencias de comandos (con argumentos si es necesario) y se pueden llamar desde otras secuencias de comandos y almacenar de forma permanente, si se necesita. Una función definida por el usuario (UDF) también se puede escribir en JavaScript.
Teradata | BigQuery |
---|---|
CREATE PROCEDURE |
Usa
CREATE PROCEDURE si se requiere un nombre; de lo contrario, úsalo intercalado con BEGIN o en una sola línea con CREATE TEMP FUNCTION . |
REPLACE PROCEDURE |
CREATE OR REPLACE PROCEDURE |
CALL |
CALL |
En las siguientes secciones, se describen las maneras de convertir las declaraciones de procedimiento de Teradata existentes en declaraciones de scripting de BigQuery que funcionan de manera similar.
Declaración y asignación de variables
Las variables de BigQuery son válidas durante la vida útil de la secuencia de comandos.
Teradata | BigQuery |
---|---|
DECLARE |
DECLARE |
SET |
SET |
Controladores de condiciones de error
Teradata usa controladores en los códigos de estado de los procedimientos para el control de errores. En BigQuery, el control de errores es una función principal del flujo de control principal, similar a lo que proporcionan otros lenguajes con bloques TRY ... CATCH
.
Teradata | BigQuery |
---|---|
DECLARE EXIT HANDLER
FOR SQLEXCEPTION |
BEGIN ... EXCEPTION WHEN ERROR THEN |
SIGNAL sqlstate |
RAISE message |
DECLARE CONTINUE HANDLER
FOR SQLSTATE VALUE 23505; |
BigQuery no usa controladores de excepciones que se activan para ciertas condiciones de error. Recomendamos usar instrucciones ASSERT en las que las condiciones de salida se usan para las verificaciones previas o la depuración, ya que esto cumple con el ANSI SQL:2011. |
La variable SQLSTATE
en Teradata es similar a la variable del sistema @@error
en BigQuery. En BigQuery, es más común investigar errores mediante el registro de auditoría o las vistas INFORMATION_SCHEMA
.
Declaraciones y operaciones del cursor
Debido a que BigQuery no admite cursores ni sesiones, las siguientes declaraciones no se usan en BigQuery:
DECLARE cursor_name CURSOR [FOR | WITH] ...
PREPARE stmt_id FROM sql_str;
OPEN cursor_name [USING var, ...];
FETCH cursor_name INTO var, ...;
CLOSE cursor_name;
Instrucciones de SQL dinámicas
La función de secuencia de comandos en BigQuery admite instrucciones de SQL dinámicas como las que se muestran en la siguiente tabla.
Teradata | BigQuery |
---|---|
EXECUTE IMMEDIATE
sql_str; |
EXECUTE IMMEDIATE
sql_str; |
EXECUTE
stmt_id [USING var,...]; |
EXECUTE IMMEDIATE
stmt_id USING var; |
Las siguientes instrucciones de SQL dinámicas no se usan en BigQuery:
PREPARE stmt_id FROM sql_str;
Instrucciones de flujo de control
La función de scripting en BigQuery admite instrucciones de flujo de control como las que se muestran en la siguiente tabla.
Teradata | BigQuery |
---|---|
IF condition THEN stmts ELSE stmts END IF
|
IF condition THEN stmts ELSE stmts END IF |
label_name: LOOP stmts END LOOP label_name;
|
Las construcciones de bloque de estilo GOTO no se usan en BigQuery. Recomendamos que se vuelvan a escribir como funciones definidas por el usuario (UDF) o se usen instrucciones ASSERT en las que se usan para manejar errores.
|
REPEAT stmts UNTIL condition END REPEAT;
|
WHILE condition DO stmts END WHILE |
LEAVE outer_proc_label;
|
LEAVE no se usa para bloques de estilo GOTO; se usa como sinónimo de BREAK con el fin de dejar un bucle WHILE . |
LEAVE label;
|
LEAVE no se usa para bloques de estilo GOTO; se usa como sinónimo de BREAK con el fin de dejar un bucle WHILE . |
WITH RECURSIVE temp_table AS ( ... );
|
No se usan consultas recurrentes (también conocidas como expresiones de tabla comunes [CTE] recurrentes) en BigQuery. Se pueden volver a escribir con arreglos de UNION ALL . |
No se usan las siguientes instrucciones de flujo de control en BigQuery porque BigQuery no usa cursores ni sesiones:
Instrucciones de SQL de transacciones y metadatos
Teradata | BigQuery |
---|---|
HELP TABLE table_name;
HELP VIEW view_name;
|
SELECT La misma consulta es válida con el fin de obtener información de columnas para las vistas. Para obtener más información, consulta la vista de columnas en INFORMATION_SCHEMA de BigQuery. |
SELECT * FROM dbc.tables WHERE tablekind = 'T'; (Vista DBC de Teradata) |
SELECT Para obtener más información, consulta Introducción a BigQuery INFORMATION_SCHEMA . |
HELP STATISTICS table_name; |
APPROX_COUNT_DISTINCT(col) |
COLLECT STATS USING SAMPLE ON table_name column (...); |
No se usa en BigQuery. |
LOCKING TABLE table_name FOR EXCLUSIVE; |
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia en este documento. |
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ... |
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia en este documento. |
BEGIN TRANSACTION; |
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia en este documento. |
EXPLAIN ... |
No se usa en BigQuery. Las funciones similares son la explicación del plan de consultas en la IU web de BigQuery y la asignación de ranuras visible en las vistas INFORMATION_SCHEMA y en el registro de auditoría en Cloud Monitoring. |
Instrucciones de SQL de varias instrucciones y varias líneas
Teradata y BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten declaraciones separadas por punto y coma que se ejecutan juntas de manera coherente. Para obtener más información, consulta Transacciones de varias declaraciones.
Mensajes y códigos de error
Los códigos de error de Teradata y los de BigQuery son diferentes. BigQuery se basa en gran medida en códigos de estado HTTP y proporciona una API de REST, además de mensajes de error detallados.
Si la lógica de tu aplicación detecta los siguientes errores, intenta quitar la fuente del error, ya que BigQuery no mostrará los mismos códigos de error.
SQLSTATE = '02000'
: “Fila no encontrada”SQLSTATE = '21000'
: “Incumplimiento de la cardinalidad (Índice único)”SQLSTATE = '22000'
: “Incumplimiento de datos (Tipo de datos)”SQLSTATE = '23000'
: “Incumplimiento de restricción”
En BigQuery, sería más común usar las vistas INFORMATION_SCHEMA
o el registro de auditoría para desglosar los errores.
Para obtener información sobre cómo controlar los errores en el scripting, consulta las siguientes secciones.
Garantías de coherencia y aislamiento de transacción
Tanto Teradata como BigQuery son atómicos, es decir, cumplen con el estándar ACID en un nivel por transformación en muchas filas. Por ejemplo, una operación MERGE
es atómica por completo, incluso con varios valores insertados y actualizados.
Transacciones
Teradata proporciona nivel de aislamiento de lecturas no confirmadas (que permite lecturas no sincronizadas) o de transacciones serializables cuando se ejecuta en modo de sesión (en lugar de en modo de confirmación automática). En el mejor de los casos, Teradata logra un aislamiento estrictamente serializable mediante el bloqueo pesimista en el hash de una fila en todas las columnas de filas en todas las particiones. Los interbloqueos son posibles. DDL siempre aplica un límite de transacciones. Los trabajos FastLoad de Teradata se ejecutan de forma independiente, pero solo en tablas vacías.
BigQuery también admite transacciones.
BigQuery ayuda a garantizar el control de simultaneidad optimista (gana el primero en confirmarse) con el aislamiento de instantáneas, de modo que una consulta lea los últimos datos que se confirmaron antes de comenzar la consulta. Este enfoque garantiza el mismo nivel de coherencia por fila, por transformación y entre filas dentro de la misma declaración DML y evita los interbloqueos. En el caso de varias declaraciones UPDATE
en la misma tabla, BigQuery cambia al control de simultaneidad pesimista y pone en cola varias declaraciones UPDATE
; además se realizan reintentos de forma automática en caso de conflictos. Las declaraciones DML INSERT
y los trabajos de carga se pueden ejecutar de forma independiente y simultánea para agregar contenido a las tablas.
Revertir
Teradata admite dos modos de reversión de sesión: el modo de sesión de ANSI y el modo de sesión de Teradata (SET SESSION CHARACTERISTICS
y SET SESSION TRANSACTION
), según el modo de reversión que desees. En casos de falla, es posible que la transacción no se revierta.
BigQuery es compatible con la declaración ROLLBACK TRANSACTION
.
No hay una declaración ABORT
en BigQuery.
Límites de bases de datos
Siempre consulta la documentación pública de BigQuery para conocer las cuotas y los límites actuales. Para aumentar las cuotas de los usuarios de gran volumen, comunícate con el equipo de Asistencia de Cloud. En la siguiente tabla, se muestra una comparación de los límites de bases de datos de Teradata y BigQuery.
Límite | Teradata | BigQuery |
---|---|---|
Tablas por base de datos | Sin restricciones | Sin restricciones |
Columnas por tabla | 2,048 | 10,000 |
Tamaño máximo de fila | 1 MB | 100 MB |
Longitud del nombre de la columna y la tabla | 128 caracteres Unicode | 16,384 caracteres Unicode |
Filas por tabla | Ilimitado | Ilimitado |
Longitud máxima de la solicitud de SQL | 1 MB | 1 MB (extensión máxima sin resolver de la consulta de GoogleSQL) 12 MB (extensión máxima resuelta de la consulta de Google SQL y heredada) Transmisión:
|
Tamaño máximo de solicitudes y respuestas | 7 MB (solicitud) y 16 MB (respuesta) | 10 MB (solicitud) y 10 GB (respuesta) o casi sin límite si usas la paginación o la API de Cloud Storage |
Cantidad máxima de sesiones simultáneas | 120 por motor de análisis (PE) | 100 consultas simultáneas (se pueden generar con una reserva de ranura) y 300 solicitudes a la API simultáneas por usuario |
Cantidad máxima de cargas (rápidas) simultáneas | 30 (5 predeterminadas) | Sin límite de simultaneidad; los trabajos se ponen en cola. 100,000 trabajos de carga por proyecto por día |