Guia de tradução do SQL do Amazon Redshift
Este documento detalha as semelhanças e diferenças da sintaxe SQL entre o Amazon Redshift e o BigQuery para ajudar você a planejar sua migração. Use a tradução do SQL em lote para migrar os scripts SQL em massa ou a tradução interativa do SQL para traduzir consultas ad-hoc.
O público-alvo deste guia são arquitetos empresariais, administradores de bancos de dados, desenvolvedores de aplicativos e especialistas em segurança de TI. Este guia supõe que você esteja familiarizado com o Amazon Redshift.
Tipos de dados
Nesta seção, são mostrados a equivalência entre os tipos de dados no Amazon Redshift e no BigQuery.
Amazon Redshift | BigQuery | Observações | |
---|---|---|---|
Tipo de dado | Alias | Tipo de dado | |
SMALLINT |
INT2 |
INT64 |
O SMALLINT do Amazon Redshift é de 2 bytes, enquanto o INT64 do BigQuery é de 8 bytes. |
INTEGER |
INT64 |
O INTEGER do Amazon Redshift é de 4 bytes, enquanto o INT64 do BigQuery
é de 8 bytes. |
|
BIGINT |
INT8 |
INT64 |
Tanto o BIGINT do Amazon Redshift quanto o INT64 do BigQuery são de 8 bytes. |
DECIMAL |
NUMERIC |
NUMERIC |
|
REAL |
FLOAT4 |
FLOAT64 |
O REAL do Amazon Redshift é de 4 bytes, enquanto o FLOAT64 do BigQuery
é de 8 bytes. |
DOUBLE
PRECISION |
FLOAT64 |
||
BOOLEAN |
BOOL |
BOOL |
O BOOLEAN do Amazon Redshift pode usar TRUE , t ,
true , y , yes e
1 como valores literais válidos para "verdadeiro". O tipo de dado BOOL do BigQuery usa TRUE , que não diferencia maiúsculas de minúsculas. |
CHAR |
STRING |
||
VARCHAR |
STRING |
||
DATE |
DATE |
||
TIMESTAMP |
TIMESTAMP WITHOUT TIME ZONE |
DATETIME |
|
TIMESTAMPTZ |
TIMESTAMP |
Observação: no BigQuery, os fusos horários são usados ao analisar ou formatar carimbos de data/hora para exibição. Um carimbo de data/hora formatado pela string pode incluir um fuso horário, mas quando o BigQuery analisa a string, ele armazena o carimbo de data/hora no horário UTC equivalente. Quando um fuso horário não for especificado explicitamente, será utilizado o fuso horário padrão, que é UTC. Nomes de fuso horário oudiferença de UTC utilizando (-|+)HH:MM são compatíveis, mas as abreviações de fuso horário, como PDT, não. | |
GEOMETRY |
GEOGRAPHY |
Suporte para consulta de dados geoespaciais. |
Os seguintes tipos de dados do BigQuery também não têm análogos diretos no Amazon Redshift:
Tipos de conversão implícitos
Ao migrar para o BigQuery, você precisa converter a maioria das suas conversões implícitas do Amazon Redshift para conversões explícitas do BigQuery, exceto no caso dos tipos de dados a seguir, que são convertidos implicitamente pelo BigQuery.
O BigQuery realiza conversões implícitas para os seguintes tipos de dados:
Do tipo do BigQuery | Para o tipo do BigQuery |
---|---|
|
|
|
|
|
|
O BigQuery também realiza conversões implícitas para os seguintes literais:
Do tipo do BigQuery | Para o tipo do BigQuery |
---|---|
STRING literal (por exemplo, "2008-12-25") |
|
STRING literal (por exemplo, "2008-12-25 15:30:00") |
|
STRING literal (por exemplo, "2008-12-25T07:30:00") |
|
STRING literal (por exemplo, "15:30:00") |
|
Tipos de conversão explícitos
É possível converter os tipos de dados do Amazon Redshift que o BigQuery não converte implicitamente
usando a função
CAST(expression AS type)
do BigQuery ou qualquer uma das funções
DATE
e
TIMESTAMP
.
Ao migrar suas consultas, altere todas as ocorrências do Amazon Redshift
CONVERT(type, expression)
(ou a sintaxe ::) para a função
CAST(expression AS type)
do BigQuery, conforme mostrado na tabela, na seção Funções de formatação de tipo de dados.
Sintaxe das consultas
Nesta seção, são abordadas as diferenças entre o Amazon Redshift e o BigQuery no que diz respeito à sintaxe das consultas.
Instrução SELECT
A maioria das instruções
SELECT
do Amazon Redshift são compatíveis com o BigQuery. A tabela a seguir
mostra uma lista de pequenas diferenças.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
O BigQuery também oferece suporte às seguintes expressões nas instruções SELECT
, que não
têm um equivalente no Amazon Redshift:
Cláusula FROM
Uma cláusula FROM
em uma consulta lista as referências da tabela de onde os dados são selecionados. No
Amazon Redshift, as referências da tabela possíveis incluem tabelas, visualizações e subconsultas. Todas
essas referências de tabela são compatíveis com o BigQuery.
É possível consultar as tabelas do BigQuery na cláusula FROM
usando o seguinte:
[project_id].[dataset_id].[table_name]
[dataset_id].[table_name]
[table_name]
O BigQuery também oferece suporte a outras referências de tabela:
- Versões históricas da definição da tabela e linhas usando
FOR SYSTEM_TIME AS OF
. - Caminhos de campo
ou qualquer caminho que se refere a um campo de um tipo de dados (como
STRUCT
). - Matrizes niveladas.
Tipos JOIN
Tanto o Amazon Redshift quanto o BigQuery são compatíveis com os seguintes tipos de mesclagem:
[INNER] JOIN
LEFT [OUTER] JOIN
RIGHT [OUTER] JOIN
FULL [OUTER] JOIN
CROSS JOIN
e a correlação de vírgulas implícita equivalente
A tabela a seguir mostra uma lista de pequenas diferenças.
Amazon Redshift | BigQuery |
---|---|
|
Observação: no BigQuery, as cláusulas JOIN exigem uma
JOIN condição, a menos que a cláusula seja uma CROSS
JOIN ou uma das tabelas mescladas seja um campo em um tipo de dado ou uma matriz. |
Cláusula WITH
Uma cláusula WITH
do BigQuery contém uma ou mais subconsultas nomeadas que são executadas quando uma instrução SELECT
subsequente se refere a elas. As cláusulas
WITH
do Amazon Redshift se comportam da mesma forma que as do BigQuery, com a exceção de que é possível avaliar a cláusula uma vez e reutilizar seus resultados.
Operadores de conjunto
Há algumas pequenas diferenças entre os Operadores de conjunto do Amazon Redshift e os Operadores de conjunto do BigQuery. No entanto, todas as operações de conjunto viáveis no Amazon Redshift podem ser replicadas no BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
Observação: tanto o BigQuery quanto o Amazon Redshift são compatíveis com o operador |
|
|
|
|
|
|
|
Observação: o BigQuery exige parênteses para separar operações de conjunto diferentes. Se a mesma operação de conjunto for repetida, os parênteses não serão necessários. |
Cláusula ORDER BY
Há algumas pequenas diferenças entre as cláusulas
ORDER BY
do Amazon Redshift e as
cláusulas
ORDER BY
do BigQuery.
Amazon Redshift | BigQuery |
---|---|
No Amazon Redshift, os NULL s são classificados por último, por padrão (ordem crescente). |
Já no BigQuery, os NULL s vêm primeiro na classificação, por padrão (ordem crescente). |
|
Observação: o BigQuery não usa a sintaxe LIMIT ALL , mas
ORDER BY classifica todas as linhas por padrão, resultando no
mesmo comportamento que a cláusula LIMIT ALL do Amazon Redshift. É altamente
recomendável incluir uma cláusula LIMIT em todas as
cláusulas ORDER BY . Ordenar todas as linhas de resultados desnecessariamente
reduz o desempenho de execução da consulta. |
|
Observação: no BigQuery, OFFSET precisa ser usado com uma
contagem LIMIT . Defina o valor contagem
INT64 como o número mínimo necessário de linhas ordenadas.
Ordenar todas as linhas de resultados desnecessariamente reduz o desempenho de execução das consultas. |
Condições
A tabela a seguir mostra as condições do Amazon Redshift, ou predicados, que são específicas do Amazon Redshift e precisam ser convertidas a seus equivalente do BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
|
|
|
Observação: o BigQuery não oferece suporte a caracteres de escape personalizados. É preciso usar duas barras invertidas \\ como caracteres de escape no BigQuery. |
|
Observação: se NOT for especificado, resuma a expressão IF acima em uma expressão NOT , conforme mostrado abaixo:
|
|
|
Funções
As seções a seguir listam as funções do Amazon Redshift e suas equivalentes no BigQuery.
Funções de agregação
A tabela a seguir mostra os mapeamentos entre as funções de agregação, agregação analítica e agregação aproximada do Amazon Redshift e as suas equivalentes no 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( Observação: não aborda casos de uso de agregação. |
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) |
O BigQuery também oferece as seguintes funções de agregação, agregação analítica e agregação aproximada, que não têm análogos diretos no Amazon Redshift:
ANY_VALUE
APPROX_TOP_COUNT
APPROX_TOP_SUM
ARRAY_AGG
ARRAY_CONCAT_AGG
COUNTIF
CORR
COVAR_POP
COVAR_SAMP
Funções de agregação bit a bit
A tabela a seguir mostra os mapeamentos entre funções comuns de agregação bit a bit do Amazon Redshift e as suas equivalentes no BigQuery.
Amazon Redshift | BigQuery |
---|---|
BIT_AND(expression) |
BIT_ADD(expression) |
BIT_OR(expression) |
BIT_OR(expression) |
BOOL_AND>(expression) |
LOGICAL_AND(expression) |
BOOL_OR(expression) |
LOGICAL_OR(expression) |
O BigQuery também oferece a seguinte função de agregação bit a bit, que não tem um análogo direto no Amazon Redshift:
Funções de janela
A tabela a seguir mostra mapeamentos entre funções comuns de janela do Amazon Redshift e as suas equivalentes no BigQuery. As funções de janela no BigQuery incluem funções de agregação analítica, funções de agregação, funções de navegação e funções de numeração.
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 |
Expressões condicionais
A tabela a seguir mostra mapeamentos entre expressões condicionais comuns do Amazon Redshift e suas equivalentes no 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) |
O BigQuery também oferece as seguintes expressões condicionais, que não têm um análogo direto no Amazon Redshift:
Funções de data e hora
A tabela a seguir mostra mapeamentos entre funções comuns de data e hora do Amazon Redshift e seus equivalentes no BigQuery. As funções de data e hora do BigQuery incluem funções de data, datetime data/hora, funções de hora e funções de carimbo de data/hora.
Tenha em mente que funções do Amazon Redshift e do BigQuery que parecem idênticas podem retornar tipos de dados diferentes.
Amazon Redshift | BigQuery |
---|---|
ADD_MONTHS( |
CAST( DATE_ADD( |
timestamptz_or_timestamp AT TIME
ZONE timezone |
PARSE_TIMESTAMP( Observação: fusos horários são usados na análise ou formatação dos carimbos de data/hora para exibição. Um carimbo de data/hora formatado pela string pode incluir um fuso horário, mas quando o BigQuery analisa a string, ele armazena o carimbo de data/hora no horário UTC equivalente. Quando um fuso horário não for especificado explicitamente, será utilizado o fuso horário padrão, que é UTC. Nomes de fuso horário ou diferença de UTC (-HH:MM) são suportados, mas as abreviações de fuso horário, como PDT, não são. |
CONVERT_TIMEZONE( |
PARSE_TIMESTAMP( Observação: source_timezone é UTC no BigQuery. |
CURRENT_DATE Observação: retorna a data de início da transação atual no fuso horário atual da sessão (UTC por padrão). |
CURRENT_DATE() Observação: retorna a data de início da instrução atual no fuso horário 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( |
No Redshift, há 360 dias em um ano para intervalos.
No BigQuery, é possível usar a seguinte função definida pelo usuário (UDF) para analisar um intervalo do Redshift e convertê-lo em segundos. CREATE TEMP FUNCTION Para comparar os literais de intervalo, faça o seguinte: IF( |
LAST_DAY(date) |
DATE_SUB( |
MONTHS_BETWEEN( |
DATE_DIFF( |
NEXT_DAY(date, day) |
DATE_ADD( |
SYSDATE Observação: retorna o carimbo de data/hora de início da transação atual no fuso horário da sessão atual (UTC por padrão). |
CURRENT_TIMESTAMP() Observação: retorna o carimbo de data/hora de início da instrução atual no fuso horário UTC. |
TIMEOFDAY() |
FORMAT_TIMESTAMP( |
TIMESTAMP_CMP( |
CASE |
TIMESTAMP_CMP_DATE( |
CASE |
TIMESTAMP_CMP_TIMESTAMPTZ(
Observação: o Redshift compara carimbos de data/hora no fuso horário definido pela sessão do usuário. O fuso horário padrão da sessão do usuário é UTC. |
CASE Observação: o BigQuery compara carimbos de data/hora no fuso horário UTC. |
TIMESTAMPTZ_CMP( Observação: o Redshift compara carimbos de data/hora no fuso horário definido pela sessão do usuário. O fuso horário padrão da sessão do usuário é UTC. |
CASE Observação: o BigQuery compara carimbos de data/hora no fuso horário UTC. |
TIMESTAMPTZ_CMP_DATE( Observação: o Redshift compara carimbos de data/hora no fuso horário definido pela sessão do usuário. O fuso horário padrão da sessão do usuário é UTC. |
CASE Observação: o BigQuery compara carimbos de data/hora no fuso horário UTC. |
TIMESTAMPTZ_CMP_TIMESTAMP(
Observação: o Redshift compara carimbos de data/hora no fuso horário definido pela sessão do usuário. O fuso horário padrão da sessão do usuário é UTC. |
CASE Observação: o BigQuery compara carimbos de data/hora no fuso horário UTC. |
TIMEZONE( |
PARSE_TIMESTAMP( Observação: fusos horários são usados na análise ou formatação dos carimbos de data/hora para exibição. Um carimbo de data/hora formatado pela string pode incluir um fuso horário, mas quando o BigQuery analisa a string, ele armazena o carimbo de data/hora no horário UTC equivalente. Quando um fuso horário não for especificado explicitamente, será utilizado o fuso horário padrão, que é UTC. Nomes de fuso horário ou diferença de UTC (-HH:MM) são suportados, mas as abreviações de fuso horário, como PDT, não são. |
TO_TIMESTAMP(timestamp,
format) |
PARSE_TIMESTAMP( Observação: o BigQuery segue um conjunto diferente de elementos de formato. Fusos horários são usados na análise ou formatação de carimbos de data/hora para exibição. Um carimbo de data/hora formatado pela string pode incluir um fuso horário, mas quando o BigQuery analisa a string, ele armazena o carimbo de data/hora no horário UTC equivalente. Quando um fuso horário não for especificado explicitamente, será utilizado o fuso horário padrão, que é UTC. Nomes de fusos horários ou diferença de UTC (-HH:MM) são suportado na string de formato, mas as abreviações de fuso horário (como PDT) não são. |
TRUNC(timestamp) |
CAST(timestamp AS
DATE) |
O BigQuery também oferece as seguintes funções de data e hora, que não têm um análogo direto no Amazon Redshift:
EXTRACT
DATE
DATE_SUB
DATE_ADD
(retornando o tipo de dadosDATE
)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
A tabela a seguir mostra mapeamentos entre operadores matemáticos comuns do Amazon Redshift e seus equivalentes no BigQuery.
Amazon Redshift | BigQuery |
---|---|
|
|
|
|
|
|
Observação: se o operador estiver realizando uma divisão de números inteiros (em outras palavras, se X e
Y forem
números inteiros), o resultado será um número inteiro. Se o operador estiver realizando
uma divisão com números não inteiros, o resultado será um número não inteiro. |
Se a divisão de número inteiro: CAST(FLOOR(X / Y) AS INT64)
Se a divisão de número não inteiro:
Observação: o resultado da divisão no BigQuery é um número não inteiro. Para evitar erros causados por uma operação de divisão (erro de divisão por zero), use SAFE_DIVIDE(X, Y) ou
IEEE_DIVIDE(X, Y) . |
|
Observação: para evitar erros causados por uma operação de divisão (erro de divisão por zero), use SAFE.MOD(X, Y) . SAFE.MOD(X, 0) resulta em 0. |
|
Observação: diferentemente do Amazon Redshift, o operador ^ no
BigQuery executa o bit a bit
xor. |
|
Observação: para evitar erros causados por uma operação de raiz quadrada (entrada negativa), use SAFE.SQRT(X) . Uma entrada negativa
com SAFE.SQRT(X) resulta em
NULL . |
|
Observação: o POWER(X, Y) do BigQuery retornará um
erro se X for um valor finito menor que 0
e Y for um número não inteiro. |
|
|
|
Observação: esse operador retorna 0 ou uma sequência de bytes de b'\x00' se o segundo operando, Y , for maior ou igual ao comprimento do bit do primeiro operando, X , (por exemplo, 64, se X tiver o tipo INT64). Esse operador gerará um erro se Y for negativo. |
|
Observação: desloca o primeiro operando X para a direita. Esse operador não faz a extensão de bit de sinal com um tipo com sinal. Isso significa que ele preenche com 0 os bits vagos à esquerda. Esse operador retorna 0 ou uma sequência de bytes de b'\x00' se o segundo operando, Y , for maior ou igual ao comprimento do bit do primeiro operando, X , (por exemplo, 64, se X tiver o tipo INT64). Esse operador gerará um erro se Y for negativo. |
|
|
|
|
|
|
O BigQuery também oferece o seguinte operador matemático, que não tem um análogo direto no Amazon Redshift:
X ^ Y
(Bit a bit xor)
Funções 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])
|
Funções de string
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) Observação: o CONCAT (...) do BigQuery oferece suporte à concatenação de qualquer número de strings. |
CRC32 |
Função definida pelo usuário personalizada |
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( Se position for especificado: ARRAY_LENGTH( REGEXP_EXTRACT_ALL( Observação: o BigQuery oferece suporte a expressões regulares usando a biblioteca re2 . Consulte a
documentação correspondente para ver a sintaxe de expressões regulares. |
REGEXP_INSTR( |
IFNULL( STRPOS( Se source_string está especificado: REGEXP_REPLACE( Se position está especificado:IFNULL( STRPOS( Se occurrence está especificado:IFNULL( STRPOS( Observação: o BigQuery fornece suporte a expressões regulares usando a biblioteca re2 .
Consulte a documentação para ver a sintaxe de expressões regulares . |
REGEXP_REPLACE(
source_string, |
REGEXP_REPLACE( Se source_string está especificado:
REGEXP_REPLACE( Se position está especificado:CASE |
REGEXP_SUBSTR(
source_string, pattern |
REGEXP_EXTRACT( Se position está especificado:REGEXP_EXTRACT( Se occurrence está especificado:REGEXP_EXTRACT_ALL( Observação: o BigQuery oferece suporte a expressões regulares usando a biblioteca re2 . Consulte a
documentação para ver a sintaxe de expressões 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( |
Pode ser implementado usando UDFs: CREATE TEMP FUNCTION |
TRIM([BOTH] string) |
TRIM(string) |
TRIM([BOTH] characters FROM
string) |
TRIM(string, characters)
|
UPPER(string) |
UPPER(string) |
Funções de formatação do tipo de dados
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( Observação: o BigQuery e o Amazon Redshift agem de forma diferente ao especificar uma string de formato para timestamp_expression . |
TO_CHAR(
|
FORMAT( Observação: o BigQuery e o Amazon Redshift agem de forma diferente ao especificar uma string de formato para timestamp_expression .
|
TO_DATE(date_string, format) |
PARSE_DATE(date_string, format)
Observação: o BigQuery e o Amazon Redshift agem de forma diferente ao especificar uma string de formato para date_string . |
TO_NUMBER(string, format) |
CAST( Observação: o BigQuery e o Amazon Redshift agem de forma diferente ao especificar uma string de formato numérico. |
O BigQuery também oferece suporte a SAFE_CAST
(expression
AS typename)
, cujo resultado será NULL
se o BigQuery não conseguir realizar uma transmissão. Por
exemplo, o resultado de
SAFE_CAST
("apple"
AS INT64)
é NULL
.
Sintaxe DML
Nesta seção, são abordadas as diferenças na sintaxe da linguagem de gerenciamento de dados entre o Amazon Redshift e o BigQuery.
Instrução INSERT
O Amazon Redshift oferece uma palavra-chave DEFAULT
configurável para colunas. No BigQuery, o valor DEFAULT
das colunas anuláveis é NULL
, e DEFAULT
não é compatível com colunas obrigatórias. A maioria
das instruções INSERT
do Amazon Redshift
é compatível com o BigQuery. A tabela a seguir mostra as exceções.
Amazon Redshift | BigQuery |
---|---|
INSERT INTO table (column1 [, ...]) |
INSERT [INTO] table (column1 [, ...]) |
INSERT INTO table (column1, [,...]) VALUES ( |
INSERT [INTO] table (column1, [,...]) |
O BigQuery também oferece suporte à inserção de valores usando uma subconsulta, em que um dos valores é calculado usando uma subconsulta, o que não é possível no Amazon Redshift. Exemplo:
INSERT INTO table (column1, column2)
VALUES ('value_1', (
SELECT column2
FROM table2
))
Instrução COPY
O comando
COPY
do Amazon Redshift carrega dados em uma tabela a partir de arquivos de dados ou de uma tabela do Amazon DynamoDB.
O BigQuery não usa o comando SQL COPY
para carregar dados,
mas é possível usar qualquer uma das várias ferramentas e opções que não são do SQL para
carregar dados nas tabelas do BigQuery.
Também é possível usar os coletores de data pipelines fornecidos no
Apache Spark
ou no
Apache Beam
para gravar dados no BigQuery.
Instrução UPDATE
A maioria das instruções UPDATE
do Amazon Redshift é compatível com o BigQuery. A tabela a seguir
mostra as exceções.
Amazon Redshift | BigQuery |
---|---|
UPDATE table |
UPDATE table Observação: todas as instruções UPDATE no BigQuery exigem uma palavra-chave WHERE ,
seguida por uma condição. |
UPDATE table |
UPDATE table Observação: o comando UPDATE do BigQuery não é compatível com valores DEFAULT .
Se a instrução UPDATE do Amazon Redshift não incluir uma cláusula WHERE , a instrução UPDATE do BigQuery precisará ser condicionada à WHERE TRUE . |
Declarações DELETE
e TRUNCATE
.
As instruções DELETE
e TRUNCATE
são maneiras de remover linhas de uma tabela
sem afetar seu esquema ou índices.
No Amazon Redshift, a instrução TRUNCATE
é recomendada no lugar de uma instrução DELETE
não qualificada porque é mais rápida e não precisa das operações VACUUM
e ANALYZE
posteriormente.
No entanto, é possível usar as instruções DELETE
para ter o mesmo efeito.
No BigQuery, a instrução DELETE
precisa ter uma cláusula WHERE
. Para mais informações sobre DELETE
no BigQuery, consulte os
exemplos de DELETE
do BigQuery
na documentação do DML.
Amazon Redshift | BigQuery |
---|---|
DELETE
[FROM] table_name TRUNCATE
[TABLE] table_name |
DELETE FROM table_name As instruções DELETE do BigQuery exigem uma cláusula
WHERE . |
DELETE FROM table_name |
DELETE FROM table_name DELETE FROM table_name No Amazon Redshift, o USING permite a referência a outras tabelas na
cláusula WHERE . Isso pode ser feito no
BigQuery usando uma subconsulta na
cláusula WHERE . |
Instrução MERGE
A instrução MERGE
pode combinar operações INSERT
, UPDATE
e DELETE
em uma
única instrução upsert e executar as operações de maneira atômica. A
operação MERGE
precisa corresponder, no máximo, a uma linha de origem para cada linha de destino.
O Amazon Redshift não oferece suporte a um comando MERGE
único. No entanto, uma
operação de mesclagem
pode ser realizada no Amazon Redshift executando as operações
INSERT
, UPDATE
e DELETE
em uma transação.
Operação de mesclagem substituindo as linhas existentes
No Amazon Redshift, uma substituição de todas as colunas na tabela de destino pode ser feita usando uma instrução DELETE
e uma instrução INSERT
. A instrução DELETE
remove as linhas que precisam de atualização e, em seguida, a instrução INSERT
insere as linhas atualizadas. As tabelas do BigQuery têm um limite de
1.000 instruções DML
por dia. Por isso, você precisa consolidar as instruções INSERT
, UPDATE
e DELETE
em uma instrução MERGE
única, conforme mostrado na tabela a seguir.
Amazon Redshift | BigQuery |
---|---|
Consulte Como executar uma operação de mesclagem substituindo
linhas existentes. CREATE TEMP TABLE temp_table; |
MERGE target Observação: se todas as colunas estiverem sendo atualizadas, todas precisarão ser listadas. |
Consulte Como executar uma
operação de mesclagem especificando uma
lista de colunas. CREATE TEMP TABLE temp_table; |
MERGE target |
Sintaxe DDL
Nesta seção, são abordadas as diferenças na sintaxe da linguagem de definição de dados entre o Amazon Redshift e o BigQuery.
Instrução SELECT INTO
No Amazon Redshift, a instrução SELECT INTO
pode ser usada para inserir os resultados de uma consulta em uma nova tabela, combinando a criação e a inserção da tabela.
Amazon Redshift | BigQuery |
---|---|
SELECT expression, ... INTO table |
INSERT table |
WITH subquery_table AS ( SELECT ... |
INSERT table |
SELECT expression |
O BigQuery oferece várias maneiras de emular tabelas temporárias. Consulte a seção Tabelas temporárias para obter mais informações. |
Instrução CREATE TABLE
A maioria das instruções
CREATE TABLE
do Amazon Redshift são compatíveis com o BigQuery, exceto pelos seguintes
elementos de sintaxe, que não são usados no BigQuery:
Amazon Redshift | BigQuery |
---|---|
CREATE TABLE table_name ( Observação: as restrições UNIQUE e PRIMARY KEY são informativas e are not
enforced by the Amazon Redshift. |
CREATE TABLE table_name ( |
CREATE TABLE table_name Observação: as restrições UNIQUE e PRIMARY KEY são informativas e não são
aplicadas pelo sistema do Amazon Redshift.
|
CREATE TABLE table_name Observação: o BigQuery não usa as restrições de tabela UNIQUE , PRIMARY KEY ou FOREIGN KEY . Para alcançar uma otimização semelhante à fornecida por essas restrições durante a execução da consulta, particione e agrupe suas tabelas do BigQuery. CLUSTER BY oferece suporte a até quatro colunas. |
CREATE TABLE table_name |
Consulte este exemplo para saber como usar
as tabelas INFORMATION_SCHEMA para copiar nomes de colunas, tipos de dados e restrições
NOT NULL em uma nova tabela. |
CREATE TABLE table_name Observação: no Amazon Redshift, a configuração BACKUP
NO é especificada para poupar o tempo gasto no processamento e reduzir o espaço de armazenamento. |
A opção de tabela BACKUP NO não é usada nem necessária, porque o BigQuery mantém automaticamente até sete dias de versões históricas de todas as tabelas, sem qualquer efeito adverso sobre o tempo de processamento ou o armazenamento faturados.
|
CREATE TABLE table_name |
O BigQuery oferece suporte ao clustering, que permite armazenar chaves em uma ordem classificada. |
CREATE TABLE table_name |
CREATE TABLE table_name |
CREATE TABLE IF NOT EXISTS table_name ... |
CREATE TABLE IF NOT EXISTS |
O BigQuery também oferece suporte à instrução DDL CREATE OR REPLACE TABLE
, que substitui uma tabela já existente.
A instrução CREATE TABLE
do BigQuery também é compatível com as seguintes cláusulas, que
não têm um equivalente no Amazon Redshift:
Para mais informações sobre CREATE TABLE
no BigQuery, consulte os
exemplos de CREATE TABLE
do BigQuery
na documentação do DML.
Tabelas temporárias
O Amazon Redshift é compatível com tabelas temporárias, que são visíveis apenas na sessão atual. Há várias maneiras de emular tabelas temporárias no BigQuery:
- Tempo de vida (TTL) do conjunto de dados: crie um conjunto de dados que tenha um curto tempo de vida, por exemplo, uma hora, para que as tabelas criadas no conjunto de dados sejam efetivamente temporárias, já que não permanecerão por mais tempo do que o tempo de vida do conjunto de dados. É possível prefixar todos os nomes de tabela nesse conjunto de dados com "temp" para indicar claramente que as tabelas são temporárias.
Tempo de vida (TTL) da tabela: crie uma tabela que tenha um curto tempo de vida específico usando instruções DDL semelhantes a estas:
CREATE TABLE temp.name (col1, col2, ...) OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR));
Instrução CREATE VIEW
A tabela a seguir mostra equivalentes entre o Amazon Redshift e o BigQuery para a instrução CREATE VIEW
.
Amazon Redshift | BigQuery |
---|---|
CREATE VIEW view_name AS SELECT ... código> |
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
... |
Incompatível. | CREATE VIEW IF NOT EXISTS c
view_name criará uma nova visualização somente se ela não existir no conjunto de dados especificado. |
CREATE VIEW view_name No Amazon Redshift, é necessário ter uma visualização de vinculação tardia para fazer referência a uma tabela externa. |
Para criar uma visualização no BigQuery, é necessário que todos os objetos referenciados já existam. O BigQuery permite consultar fontes de dados externas. |
Funções definidas pelo usuário (UDFs)
Uma UDF permite criar funções para operações personalizadas. Essas funções aceitam colunas de entrada, executam ações e mostram o resultado dessas ações como um valor.
Tanto o Amazon Redshift quanto o BigQuery oferecem suporte a UDFs usando expressões SQL. Além disso, no Amazon Redshift, é possível criar uma UDF baseada em Python e, no BigQuery, uma UDF baseada em JavaScript.
Consulte o repositório do GitHub de utilitários do BigQuery do Google Cloud, onde há uma biblioteca de UDFs comuns do BigQuery.
Sintaxe de CREATE FUNCTION
A tabela a seguir mostra as diferenças na sintaxe de criação de UDF do SQL entre o Amazon Redshift e o BigQuery.
Amazon Redshift | BigQuery |
---|---|
CREATE [OR
REPLACE] FUNCTION |
CREATE [OR REPLACE] FUNCTION Observação: em uma UDF do SQL do BigQuery, um tipo de dados de retorno é opcional. O BigQuery infere o tipo de resultado da função a partir do corpo da função do SQL, quando uma consulta chama a função. |
CREATE [OR
REPLACE] FUNCTION |
CREATE [OR REPLACE] FUNCTION Observação: a volatilidade de função não é um parâmetro configurável no BigQuery. Toda a volatilidade de UDF no BigQuery é equivalente à volatilidade de IMMUTABLE do Amazon Redshift. Ou seja, ele não faz pesquisas no banco de dados nem usa informações que não estejam diretamente presentes na lista de argumentos.
|
CREATE [OR
REPLACE] FUNCTION Observação: o Amazon Redshift oferece suporte apenas a uma cláusula SQL SELECT como definição de função. Além disso, a cláusula SELECT não pode incluir nenhuma das cláusulas FROM,
INTO, WHERE, GROUP BY, ORDER BY, e LIMIT . |
CREATE [OR REPLACE] FUNCTION Observação: o BigQuery oferece suporte a qualquer expressão SQL como definição de função. No entanto, não é possível se referir a tabelas, visualizações ou 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 Observação: não é necessário especificar o literal da linguagem em uma UDF do GoogleSQL. O BigQuery interpreta a expressão do SQL por padrão. Além disso, a cota de dólares do 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 SQL type encodings in JavaScript 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 o início e o fim das instruções da função.Em UDFs do SQL, o Amazon Redshift oferece suporte apenas a uma cláusula SELECT SQL
como a definição da função. Além disso, a cláusula SELECT
não pode incluir nenhuma das cláusulas FROM , INTO ,
WHERE , GROUP BY , ORDER BY e LIMIT
.Para UDFs em Python, é possível gravar um programa em Python usando a biblioteca padrão Python 2.7 ou importar seus módulos personalizados criando um com o comando CREATE
LIBRARY . |
No BigQuery, é necessário colocar o código JavaScript entre aspas. Consulte
Regras de uso para mais
informações. Nas UDFs do SQL, use qualquer expressão SQL como a definição da função. No entanto, o BigQuery não oferece suporte para referência a tabelas, visualizações ou modelos. Em UDFs em JavaScript, é possível incluir bibliotecas de código externas diretamente, usando a seção OPTIONS . Também é possível usar a ferramenta de teste
de UDF do BigQuery para testar as funções. |
Idioma | Use o literal LANGUAGE para especificar a
linguagem como sql para UDFs do SQL ou plpythonu
para UDFs em Python. |
Não é necessário especificar LANGUAGE para UDFs do SQL, mas é necessário especificar a linguagem como js para UDFs em JavaScript. |
Estado | O Amazon Redshift não é compatível com a criação de UDFs temporárias. O Amazon Redshift oferece uma opção para definir a volatilidade de uma função usando VOLATILE , STABLE
ou literais IMMUTABLE . Isso é usado para a otimização fornecida pelo otimizador de consultas. |
O BigQuery oferece suporte a UDFs permanentes e temporárias. É possível reutilizar UDFs permanentes
em várias consultas, mas as UDFs temporárias só podem ser usadas uma única vez. A volatilidade de função não é um parâmetro configurável no BigQuery. Toda a volatilidade do UDF no BigQuery é equivalente à volatilidade IMMUTABLE
no Amazon Redshift. |
Segurança e privilégios | Para criar uma UDF, você precisa ter permissão
para uso em uma linguagem para SQL ou plpythonu (Python). Por padrão, USAGE ON LANGUAGE SQL é concedido a PUBLIC , mas você precisa conceder explicitamente USAGE ON LANGUAGE PLPYTHONU
a usuários ou grupos específicos.Além disso, é preciso ser um superusuário para substituir uma UDF. |
Não é necessário conceder permissões com linguagem explícita para criar ou excluir qualquer tipo de
UDF no BigQuery. Qualquer usuário com um papel de Editor de dados do BigQuery (tendo bigquery.routines.* como uma das permissões) pode criar ou excluir funções do conjunto de dados especificado.O BigQuery também oferece suporte à criação de papéis personalizados. Isso pode ser gerenciado usando o Cloud IAM. |
Limites | Consulte Limites de UDF em Python. | Consulte Limites de UDF. |
Instruções SQL de metadados e transações
Amazon Redshift | BigQuery |
---|---|
SELECT * FROM STL_ANALYZE WHERE name |
Não usado no BigQuery. Não é preciso coletar estatísticas para melhorar o desempenho da consulta. Para receber informações sobre a distribuição de dados, use funções de agregação aproximadas. |
ANALYZE
[[ table_name[(column_name |
Não usado no BigQuery. |
LOCK
TABLE table_name; |
Não usado no BigQuery. |
BEGIN
TRANSACTION; SELECT ... |
O BigQuery usa o isolamento de snapshot. Para ver mais detalhes, consulte Garantias de consistência. |
EXPLAIN
... |
Não usado no BigQuery. Recursos semelhantes são a explicação do plano de consulta, no console do Google Cloud e na geração de registros de auditoria, no Cloud Monitoring. |
SELECT * FROM SVV_TABLE_INFO WHERE |
SELECT * EXCEPT(is_typed) FROM Para mais informações, consulte Introdução ao BigQuery INFORMATION_SCHEMA . |
VACUUM
[table_name] |
Não usado no BigQuery. As tabelas em cluster do BigQuery são classificadas automaticamente. |
Instruções SQL com várias instruções e linhas
O Amazon Redshift e o BigQuery tem suporte a transações (sessões) e, portanto, tem suporte a instruções separadas por ponto e vírgula que são executadas de maneira consistente em conjunto. Para mais informações, consulte Transações de várias instruções.
Instruções SQL procedurais
Instrução CREATE PROCEDURE
Amazon Redshift | BigQuery |
---|---|
CREATE or
REPLACE PROCEDURE |
CREATE PROCEDURE quando um nome for necessário.Caso contrário, use in-line com BEGIN ou em uma única linha com CREATE TEMP FUNCTION . |
CALL |
CALL |
Declaração e atribuição de variáveis
Amazon Redshift | BigQuery |
---|---|
DECLARE |
DECLARE declara uma variável do tipo especificado. |
SET |
SET define o valor da expressão fornecida para uma variável ou define múltiplas variáveis ao mesmo tempo, com base no resultado de várias expressões. |
Gerenciadores de condição de erro
No Amazon Redshift, um erro encontrado durante a execução de um procedimento armazenado encerra o fluxo de execução, finaliza e reverte a transação.
Isso ocorre porque as subtransações não são compatíveis. Em um
procedimento armazenado pelo Amazon Redshift, o único handler_statement
compatível
é RAISE
. No
BigQuery, o tratamento de erros é um recurso principal do fluxo de controle
principal. Ele é semelhante ao fornecido por outras linguagens com blocos TRY ... CATCH
.
Amazon Redshift | BigQuery |
---|---|
BEGIN ...
EXCEPTION WHEN OTHERS THEN |
BEGIN ... EXCEPTION WHEN ERROR
THEN |
RAISE |
RAISE |
[ <<label>> ] [ DECLARE declarations ] |
BEGIN |
Declarações e operações do cursor
Como o BigQuery não é compatível com cursores ou sessões, as seguintes instruções não são usadas nele:
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;
Se você estiver usando o cursor para obter um conjunto de resultados, um comportamento semelhante poderá ser alcançado usando as tabelas temporárias do BigQuery.
Instruções SQL dinâmicas
O recurso de criação de script no BigQuery é compatível com instruções SQL dinâmicas, como as mostradas na tabela a seguir.
Amazon Redshift | BigQuery |
---|---|
EXECUTE |
EXECUTE IMMEDIATE |
Instruções de fluxo de controle
Amazon Redshift | BigQuery |
---|---|
IF..THEN..ELSIF..THEN..ELSE..END
IF |
IF condition |
name CURSOR
[ ( arguments ) ] FOR query |
Cursores nem sessões não são usados no BigQuery. |
[< |
LOOP |
WHILE
condition LOOP stmts END LOOP |
WHILE condition |
EXIT |
BREAK |
Garantias de consistência e isolamento da transação
O Amazon Redshift e o BigQuery são atômicos, ou seja, compatíveis com ACID em várias linhas por mutação.
Transações
O Amazon Redshift é compatível por padrão com o isolamento serializável para transações. O Amazon Redshift permite especificar qualquer um dos quatro níveis de isolamento da transação padrão do SQL, mas processa todos os níveis de isolamento como serializáveis.
O BigQuery também tem suporte a transações. O BigQuery ajuda a garantir o controle de simultaneidade otimista (primeiro a confirmar tem prioridade) com o isolamento de snapshot, em que uma consulta lê os últimos dados confirmados antes do início da consulta. Essa abordagem garante o mesmo nível de consistência por linha, por mutação e em todas as linhas da mesma instrução DML, evitando impasses. No caso de várias atualizações de DML na mesma tabela, o BigQuery alterna para controle de simultaneidade pessimista. Os jobs de carregamento podem ser executados de forma totalmente independente e anexados às tabelas.
Reversão
Se o Amazon Redshift encontrar algum erro ao executar um procedimento armazenado, ele reverterá todas as alterações feitas em uma transação. Além disso, é possível usar a instrução de controle de transação ROLLBACK
em um procedimento armazenado para descartar todas as alterações.
No BigQuery, é possível usar a instrução ROLLBACK TRANSACTION
.
Limites de bancos de dados
Sempre verifique a documentação pública do BigQuery para ver as cotas e os limites mais recentes. Muitas cotas para usuários de grandes volumes podem ser elevadas entrando em contato com a equipe de suporte do Cloud. Veja na tabela a seguir uma comparação entre os limites de banco de dados do Amazon Redshift e do BigQuery.
Limite | Amazon Redshift | BigQuery |
---|---|---|
Tabelas em cada banco de dados para tipos de nós de cluster grandes e extragrandes | 9.900 | Irrestrito |
Tabelas em cada banco de dados para tipos de nós de cluster 8xlarge | 20.000 | Irrestrito |
Bancos de dados definidos pelo usuário que podem ser criados para cada cluster | 60 | Irrestrito |
Tamanho máximo da linha | 4 MB | 100 MB |