Guía de traducción de SQL de Amazon Redshift
En este documento se detallan las similitudes y diferencias entre las sintaxis SQL de Amazon Redshift 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 en bloque o la traducción de SQL interactiva para traducir consultas ad hoc.
Esta guía está dirigida a arquitectos empresariales, administradores de bases de datos, desarrolladores de aplicaciones y especialistas en seguridad de TI. Se presupone que conoces Amazon Redshift.
Tipos de datos
En esta sección se muestran las equivalencias entre los tipos de datos de Amazon Redshift y BigQuery.
Amazon Redshift | BigQuery | Notas | |
---|---|---|---|
Data type (Dato) | Alias | Data type (Dato) | |
SMALLINT |
INT2 |
INT64 |
SMALLINT de Amazon Redshift ocupa 2 bytes, mientras que INT64 de BigQuery ocupa 8 bytes. |
INTEGER |
INT64 |
El tipo INTEGER de Amazon Redshift ocupa 4 bytes, mientras que el tipo INT64 de BigQuery ocupa 8 bytes. |
|
BIGINT |
INT8 |
INT64 |
Tanto BIGINT de Amazon Redshift como INT64 de BigQuery tienen 8 bytes. |
DECIMAL |
NUMERIC |
NUMERIC |
|
REAL |
FLOAT4 |
FLOAT64 |
El tipo REAL de Amazon Redshift ocupa 4 bytes, mientras que el tipo FLOAT64 de BigQuery ocupa 8 bytes. |
DOUBLE
PRECISION |
FLOAT64 |
||
BOOLEAN |
BOOL |
BOOL |
BOOLEAN de Amazon Redshift puede usar TRUE , t , true , y , yes y 1 como valores literales válidos para true. El tipo de datos BOOL de BigQuery usa un formato que no distingue entre mayúsculas y minúsculas.TRUE |
CHAR |
STRING |
||
VARCHAR |
STRING |
||
DATE |
DATE |
||
TIMESTAMP |
TIMESTAMP WITHOUT TIME ZONE |
DATETIME |
|
TIMESTAMPTZ |
TIMESTAMP |
Nota: En BigQuery, las zonas horarias se usan al analizar marcas de tiempo o al darles formato para mostrarlas. Una marca de tiempo con formato de cadena puede incluir una zona horaria, pero cuando BigQuery analiza la cadena, almacena la marca de tiempo en la hora UTC equivalente. Si no se especifica una zona horaria, se usa la zona horaria predeterminada, UTC. Se admiten nombres de zonas horarias o desfases con respecto a UTC con el formato (-|+)HH:MM, pero no se admiten abreviaturas de zonas horarias, como PDT. | |
GEOMETRY |
GEOGRAPHY |
Compatibilidad con las consultas de datos geoespaciales. |
BigQuery también tiene los siguientes tipos de datos que no tienen un análogo directo en Amazon Redshift:
Tipos de conversión implícita
Cuando migres a BigQuery, tendrás que convertir la mayoría de las conversiones implícitas de Amazon Redshift a conversiones explícitas de BigQuery, excepto en el caso de los siguientes tipos de datos, que BigQuery convierte implícitamente.
BigQuery realiza conversiones implícitas para los siguientes tipos de datos:
Tipo de BigQuery | Tipo de BigQuery |
---|---|
|
|
|
|
|
|
BigQuery también realiza conversiones implícitas para los siguientes literales:
Tipo de BigQuery | Tipo de BigQuery |
---|---|
STRING literal (por ejemplo, "2008-12-25") |
|
STRING literal (por ejemplo, "2008-12-25 15:30:00") |
|
STRING literal (por ejemplo, "2008-12-25T07:30:00") |
|
STRING literal (por ejemplo, "15:30:00") |
|
Tipos de conversión explícita
Puedes convertir los tipos de datos de Amazon Redshift que BigQuery no convierte implícitamente mediante la función CAST(expression AS type)
de BigQuery o cualquiera de las funciones de conversión DATE
y TIMESTAMP
.
Cuando migres tus consultas, cambia todas las instancias de la función CONVERT(type, expression)
de Amazon Redshift (o la sintaxis ::) por la función CAST(expression AS type)
de BigQuery, tal como se muestra en la tabla de la sección Funciones de formato de tipo de datos.
Sintaxis de consulta
En esta sección se abordan las diferencias en la sintaxis de las consultas entre Amazon Redshift y BigQuery.
SELECT
declaración
La mayoría de las instrucciones de Amazon Redshift
SELECT
son compatibles con BigQuery. En la siguiente tabla se muestra una lista de
diferencias menores.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
BigQuery también admite las siguientes expresiones en las instrucciones SELECT
, que no tienen un equivalente en Amazon Redshift:
Cláusula FROM
Una cláusula
FROM
de una consulta muestra las referencias de la tabla de la que se seleccionan los datos. En Amazon Redshift, las referencias de tabla posibles incluyen tablas, vistas y subconsultas. BigQuery admite todas estas referencias de tabla.
Se puede hacer referencia a las tablas de BigQuery en la cláusula FROM
con lo siguiente:
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
BigQuery también admite referencias de tabla adicionales:
- Versiones históricas de la definición de la tabla y de las filas mediante
FOR SYSTEM_TIME AS OF
. - Rutas de campo,
o cualquier ruta que se resuelva en un campo de un tipo de datos (como un
STRUCT
). - Matrices acopladas.
Tipos de JOIN
Tanto Amazon Redshift como BigQuery admiten los siguientes tipos de combinaciones:
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
y la unión cruzada implícita con comas equivalente.
En la siguiente tabla se muestra una lista de diferencias menores.
Amazon Redshift | BigQuery |
---|---|
|
Nota: En BigQuery, las cláusulas JOIN requieren una condición JOIN , a menos que la cláusula sea CROSS
JOIN o que una de las tablas combinadas sea un campo de un tipo de datos o una matriz. |
Cláusula WITH
Una cláusula BigQuery
WITH
contiene una o varias subconsultas con nombre que se ejecutan cuando una instrucción
SELECT
posterior hace referencia a ellas. Las cláusulas de Amazon Redshift
WITH
se comportan igual que las de BigQuery, con la excepción de que puedes evaluar la cláusula una vez y reutilizar sus resultados.
Operadores de conjuntos
Hay algunas diferencias menores entre los operadores de conjuntos de Amazon Redshift y los operadores de conjuntos de BigQuery . Sin embargo, todas las operaciones de conjunto que se pueden realizar en Amazon Redshift se pueden replicar en BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
Nota: Tanto BigQuery como Amazon Redshift admiten el operador |
|
|
|
|
|
|
|
Nota: BigQuery requiere paréntesis para separar las distintas operaciones de conjuntos. Si se repite el mismo operador de conjunto, no es necesario usar paréntesis. |
Cláusula ORDER BY
Hay algunas diferencias menores entre las cláusulas de Amazon Redshift
ORDER BY
y las de BigQuery
ORDER BY
.
Amazon Redshift | BigQuery |
---|---|
En Amazon Redshift, los NULL se clasifican en último lugar de forma predeterminada (orden ascendente). |
En BigQuery, los NULL se clasifican primero de forma predeterminada (en orden ascendente). |
|
Nota: BigQuery no usa la sintaxis LIMIT ALL , pero
ORDER BY ordena todas las filas de forma predeterminada, lo que da como resultado el
mismo comportamiento que la cláusula LIMIT ALL de Amazon Redshift. Te recomendamos que incluyas una cláusula LIMIT con cada cláusula ORDER BY . Ordenar todas las filas de resultados innecesariamente
reduce el rendimiento de la ejecución de las consultas. |
|
Nota: En BigQuery, OFFSET debe usarse junto con un LIMIT recuento. Asegúrate de definir el valor de count
INT64 en el número mínimo de filas ordenadas necesarias.
Ordenar todas las filas de resultados reduce innecesariamente el rendimiento de la ejecución de la consulta. |
Condiciones
En la siguiente tabla se muestran las condiciones de Amazon Redshift, o predicados, que son específicas de Amazon Redshift y deben convertirse a su equivalente de BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
|
|
|
Nota: BigQuery no admite caracteres de escape personalizados. Debes usar dos barras invertidas (\\) como caracteres de escape para BigQuery. |
|
Nota: Si se especifica NOT , envuelve la expresión anterior
IF en una expresión NOT como se muestra
a continuación:
|
|
|
Functions
En las siguientes secciones se enumeran las funciones de Amazon Redshift y sus equivalentes en BigQuery.
Funciones de agregación
En la siguiente tabla se muestran las asignaciones entre las funciones de agregación, agregación analítica y agregación aproximada de Amazon Redshift más habituales y sus equivalentes en BigQuery.
Amazon Redshift | BigQuery |
---|---|
APPROXIMATE
COUNT(DISTINCT expression) |
APPROX_COUNT_DISTINCT(expression) |
APPROXIMATE
PERCENTILE_DISC( |
APPROX_QUANTILES(expression,
100) |
AVG([DISTINCT] expression) |
AVG([DISTINCT] expression) |
COUNT(expression) |
COUNT(expression) |
LISTAGG( |
STRING_AGG( |
MAX(expression) |
MAX(expression) |
MEDIAN(median_expression) |
PERCENTILE_CONT( median_expression, 0.5
) OVER() |
MIN(expression) |
MIN(expression) |
PERCENTILE_CONT( |
PERCENTILE_CONT( Nota: No se incluyen casos prácticos de agregación. |
STDDEV([DISTINCT] expression) |
STDDEV([DISTINCT] expression) |
STDDEV_SAMP([DISTINCT] expression) |
STDDEV_SAMP([DISTINCT] expression) |
STDDEV_POP([DISTINCT] expression) |
STDDEV_POP([DISTINCT] expression) |
SUM([DISTINCT] expression) |
SUM([DISTINCT] expression) |
VARIANCE([DISTINCT] expression) |
VARIANCE([DISTINCT] expression) |
VAR_SAMP([DISTINCT] expression) |
VAR_SAMP([DISTINCT] expression) |
VAR_POP([DISTINCT] expression) |
VAR_POP([DISTINCT] expression) |
BigQuery también ofrece las siguientes funciones de agregación, de analíticas de agregación y de agregación aproximada, que no tienen una función análoga directa en Amazon Redshift:
ANY_VALUE
APPROX_TOP_COUNT
APPROX_TOP_SUM
ARRAY_AGG
ARRAY_CONCAT_AGG
COUNTIF
CORR
COVAR_POP
COVAR_SAMP
Funciones de agregación bit a bit
En la siguiente tabla se muestran las asignaciones entre las funciones de agregación bit a bit de Amazon Redshift más habituales y sus equivalentes en BigQuery.
Amazon Redshift | BigQuery |
---|---|
BIT_AND(expression) |
BIT_AND(expression) |
BIT_OR(expression) |
BIT_OR(expression) |
BOOL_AND>(expression) |
LOGICAL_AND(expression) |
BOOL_OR(expression) |
LOGICAL_OR(expression) |
BigQuery también ofrece la siguiente función de agregación bit a bit, que no tiene un análogo directo en Amazon Redshift:
Funciones de ventana
En la siguiente tabla se muestran las asignaciones entre las funciones de ventana comunes de Amazon Redshift y sus equivalentes en BigQuery. Las funciones de ventana de BigQuery incluyen: funciones de agregación analíticas, funciones de agregación, funciones de navegación y funciones de numeración.
Amazon Redshift | BigQuery |
---|---|
AVG(expression) OVER |
AVG(expression) OVER |
COUNT(expression) OVER |
COUNT(expression) OVER |
CUME_DIST() OVER |
CUME_DIST() OVER |
DENSE_RANK() OVER |
DENSE_RANK() OVER |
FIRST_VALUE(expression)
OVER |
FIRST_VALUE(expression)
OVER |
LAST_VALUE(expression) OVER |
LAST_VALUE(expression) OVER |
LAG(value_expr [, offset])
OVER |
LAG(value_expr [, offset])
OVER |
LEAD(value_expr [, offset])
OVER |
LEAD(value_expr [, offset])
OVER |
LISTAGG( |
STRING_AGG( |
MAX(expression) OVER |
MAX(expression) OVER |
MEDIAN(median_expression)
OVER |
PERCENTILE_CONT( |
MIN(expression) OVER |
MIN(expression) OVER |
NTH_VALUE(expression,
offset) OVER (
[PARTITION BY window_partition] [ORDER BY window_ordering
frame_clause]
) |
NTH_VALUE(expression,
offset) OVER |
NTILE(expr) OVER |
NTILE(expr) OVER |
PERCENT_RANK() OVER |
PERCENT_RANK() OVER |
PERCENTILE_CONT(percentile)
|
PERCENTILE_CONT(expr,
percentile) OVER |
PERCENTILE_DISC(percentile)
WITHIN GROUP (ORDER BY expr) OVER |
PERCENTILE_DISC(expr,
percentile) OVER |
RANK() OVER |
RANK() OVER |
RATIO_TO_REPORT(ratio_expression)
OVER |
ratio_expression SUM(ratio_expression) OVER |
ROW_NUMBER() OVER |
ROW_NUMBER() OVER |
STDDEV(expression) OVER |
STDDEV(expression) OVER |
STDDEV_SAMP(expression)
OVER |
STDDEV_SAMP(expression)
OVER |
STDDEV_POP(expression) OVER |
STDDEV_POP(expression) OVER |
SUM(expression) OVER |
SUM(expression) OVER |
VAR_POP(expression) OVER |
VAR_POP(expression) OVER |
VAR_SAMP(expression) OVER |
VAR_SAMP(expression) OVER |
VARIANCE(expression) OVER |
VARIANCE(expression) OVER |
Expresiones condicionales
En la siguiente tabla se muestran las asignaciones entre expresiones condicionales comunes de Amazon Redshift y sus equivalentes en BigQuery.
Amazon Redshift | BigQuery |
---|---|
CASEexpression |
CASE expression |
COALESCE(expression1[,
...]) |
COALESCE(expression1[,
...]) |
DECODE( |
CASE expression |
GREATEST(value [,
...]) |
GREATEST(value [,
...]) |
LEAST(value [, ...]) |
LEAST(value [, ...]) |
NVL(expression1[, ...])
|
COALESCE(expression1[,
...]) |
NVL2( |
IF( |
NULLIF(expression1,
expression2) |
NULLIF(expression1,
expression2) |
BigQuery también ofrece las siguientes expresiones condicionales, que no tienen un análogo directo en Amazon Redshift:
Funciones de fecha y hora
En la siguiente tabla se muestran las asignaciones entre las funciones de fecha y hora de Amazon Redshift más habituales y sus equivalentes en BigQuery. Las funciones de fecha y hora de BigQuery incluyen funciones de fecha, funciones de fecha y hora, funciones de hora y funciones de marca de tiempo.
Ten en cuenta que las funciones que parecen idénticas en Amazon Redshift y BigQuery pueden devolver tipos de datos diferentes.
Amazon Redshift | BigQuery |
---|---|
ADD_MONTHS( |
CAST( DATE_ADD( |
timestamptz_or_timestamp AT TIME
ZONE timezone |
PARSE_TIMESTAMP( Nota: Las zonas horarias se usan al analizar marcas de tiempo o al darles formato para mostrarlas. Una marca de tiempo con formato de cadena puede incluir una zona horaria, pero cuando BigQuery analiza la cadena, almacena la marca de tiempo en la hora UTC equivalente. Si no se especifica una zona horaria, se usa la zona horaria predeterminada, UTC. Se admiten nombres de zonas horarias o desfases con respecto al tiempo UTC (-HH:MM), pero no abreviaturas de zonas horarias (como PDT). |
CONVERT_TIMEZONE( |
PARSE_TIMESTAMP( Nota: source_timezone es UTC en BigQuery. |
CURRENT_DATE Nota: Devuelve la fecha de inicio de la transacción actual en la zona horaria de la sesión actual (UTC de forma predeterminada). |
CURRENT_DATE() Nota: Devuelve la fecha de inicio del extracto actual en la zona horaria UTC. |
DATE_CMP(date1, date2)
|
CASE |
DATE_CMP_TIMESTAMP(date1,
date2) |
CASE |
DATE_CMP_TIMESTAMPTZ(date,
timestamptz) |
CASE |
DATE_PART_YEAR(date) |
EXTRACT(YEAR FROM
date) |
DATEADD(date_part,
interval, date) |
CAST( |
DATEDIFF( |
DATE_DIFF( |
DATE_PART(date_part, date)
|
EXTRACT(date_part FROM
date) |
DATE_TRUNC('date_part',
timestamp) |
TIMESTAMP_TRUNC(timestamp,
date_part) |
EXTRACT(date_part FROM
timestamp) |
EXTRACT(date_part FROM
timestamp) |
GETDATE() |
PARSE_TIMESTAMP( |
INTERVAL_CMP( |
En Redshift, los intervalos tienen 360 días al año.
En BigQuery, puede usar la siguiente función definida por el usuario (UDF) para analizar un intervalo de Redshift y traducirlo a segundos. CREATE TEMP FUNCTION Para comparar literales de intervalo, haz lo siguiente: IF( |
LAST_DAY(date) |
DATE_SUB( |
MONTHS_BETWEEN( |
DATE_DIFF( |
NEXT_DAY(date, day) |
DATE_ADD( |
SYSDATE Nota: Devuelve la marca de tiempo de inicio de la transacción actual en la zona horaria de la sesión actual (UTC de forma predeterminada). |
CURRENT_TIMESTAMP() Nota: Devuelve la marca de tiempo de inicio de la instrucción actual en la zona horaria UTC. |
TIMEOFDAY() |
FORMAT_TIMESTAMP( |
TIMESTAMP_CMP( |
CASE |
TIMESTAMP_CMP_DATE( |
CASE |
TIMESTAMP_CMP_TIMESTAMPTZ(
Nota: Redshift compara las marcas de tiempo en la zona horaria definida por la sesión del usuario. La zona horaria predeterminada de las sesiones de usuario es UTC. |
CASE Nota: BigQuery compara las marcas de tiempo en la zona horaria UTC. |
TIMESTAMPTZ_CMP( Nota: Redshift compara las marcas de tiempo en la zona horaria definida por la sesión del usuario. La zona horaria predeterminada de las sesiones de usuario es UTC. |
CASE Nota: BigQuery compara las marcas de tiempo en la zona horaria UTC. |
TIMESTAMPTZ_CMP_DATE( Nota: Redshift compara las marcas de tiempo en la zona horaria definida por la sesión del usuario. La zona horaria predeterminada de las sesiones de usuario es UTC. |
CASE Nota: BigQuery compara las marcas de tiempo en la zona horaria UTC. |
TIMESTAMPTZ_CMP_TIMESTAMP(
Nota: Redshift compara las marcas de tiempo en la zona horaria definida por la sesión del usuario. La zona horaria predeterminada de las sesiones de usuario es UTC. |
CASE Nota: BigQuery compara las marcas de tiempo en la zona horaria UTC. |
TIMEZONE( |
PARSE_TIMESTAMP( Nota: Las zonas horarias se usan al analizar marcas de tiempo o al darles formato para mostrarlas. Una marca de tiempo con formato de cadena puede incluir una zona horaria, pero cuando BigQuery analiza la cadena, almacena la marca de tiempo en la hora UTC equivalente. Si no se especifica una zona horaria, se usa la zona horaria predeterminada, UTC. Se admiten nombres de zonas horarias o desfases con respecto a UTC (-HH:MM), pero no abreviaturas de zonas horarias (como PDT). |
TO_TIMESTAMP(timestamp,
format) |
PARSE_TIMESTAMP( Nota: BigQuery sigue otro conjunto de elementos de formato. Las zonas horarias se usan al analizar marcas de tiempo o al darles formato para mostrarlas. Una marca de tiempo con formato de cadena puede incluir una zona horaria, pero cuando BigQuery analiza la cadena, almacena la marca de tiempo en la hora UTC equivalente. Si no se especifica una zona horaria, se usa la zona horaria predeterminada, UTC. En la cadena de formato se admiten nombres de zonas horarias o desfases con respecto al tiempo UTC (-HH:MM), pero no abreviaturas de zonas horarias (como PDT). |
TRUNC(timestamp) |
CAST(timestamp AS
DATE) |
BigQuery también ofrece las siguientes funciones de fecha y hora, que no tienen un análogo directo en Amazon Redshift:
EXTRACT
DATE
DATE_SUB
DATE_ADD
(devuelve el tipo de datosDATE
)DATE_FROM_UNIX_DATE
FORMAT_DATE
PARSE_DATE
UNIX_DATE
DATETIME
DATETIME_ADD
DATETIME_SUB
DATETIME_DIFF
DATETIME_TRUNC
FORMAT_DATETIME
PARSE_DATETIME
CURRENT_TIME
TIME
TIME_ADD
TIME_SUB
TIME_DIFF
TIME_TRUNC
FORMAT_TIME
PARSE_TIME
TIMESTAMP_SECONDS
TIMESTAMP_MILLIS
TIMESTAMP_MICROS
UNIX_SECONDS
UNIX_MILLIS
UNIX_MICROS
Operadores matemáticos
En la siguiente tabla se muestran las asignaciones entre los operadores matemáticos comunes de Amazon Redshift y sus equivalentes en BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
|
|
Nota: Si el operador realiza una división entera (es decir, si X y Y son números enteros), se devuelve un número entero.Si el operador realiza una división no entera, se devuelve un valor no entero. |
Si es una división entera: CAST(FLOOR(X / Y) AS INT64)
Si no es una división entera:
Nota: La división en BigQuery devuelve un valor no entero. Para evitar errores en una operación de división (error de división entre cero), usa SAFE_DIVIDE(X, Y) o
IEEE_DIVIDE(X, Y) . |
|
Nota: Para evitar errores en una operación de división (error de división entre cero), usa SAFE.MOD(X, Y) . SAFE.MOD(X, 0) resultados en 0. |
|
Nota: A diferencia de Amazon Redshift, el operador ^ de BigQuery realiza una operación XOR bit a bit. |
|
Nota: Para evitar errores en una operación de raíz cuadrada (entrada negativa), usa SAFE.SQRT(X) . Si se introduce un valor negativo
con SAFE.SQRT(X) , se obtiene
NULL . |
|
Nota: La función POWER(X, Y) de BigQuery devuelve un error si X es un valor finito menor que 0 y Y no es un número entero. |
|
|
|
Nota: Este operador devuelve 0 o una secuencia de bytes b'\x00' si el segundo operando Y es mayor o igual que la longitud en bits del
primer operando X (por ejemplo, 64 si X tiene el tipo INT64). Este operador genera un error si Y es negativo. |
|
Nota: Desplaza el primer operando X hacia la derecha. Este operador no
hace una extensión de bits de signo con un tipo con signo (rellena los bits vacíos de la
izquierda con 0). Este operador devuelve 0 o una secuencia de bytes de b'\x00' si el segundo operando Y es mayor o igual que la longitud de bits del primer operando X (por ejemplo, 64 si X tiene el tipo
INT64). Este operador devuelve un error si Y es negativo. |
|
|
|
|
|
|
BigQuery también ofrece el siguiente operador matemático, que no tiene un análogo directo en Amazon Redshift:
X ^ Y
(XOR a nivel de bits)
Funciones matemáticas
Amazon Redshift | BigQuery |
---|---|
ABS(number) |
ABS(number) |
ACOS(number) |
ACOS(number) |
ASIN(number) |
ASIN(number) |
ATAN(number) |
ATAN(number) |
ATAN2(number1,
number2) |
ATAN2(number1,
number2) |
CBRT(number) |
POWER(number, 1/3) |
CEIL(number) |
CEIL(number) |
CEILING(number) |
CEILING(number) |
CHECKSUM(expression) |
FARM_FINGERPRINT(expression)
|
COS(number) |
COS(number) |
COT(number) |
1/TAN(number) |
DEGREES(number) |
number *180/ACOS(-1) |
DEXP(number) |
EXP(number) |
DLOG1(number) |
LN(number) |
DLOG10(number) |
LOG10(number) |
EXP(number) |
EXP(number) |
FLOOR(number) |
FLOOR(number) |
LNnumber) |
LN(number) |
LOG(number) |
LOG10(number) |
MOD(number1, number2) |
MOD(number1, number2) |
PI |
ACOS(-1) |
POWER(expression1,
expression2) |
POWER(expression1,
expression2) |
RADIANS(number) |
ACOS(-1)*(number/180) |
RANDOM() |
RAND() |
ROUND(number [,
integer]) |
ROUND(number [,
integer]) |
SIN(number) |
SIN(number) |
SIGN(number) |
SIGN(number) |
SQRT(number) |
SQRT(number) |
TAN(number) |
TAN(number) |
TO_HEX(number) |
FORMAT('%x', number) |
TRUNC(number [,
integer])+-+++ |
TRUNC(number [, integer])
|
Funciones de cadena
Amazon Redshift | BigQuery |
---|---|
string1 || string2 |
CONCAT(string1,
string2) |
BPCHARCMP(string1,
string2) |
CASE |
BTRIM(string [,
matching_string]) |
TRIM(string [,
matching_string]) |
BTTEXT_PATTERN_CMP(string1,
string2) |
CASE |
CHAR_LENGTH(expression) |
CHAR_LENGTH(expression) |
CHARACTER_LENGTH(expression) |
CHARACTER_LENGTH(expression) |
CHARINDEX(substring,
string) |
STRPOS(string, substring)
|
CHR(number) |
CODE_POINTS_TO_STRING([number])
|
CONCAT(string1,
string2) |
CONCAT(string1,
string2) Nota: La función CONCAT (...) de BigQuery admite la concatenación de cualquier número de cadenas. |
CRC32 |
Función personalizada definida por el usuario |
FUNC_SHA1(string) |
SHA1(string) |
INITCAP |
INITCAP |
LEFT(string, integer) |
SUBSTR(string, 0, integer)
|
RIGHT(string, integer)
|
SUBSTR(string,
-integer) |
LEN(expression) |
LENGTH(expression) |
LENGTH(expression) |
LENGTH(expression) |
LOWER(string) |
LOWER(string) |
LPAD(string1, length[,
string2]) |
LPAD(string1, length[,
string2]) |
RPAD(string1, length[,
string2]) |
RPAD(string1, length[,
string2]) |
LTRIM(string,
trim_chars) |
LTRIM(string,
trim_chars) |
MD5(string) |
MD5(string) |
OCTET_LENGTH(expression) |
BYTE_LENGTH(expression) |
POSITION(substring IN
string) |
STRPOS(string,
substring) |
QUOTE_IDENT(string) |
CONCAT('"',string,'"') |
QUOTE_LITERAL(string) |
CONCAT("'",string,"'")
|
REGEXP_COUNT(
source_string, pattern |
ARRAY_LENGTH( REGEXP_EXTRACT_ALL( Si se especifica position : ARRAY_LENGTH( REGEXP_EXTRACT_ALL( Nota: BigQuery ofrece compatibilidad con expresiones regulares mediante la biblioteca re2 . Consulte la documentación para ver la sintaxis de las expresiones regulares. |
REGEXP_INSTR( |
IFNULL( STRPOS( Si se especifica source_string : REGEXP_REPLACE( Si se especifica position :IFNULL( STRPOS( Si se especifica occurrence :IFNULL( STRPOS( Nota: BigQuery ofrece compatibilidad con expresiones regulares mediante la biblioteca re2
. Consulte la documentación para ver la sintaxis de las expresiones regulares . |
REGEXP_REPLACE(
source_string, |
REGEXP_REPLACE( Si se especifica source_string :
REGEXP_REPLACE( Si se especifica position :CASE |
REGEXP_SUBSTR(
source_string, pattern |
REGEXP_EXTRACT( Si se especifica position :REGEXP_EXTRACT( Si se especifica occurrence :REGEXP_EXTRACT_ALL( Nota: BigQuery ofrece compatibilidad con expresiones regulares mediante la biblioteca re2 . Consulte la documentación de esa biblioteca para ver la sintaxis de las expresiones regulares.
|
REPEAT(string,
integer) |
REPEAT(string,
integer) |
REPLACE(string, old_chars,
new_chars) |
REPLACE(string, old_chars,
new_chars) |
REPLICA(string,
integer) |
REPEAT(string,
integer) |
REVERSE(expression) |
REVERSE(expression) |
RTRIM(string,
trim_chars) |
RTRIM(string,
trim_chars) |
SPLIT_PART(string,
delimiter, part) |
SPLIT( |
STRPOS(string,
substring) |
STRPOS(string,
substring) |
STRTOL(string, base) |
|
SUBSTRING( |
SUBSTR( |
TEXTLEN(expression) |
LENGTH(expression) |
TRANSLATE( |
Se puede implementar mediante funciones definidas por el usuario: CREATE TEMP FUNCTION |
TRIM([BOTH] string) |
TRIM(string) |
TRIM([BOTH] characters FROM
string) |
TRIM(string, characters)
|
UPPER(string) |
UPPER(string) |
Funciones de formato de tipos de datos
Amazon Redshift | BigQuery |
---|---|
CAST(expression AS type) |
CAST(expression AS type) |
expression ::
type |
CAST(expression AS type) |
CONVERT(type, expression) |
CAST(expression AS type) |
TO_CHAR(
|
FORMAT_TIMESTAMP( Nota: BigQuery y Amazon Redshift difieren en la forma de especificar una cadena de formato para timestamp_expression . |
TO_CHAR(
|
FORMAT( Nota: BigQuery y Amazon Redshift difieren en la forma de especificar una cadena de formato para timestamp_expression .
|
TO_DATE(date_string, format) |
PARSE_DATE(date_string, format)
Nota: BigQuery y Amazon Redshift difieren en la forma de especificar una cadena de formato para date_string . |
TO_NUMBER(string, format) |
CAST( Nota: BigQuery y Amazon Redshift difieren en la forma de especificar una cadena de formato numérico. |
BigQuery también admite SAFE_CAST
(expression
AS typename)
, que devuelve NULL
si BigQuery no puede realizar una conversión. Por ejemplo, SAFE_CAST
("apple"
AS INT64)
devuelve NULL
.
Sintaxis de DML
En esta sección se abordan las diferencias en la sintaxis del lenguaje de gestión de datos entre Amazon Redshift y BigQuery.
INSERT
declaración
Amazon Redshift ofrece una palabra clave DEFAULT
configurable para las columnas. En BigQuery, el valor DEFAULT
de las columnas que admiten valores nulos es NULL
, y DEFAULT
no se admite en las columnas obligatorias. La mayoría de las instrucciones de Amazon RedshiftINSERT
son compatibles con BigQuery. En la siguiente tabla se muestran las excepciones.
Amazon Redshift | BigQuery |
---|---|
INSERT INTO table (column1 [, ...]) |
INSERT [INTO] table (column1 [, ...]) |
INSERT INTO table (column1, [,...]) VALUES ( |
INSERT [INTO] table (column1, [,...]) |
BigQuery también admite la inserción de valores mediante una subconsulta (donde uno de los valores se calcula mediante una subconsulta), lo que no se admite en Amazon Redshift. Por ejemplo:
INSERT INTO table (column1, column2)
VALUES ('value_1', (
SELECT column2
FROM table2
))
COPY
declaración
El comando COPY
de Amazon Redshift
carga datos en una tabla desde archivos de datos o desde una tabla de Amazon DynamoDB.
BigQuery no usa el comando SQL COPY
para cargar datos, pero puedes usar varias herramientas y opciones que no son de SQL para cargar datos en tablas de BigQuery.
También puedes usar los receptores de la canalización de datos que se proporcionan en Apache Spark o Apache Beam para escribir datos en BigQuery.
UPDATE
declaración
La mayoría de las instrucciones de UPDATE
de Amazon Redshift son compatibles con BigQuery. En la siguiente tabla se muestran las excepciones.
Amazon Redshift | BigQuery |
---|---|
UPDATE table |
UPDATE table Nota: Todas las instrucciones UPDATE de BigQuery requieren la palabra clave WHERE ,
seguida de una condición. |
UPDATE table |
UPDATE table Nota: El comando UPDATE de BigQuery no admite valores DEFAULT .
Si la instrucción UPDATE de Amazon Redshift no incluye una cláusula WHERE , la instrucción UPDATE de BigQuery debe estar condicionada WHERE TRUE . |
DELETE
y TRUNCATE
Las instrucciones DELETE
y TRUNCATE
son dos formas de eliminar filas de una tabla
sin afectar al esquema ni a los índices de la tabla.
En Amazon Redshift, se recomienda usar la instrucción TRUNCATE
en lugar de una instrucción DELETE
sin calificar, ya que es más rápida y no requiere operaciones VACUUM
y ANALYZE
después.
Sin embargo, puede usar las instrucciones DELETE
para conseguir el mismo efecto.
En BigQuery, la instrucción DELETE
debe tener una cláusula WHERE
. Para obtener más información sobre DELETE
en BigQuery, consulta los DELETE
ejemplos
de BigQuery en la documentación de DML.
Amazon Redshift | BigQuery |
---|---|
DELETE
[FROM] table_name TRUNCATE
[TABLE] table_name |
DELETE FROM table_name Las instrucciones de DELETE de BigQuery requieren una
cláusula WHERE . |
DELETE FROM table_name |
DELETE FROM table_name DELETE FROM table_name En Amazon Redshift, USING permite hacer referencia a tablas adicionales en la cláusula WHERE . Esto se puede hacer en BigQuery usando una subconsulta en la cláusula WHERE . |
MERGE
declaración
La instrucción MERGE
puede combinar operaciones INSERT
, UPDATE
y DELETE
en una sola instrucción upsert y realizar las operaciones de forma atómica. La operación MERGE
debe coincidir con una fila de origen como máximo por cada fila de destino.
Amazon Redshift no admite un solo comando MERGE
. Sin embargo, se puede realizar una
operación de combinación
en Amazon Redshift realizando operaciones INSERT
, UPDATE
y DELETE
en una transacción.
Operación de combinación que sustituye las filas
En Amazon Redshift, se pueden sobrescribir todas las columnas de la tabla de destino mediante una instrucción DELETE
y, a continuación, una instrucción INSERT
. La instrucción DELETE
elimina las filas que se deben actualizar y, a continuación, la instrucción INSERT
inserta las filas actualizadas. Las tablas de BigQuery están limitadas a 1000 instrucciones DML al día, por lo que debes consolidar las instrucciones INSERT
, UPDATE
y DELETE
en una sola instrucción MERGE
, tal como se muestra en la siguiente tabla.
Amazon Redshift | BigQuery |
---|---|
Consulta cómo realizar una operación de combinación sustituyendo filas ya existentes. CREATE TEMP TABLE temp_table; |
MERGE target Nota: Deben incluirse todas las columnas si se van a actualizar todas. |
Consulte Combinar datos especificando una lista de columnas. CREATE TEMP TABLE temp_table; |
MERGE target |
Sintaxis de DDL
En esta sección se abordan las diferencias en la sintaxis del lenguaje de definición de datos entre Amazon Redshift y BigQuery.
SELECT INTO
declaración
En Amazon Redshift, la instrucción SELECT INTO
se puede usar para insertar los resultados de una consulta en una tabla nueva, combinando la creación de la tabla y la inserción.
Amazon Redshift | BigQuery |
---|---|
SELECT expression, ... INTO table |
INSERT table |
WITH subquery_table AS ( SELECT ... |
INSERT table |
SELECT expression |
BigQuery ofrece varias formas de emular tablas temporales. Para obtener más información, consulta la sección sobre tablas temporales. |
CREATE TABLE
declaración
La mayoría de las instrucciones de Amazon Redshift
CREATE TABLE
son compatibles con BigQuery, excepto los siguientes elementos de sintaxis, que no se usan en BigQuery:
Amazon Redshift | BigQuery |
---|---|
CREATE TABLE table_name ( Nota: Las restricciones UNIQUE y PRIMARY KEY son informativas y no las aplica el sistema Amazon Redshift. |
CREATE TABLE table_name ( |
CREATE TABLE table_name Nota: Las restricciones UNIQUE y PRIMARY KEY son informativas y no las aplica el sistema de Amazon Redshift.
|
CREATE TABLE table_name Nota: BigQuery no usa restricciones de tabla UNIQUE , PRIMARY KEY ni FOREIGN KEY . Para conseguir una optimización similar a la que proporcionan estas restricciones durante la ejecución de las consultas, crea particiones y clústeres en tus tablas de BigQuery. CLUSTER BY admite hasta 4 columnas. |
CREATE TABLE table_name |
Consulta este ejemplo para saber cómo usar las tablas INFORMATION_SCHEMA para copiar nombres de columnas, tipos de datos y restricciones NOT NULL en una tabla nueva. |
CREATE TABLE table_name Nota: En Amazon Redshift, se especifica el ajuste BACKUP
NO para ahorrar tiempo de procesamiento y reducir el espacio de almacenamiento. |
La opción de tabla BACKUP NO no se usa ni es necesaria porque BigQuery mantiene automáticamente hasta 7 días de versiones históricas de todas tus tablas sin que esto afecte al tiempo de procesamiento ni al almacenamiento facturado.
|
CREATE TABLE table_name |
BigQuery admite el agrupamiento en clústeres, que permite almacenar claves en orden ordenado. |
CREATE TABLE table_name |
CREATE TABLE table_name |
CREATE TABLE IF NOT EXISTS table_name ... |
CREATE TABLE IF NOT EXISTS |
BigQuery también admite la instrucción DDL CREATE OR REPLACE TABLE
,
que sobrescribe una tabla si ya existe.
La instrucción CREATE TABLE
de BigQuery también admite las siguientes cláusulas, que no tienen un equivalente en Amazon Redshift:
Para obtener más información sobre CREATE TABLE
en BigQuery, consulta los CREATE TABLE
ejemplos
de BigQuery en la documentación de DML.
Tablas temporales
Amazon Redshift admite tablas temporales, que solo se pueden ver en la sesión actual. Hay varias formas de emular tablas temporales en BigQuery:
- TTL del conjunto de datos: crea un conjunto de datos con un tiempo de vida breve (por ejemplo, una hora) para que las tablas creadas en el conjunto de datos sean temporales, ya que no se conservarán más tiempo que el tiempo de vida del conjunto de datos. Puedes añadir el prefijo temp a todos los nombres de las tablas de este conjunto de datos para indicar claramente que son temporales.
TTL de tabla: crea una tabla que tenga un tiempo de vida breve específico de la tabla mediante declaraciones de DDL similares a las siguientes:
CREATE TABLE temp.name (col1, col2, ...) OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
CREATE VIEW
declaración
En la siguiente tabla se muestran las equivalencias entre Amazon Redshift y BigQuery para la instrucción CREATE VIEW
.
Amazon Redshift | BigQuery |
---|---|
CREATE VIEW view_name AS SELECT ... code> |
CREATE VIEW view_name AS SELECT
... |
CREATE OR REPLACE VIEW view_name AS SELECT ... |
CREATE OR REPLACE VIEW |
CREATE VIEW view_name |
CREATE VIEW view_name AS SELECT
... |
No es compatible. | CREATE VIEW IF NOT EXISTS c
view_name Crea una vista solo si no existe en el conjunto de datos especificado. |
CREATE VIEW view_name En Amazon Redshift, se necesita una vista de enlace tardío para hacer referencia a una tabla externa. |
En BigQuery, para crear una vista, todos los objetos referenciados deben existir. BigQuery te permite consultar fuentes de datos externas. |
Funciones definidas por el usuario (UDF)
Una función definida por el usuario te permite crear funciones para operaciones personalizadas. Estas funciones aceptan columnas de entrada, realizan acciones y devuelven el resultado de esas acciones como un valor.
Tanto Amazon Redshift como BigQuery admiten funciones definidas por el usuario mediante expresiones SQL. Además, en Amazon Redshift puedes crear una UDF basada en Python, y en BigQuery puedes crear una UDF basada en JavaScript.
Consulta el repositorio de GitHub de utilidades de Google Cloud BigQuery para ver una biblioteca de UDFs de BigQuery comunes.
Sintaxis de CREATE FUNCTION
En la siguiente tabla se muestran las diferencias en la sintaxis de creación de funciones definidas por el usuario de SQL entre Amazon Redshift y BigQuery.
Amazon Redshift | BigQuery |
---|---|
CREATE [OR
REPLACE] FUNCTION |
CREATE [OR REPLACE] FUNCTION Nota: En una UDF de SQL de BigQuery, el tipo de datos devuelto es opcional. BigQuery deduce el tipo de resultado de la función a partir del cuerpo de la función SQL cuando una consulta llama a la función. |
CREATE [OR
REPLACE] FUNCTION |
CREATE [OR REPLACE] FUNCTION Nota: La volatilidad de las funciones no es un parámetro configurable en BigQuery. Toda la volatilidad de las funciones definidas por el usuario de BigQuery es equivalente a la volatilidad de IMMUTABLE de Amazon Redshift (es decir, no realiza búsquedas en la base de datos ni usa información que no esté presente directamente en su lista de argumentos).
|
CREATE [OR
REPLACE] FUNCTION Nota: Amazon Redshift solo admite una cláusula SQL SELECT como definición de función. Además, la cláusula SELECT no puede incluir ninguna de las cláusulas FROM,
INTO, WHERE, GROUP BY, ORDER BY, ni LIMIT . |
CREATE [OR REPLACE] FUNCTION Nota: BigQuery admite cualquier expresión SQL como definición de función. Sin embargo, no se admite hacer referencia a tablas, vistas o modelos. |
CREATE [OR
REPLACE] FUNCTION |
CREATE [OR REPLACE] FUNCTION
function_name ([sql_arg_name sql_arg_data_type[,..]]) RETURNS
data_type AS sql_function_definition Nota: No es necesario especificar el literal de idioma en una función definida por el usuario de GoogleSQL. BigQuery interpreta la expresión SQL de forma predeterminada. También se usa la comilla de dólar de Amazon Redshift ( $$ ) is not supported in BigQuery. |
CREATE [OR
REPLACE] FUNCTION function_name (integer, integer) RETURNS
integer IMMUTABLE AS $$ SELECT $1 + $2 $$ LANGUAGE sql |
CREATE [OR REPLACE] FUNCTION Note: BigQuery UDFs require all input arguments to be named. The Amazon Redshift argument variables ( $1 , $2 , …) are not supported in
BigQuery. |
CREATE [OR
REPLACE] FUNCTION Note: Amazon Redshift does not support ANY TYPE for SQL UDFs. However, it
supports using the ANYELEMENT
data type in Python-based UDFs. |
CREATE [OR REPLACE] FUNCTION Note: BigQuery supports using ANY TYPE as argument type. The function
accepts an input of any type for this argument. For more information,
see templated parameter in BigQuery.
|
BigQuery also supports the CREATE FUNCTION IF NOT EXISTS
statement, which
treats the query as successful and takes no action if a function with the same
name already exists.
BigQuery's CREATE FUNCTION
statement also supports creating
TEMPORARY
or TEMP
functions, which do not have an Amazon Redshift equivalent.
See calling UDFs for details on executing a BigQuery-persistent UDF.
DROP FUNCTION
syntax
The following table addresses differences in DROP FUNCTION
syntax between
Amazon Redshift and BigQuery.
Amazon Redshift | BigQuery |
---|---|
DROP
FUNCTION |
DROP FUNCTION Note: BigQuery does not require using the function's signature for deleting the function. Also, removing function dependencies is not supported in BigQuery. |
BigQuery also supports the
DROP FUNCTION IF EXISTS
statement,
which deletes the function only if the function exists in the specified
dataset.
BigQuery requires that you specify the project_name
if the function is not located in the current project.
UDF components
This section highlights the similarities and differences in UDF components between Amazon Redshift andBigQuery.
Component | Amazon Redshift | BigQuery |
---|---|---|
Name | Amazon Redshift recommends using the prefix
_f for function names to avoid conflicts with existing
or future built-in SQL function names. |
In BigQuery, you can use any custom function name. |
Arguments | Arguments are optional. You can use name and data types for Python
UDF arguments and only data types for SQL UDF arguments. In SQL UDFs,
you must refer to arguments using $1 , $2 ,
and so on. Amazon Redshift also restricts
the number of arguments to 32. |
Arguments are optional, but if you specify arguments, they must use both name and data types for both JavaScript and SQL UDFs. The maximum number of arguments for a persistent UDF is 256. |
Data type | Amazon Redshift supports a different set of data types for SQL
and Python UDFs. For a Python UDF, the data type might also be ANYELEMENT .You must specify a RETURN data type for both SQL and
Python UDFs.See Data types in this document for equivalents between data types in Amazon Redshift and in BigQuery. |
BigQuery supports a different set of data types for SQL and JavaScript UDFs. For a SQL UDF, the data type might also be ANY TYPE . For
more information, see templated parameters in
BigQuery.The RETURN data type is optional for SQL UDFs.See Supported JavaScript UDF data types for information on how BigQuery data types map to JavaScript data types. |
Definition | For both SQL and Python UDFs, you must enclose the function
definition using dollar quoting, as in a pair of dollar signs
($$ ) para indicar el inicio y el final de las instrucciones de la función.En el caso de las UDFs de SQL,Amazon Redshift solo admite una SELECT cláusula SQL
como definición de función. Además, la cláusula SELECT no puede incluir ninguna de las cláusulas FROM , INTO , WHERE , GROUP , BY , ORDER BY y LIMIT
.En el caso de las UDFs de Python, puedes escribir un programa de Python con la biblioteca estándar de Python 2.7 o importar tus módulos personalizados creando uno con el comando CREATE
LIBRARY . |
En BigQuery, debes incluir el código JavaScript entre comillas. Consulta las reglas de presupuestos para obtener más información. En el caso de las FDUs de SQL, puedes usar cualquier expresión SQL como definición de la función. Sin embargo, BigQuery no admite referencias a tablas, vistas ni modelos. En el caso de las funciones definidas por el usuario de JavaScript, puedes incluir bibliotecas de código externo directamente mediante la sección OPTIONS . También puedes usar la herramienta de prueba de UDFs de BigQuery para probar tus funciones. |
Idioma | Debes usar el literal LANGUAGE para especificar el idioma como sql en el caso de las funciones definidas por el usuario de SQL o plpythonu
en el caso de las funciones definidas por el usuario de Python. |
No es necesario especificar LANGUAGE en las FDU de SQL, pero sí debes especificar el lenguaje como js en las FDU de JavaScript. |
Estado | Amazon Redshift no admite la creación de UDFs temporales. Amazon Redshift ofrece la opción de definir la volatilidad de una función mediante literales VOLATILE , STABLE o IMMUTABLE . El optimizador de consultas la usa para la optimización. |
BigQuery admite funciones definidas por el usuario persistentes y temporales. Las FDUs persistentes se pueden reutilizar en varias consultas, mientras que las FDUs temporales solo se pueden usar en una consulta. La volatilidad de las funciones no es un parámetro configurable en BigQuery. Toda la volatilidad de las UDF de BigQuery es equivalente a la IMMUTABLE
volatilidad de Amazon Redshift. |
Seguridad y privilegios | Para crear una UDF, debes tener permiso para usar el lenguaje de SQL o plpythonu (Python). De forma predeterminada, se concede USAGE ON LANGUAGE SQL a PUBLIC , pero debes conceder USAGE ON LANGUAGE PLPYTHONU
explícitamente a usuarios o grupos específicos.Además, debes ser superusuario para sustituir una función definida por el usuario. |
En BigQuery, no es necesario conceder permisos explícitos para crear o eliminar ningún tipo de UDF. Cualquier usuario al que se le haya asignado el rol Editor de datos de BigQuery (que tenga bigquery.routines.* como uno de los permisos) puede crear o eliminar funciones del conjunto de datos especificado.BigQuery también permite crear roles personalizados. Esto se puede gestionar con Cloud IAM. |
Límites | Consulta los límites de las UDFs de Python. | Consulta los límites de las funciones definidas por el usuario. |
Declaraciones SQL de metadatos y transacciones
Amazon Redshift | BigQuery |
---|---|
SELECT * FROM STL_ANALYZE WHERE name |
No se usa en BigQuery. No es necesario recoger estadísticas para mejorar el rendimiento de las consultas. Para obtener información sobre la distribución de tus datos, puedes usar funciones de agregación aproximada. |
ANALYZE
[[ table_name[(column_name |
No se usa en BigQuery. |
LOCK
TABLE table_name; |
No se usa en BigQuery. |
BEGIN
TRANSACTION; SELECT ... |
BigQuery usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia. |
EXPLAIN
... |
No se usa en BigQuery. Las funciones similares son la explicación del plan de consulta en la consola de BigQuery Google Cloud y el registro de auditoría en Cloud Monitoring. |
SELECT * FROM SVV_TABLE_INFO WHERE |
SELECT * EXCEPT(is_typed) FROM Para obtener más información, consulta la introducción a BigQuery INFORMATION_SCHEMA . |
VACUUM
[table_name] |
No se usa en BigQuery. Las tablas agrupadas de BigQuery se ordenan automáticamente. |
Instrucciones SQL de varias líneas y con varias instrucciones
Tanto Amazon Redshift como BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten instrucciones separadas por puntos y comas que se ejecutan de forma coherente. Para obtener más información, consulta el artículo sobre las transacciones con varias declaraciones.
Declaraciones SQL procedimentales
CREATE PROCEDURE
declaración
Amazon Redshift | BigQuery |
---|---|
CREATE or
REPLACE PROCEDURE |
CREATE PROCEDURE si es necesario indicar un nombre.De lo contrario, úsalo en línea con BEGIN o en una sola línea con CREATE TEMP FUNCTION . |
CALL |
CALL |
Declaración y asignación de variables
Amazon Redshift | BigQuery |
---|---|
DECLARE |
DECLARE Declara una variable del tipo especificado. |
SET |
SET Asigna a una variable el valor de la expresión proporcionada o asigna varias variables al mismo tiempo en función del resultado de varias expresiones. |
Controladores de condiciones de error
En Amazon Redshift, si se produce un error durante la ejecución de un procedimiento almacenado, se detiene el flujo de ejecución, se finaliza la transacción y se revierte la transacción.
Estos resultados se producen porque no se admiten las subtransacciones. En un procedimiento almacenado de Amazon Redshift, el único handler_statement
admitido es RAISE
. En BigQuery, el control de errores es una función principal del flujo de control principal, similar a lo que ofrecen otros lenguajes con bloques TRY ... CATCH
.
Amazon Redshift | BigQuery |
---|---|
BEGIN ...
EXCEPTION WHEN OTHERS THEN |
BEGIN ... EXCEPTION WHEN ERROR
THEN |
RAISE |
RAISE |
[ <<label>> ] [ DECLARE declarations ] |
BEGIN |
Declaraciones y operaciones de cursores
Como BigQuery no admite cursores ni sesiones, las siguientes instrucciones no se usan en BigQuery:
DECLARE
cursor_name
CURSOR
[FOR] ...
PREPARE
plan_name [ (datatype [, ...] ) ] AS statement
OPEN
cursor_name FOR SELECT ...
FETCH
[ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor_name
CLOSE
cursor_name;
Si usas el cursor para devolver un conjunto de resultados, puedes conseguir un comportamiento similar con las tablas temporales de BigQuery.
Instrucciones SQL dinámicas
La función de scripting de BigQuery admite instrucciones SQL dinámicas como las que se muestran en la siguiente tabla.
Amazon Redshift | BigQuery |
---|---|
EXECUTE |
EXECUTE IMMEDIATE |
Instrucciones de flujo de control
Amazon Redshift | BigQuery |
---|---|
IF..THEN..ELSIF..THEN..ELSE..END
IF |
IF condition |
name CURSOR
[ ( arguments ) ] FOR query |
En BigQuery no se usan cursores ni sesiones. |
[< |
LOOP |
WHILE
condition LOOP stmts END LOOP |
WHILE condition |
EXIT |
BREAK |
Garantías de coherencia y aislamiento de transacciones
Tanto Amazon Redshift como BigQuery son atómicos, es decir, cumplen los requisitos de ACID a nivel de mutación en muchas filas.
Transacciones
Amazon Redshift admite el aislamiento serializable de forma predeterminada en las transacciones. Amazon Redshift te permite especificar cualquiera de los cuatro niveles de aislamiento de transacciones estándar de SQL, pero procesa todos los niveles de aislamiento como serializables.
BigQuery también admite transacciones. BigQuery ayuda a garantizar el control de concurrencia optimista (el primero en confirmar tiene prioridad) con el aislamiento de instantáneas, en el que una consulta lee los últimos datos confirmados antes de que empiece la consulta. Este enfoque garantiza el mismo nivel de coherencia por fila y por mutación, así como entre las filas de la misma instrucción DML, pero evita los interbloqueos. En el caso de que se realicen varias actualizaciones de DML en la misma tabla, BigQuery cambia al control de concurrencia pesimista. Las tareas de carga se pueden ejecutar de forma completamente independiente y añadir datos a las tablas.
Restauración
Si Amazon Redshift detecta algún error al ejecutar un procedimiento almacenado, revierte todos los cambios realizados en una transacción. Además, puedes usar la instrucción de control de transacciones ROLLBACK
en un procedimiento almacenado para descartar todos los cambios.
En BigQuery, puedes usar la instrucción ROLLBACK TRANSACTION
.
Límites de las bases de datos
Consulta la documentación pública de BigQuery para ver las cuotas y los límites más recientes. Muchas cuotas para usuarios con grandes volúmenes se pueden aumentar poniéndose en contacto con el equipo de Asistencia de Cloud. En la siguiente tabla se comparan los límites de las bases de datos de Amazon Redshift y BigQuery.
Límite | Amazon Redshift | BigQuery |
---|---|---|
Tablas de cada base de datos para los tipos de nodos de clúster grandes y extragrandes | 9900 | Sin restricción |
Tablas de cada base de datos para los tipos de nodos de clúster 8xlarge | 20.000 | Sin restricción |
Bases de datos definidas por el usuario que puedes crear para cada clúster | 60 | Sin restricción |
Tamaño máximo de las filas | 4 MB | 100 MB |