Guía de traducción de SQL de IBM Netezza

El almacenamiento de datos de IBM Netezza está diseñado para funcionar con la sintaxis de SQL específica de Netezza. Netezza SQL se basa en Postgres 7.2. Las secuencias de comandos de SQL escritas para Netezza no se pueden usar en un almacén de datos de BigQuery sin alteraciones porque los dialectos de SQL varían.

En este documento, se detallan las similitudes y diferencias en la sintaxis de SQL entre Netezza y BigQuery en las siguientes áreas:

  • Tipos de datos
  • Elementos del lenguaje SQL
  • Sintaxis de las consultas
  • Lenguaje de manipulación de datos (DML)
  • Lenguaje de definición de datos (DDL)
  • Procedimientos almacenados
  • Funciones

También puedes usar la traducción de SQL por lotes para migrar tus secuencias de comandos de SQL de forma masiva o la traducción de SQL interactiva a fin de traducir ad hoc. SQL de IBM Netezza/NZPLSQL es compatible con ambas herramientas en la vista previa.

Tipos de datos

Netezza BigQuery Notas
INTEGER/INT/INT4 INT64
SMALLINT/INT2 INT64
BYTEINT/INT1 INT64
BIGINT/INT8 INT64
DECIMAL NUMERIC El tipo de datos DECIMAL en Netezza es un alias para el tipo de datos NUMERIC.
NUMERIC NUMERIC INT64
NUMERIC(p,s) NUMERIC El tipo NUMERIC en BigQuery no aplica dígitos personalizados ni límites de escalamiento (restricciones) como lo hace Netezza. BigQuery tiene 9 dígitos fijos después del decimal, mientras que Netezza permite una configuración personalizada. En Netezza, la precisión p puede variar de 1 a 38 y escalar s de 0 a la precisión.
FLOAT(p) FLOAT64
REAL/FLOAT(6) FLOAT64
DOUBLE PRECISION/FLOAT(14) FLOAT64
CHAR/CHARACTER STRING El tipo STRING en BigQuery es de longitud variable y no requiere que se establezca una extensión máxima de caracteres de forma manual como Netezza CHARACTER y VARCHAR requieren. El valor predeterminado de n en CHAR(n) es 1. El tamaño máximo de la cadena de caracteres es de 64,000.
VARCHAR STRING El tipo STRING en BigQuery es de longitud variable y no requiere que se establezca una extensión máxima de caracteres de forma manual como Netezza CHARACTER y VARCHAR requieren. El tamaño máximo de la cadena de caracteres es de 64,000.
NCHAR STRING El tipo STRING en BigQuery se almacena como Unicode con codificación UTF-8 de longitud variable. La longitud máxima es de 16,000 caracteres.
NVARCHAR STRING El tipo STRING en BigQuery se almacena como Unicode codificado en UTF-8 de longitud variable. La longitud máxima es de 16,000 caracteres.
VARBINARY BYTES
ST_GEOMETRY GEOGRAPHY
BOOLEAN/BOOL BOOL El tipo BOOL en BigQuery solo puede aceptar TRUE/FALSE, a diferencia del tipo BOOL en Netezza, que puede aceptar una variedad de valores como 0/1, yes/no, true/false, on/off.
DATE DATE
TIME TIME
TIMETZ/TIME WITH TIME ZONE TIME Netezza almacena el tipo de datos TIME en UTC y te permite pasar un desplazamiento de UTC mediante la sintaxis WITH TIME ZONE. El tipo de datos TIME en BigQuery representa una hora que es independiente de cualquier fecha o zona horaria.
TIMESTAMP DATETIME El tipo TIMESTAMP de Netezza no incluye una zona horaria, igual que el tipo DATETIME de BigQuery.
ARRAY No hay ningún tipo de datos de array en Netezza. En su lugar, el tipo de array se almacena en un campo de charchar.

Tipos de formato de marca de tiempo y fecha

Para obtener más información sobre el formato de tipo de fecha que usa Netezza SQL, consulta la documentación de los patrones de plantilla de fecha y hora de Netezza. Para obtener más información sobre las funciones de fecha y hora, consulta la documentación de la funciones de fecha y hora de Netezza.

Cuando conviertes los elementos de formato de tipo de fecha de Netezza en GoogleSQL, debes prestar especial atención a las diferencias de zona horaria entre TIMESTAMP y DATETIME, como se resume en la siguiente tabla:

Netezza BigQuery
CURRENT_TIMESTAMP
CURRENT_TIME

información de TIME en Netezza puede tener información diferente de la zona horaria, que se define mediante la sintaxis WITH TIME ZONE.
Si es posible, usa la función CURRENT_TIMESTAMP, que tiene el formato correcto. Sin embargo, el formato de salida no siempre muestra la zona horaria UTC (internamente, BigQuery no tiene una zona horaria). El objeto DATETIME en la herramienta de línea de comandos de bq y en la consola de Google Cloud se formatea con un separador T según RFC 3339. Sin embargo, en JDBC de Python y Java, se usa un espacio como separador. Usa la función FORMAT_DATETIME explícita para definir el formato de fecha correctamente. De lo contrario, se realiza una conversión explícita a una cadena, por ejemplo:
CAST(CURRENT_DATETIME() AS STRING)
Esto también muestra un separador de espacio.
CURRENT_DATE CURRENT_DATE
CURRENT_DATE-3 BigQuery no admite operaciones aritméticas de datos. En su lugar, usa la función DATE_ADD.

Declaración SELECT

Por lo general, la declaración SELECT de Netezza es compatible con BigQuery. En la siguiente tabla, se incluye una lista de excepciones:

Netezza BigQuery
Una declaración SELECT sin cláusula FROM Admite casos especiales como los siguientes:

SELECT 1 UNION ALL SELECT 2;

SELECT
  (subquery) AS flag,
  CASE WHEN flag = 1 THEN ...

En BigQuery, las columnas no pueden hacer referencia al resultado de otras columnas definidas dentro de la misma consulta. Debes duplicar la lógica o mover la lógica a una consulta anidada.

Opción 1

SELECT
  (subquery) AS flag,
  CASE WHEN (subquery) = 1 THEN ...

Opción 2

SELECT
  q.*,
  CASE WHEN flag = 1 THEN ...
FROM (
  SELECT
    (subquery) AS flag,
    ...
  ) AS q

Operadores de comparación

Netezza BigQuery Descripción
exp = exp2 exp = exp2 Igual
exp <= exp2 exp <= exp2 Menor o igual que
exp < exp2 exp < exp2 Inferior a
exp <> exp2
exp != exp2
exp <> exp2
exp != exp2
No igual
exp >= exp2 exp >= exp2 Mayor o igual que
exp > exp2 exp > exp2 Mayor que

Funciones de SQL integradas

Netezza BigQuery Descripción
CURRENT_DATE CURRENT_DATE Obtén la fecha actual (año, mes y día).
CURRENT_TIME CURRENT_TIME Obtén la hora actual con fracción.
CURRENT_TIMESTAMP CURRENT_TIMESTAMP Obtén la fecha y hora actuales del sistema en el segundo completo más cercano.
NOW CURRENT_TIMESTAMP Obtén la fecha y hora actuales del sistema en el segundo completo más cercano.
COALESCE(exp, 0) COALESCE(exp, 0) Reemplaza NULL por cero.
NVL(exp, 0) IFNULL(exp, 0) Reemplaza NULL por cero.
EXTRACT(DOY FROM timestamp_expression) EXTRACT(DAYOFYEAR FROM timestamp_expression) Muestra el número de días desde el comienzo del año.
ADD_MONTHS(date_expr, num_expr) DATE_ADD(date, INTERVAL k MONTH) Agrega meses a una fecha.
DURATION_ADD(date, k) DATE_ADD(date, INTERVAL k DAY) Realiza la adición a las fechas.
DURATION_SUBTRACT(date, k) DATE_SUB(date, INTERVAL k DAY) Realiza la resta de las fechas.
str1 || str2 CONCAT(str1, str2) Concatena cadenas.

Funciones

En esta sección, se comparan las funciones de Netezza y BigQuery.

Funciones de agregación

Funciones analíticas

Funciones de fecha y hora

Funciones de string

Funciones matemáticas

Sintaxis de DML

En esta sección, se compara la sintaxis de DML de Netezza y BigQuery.

Declaración INSERT

Netezza BigQuery

INSERT INTO table VALUES (...);

INSERT INTO table (...) VALUES (...);


Netezza ofrece una palabra clave DEFAULT y otras restricciones para las columnas. En BigQuery, omitir los nombres de las columnas en la declaración INSERT solo es válido si se proporcionan todas las columnas.

INSERT INTO table (...) VALUES (...);
INSERT INTO table (...) VALUES (...);

INSERT INTO table VALUES (), ();

BigQuery impone cuotas de DML, que restringen la cantidad de declaraciones DML que puedes ejecutar a diario. Para aprovechar al máximo tu cuota, considera los siguientes enfoques:

  • Combina varias filas en una sola declaración INSERT, en lugar de una fila por operación INSERT.
  • Combina varias declaraciones DML (incluida una declaración INSERT) con una declaración MERGE.
  • Usa una declaración CREATE TABLE ... AS SELECT para crear y propagar tablas nuevas.

Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Netezza. Además, ten en cuenta que BigQuery no ofrece restricciones además de NOT NULL.

Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta Garantías de coherencia y aislamiento de transacción.

Declaración UPDATE

En Netezza, la cláusula WHERE es opcional, pero en BigQuery es necesaria.

Netezza BigQuery

UPDATE tbl
SET
tbl.col1=val1;

No se admite sin la cláusula WHERE. Usa una cláusula WHERE true para actualizar todas las filas.

UPDATE A
SET
  y = B.y,
  z = B.z + 1
FROM B
WHERE A.x = B.x
  AND A.y IS NULL;

UPDATE A
SET
  y = B.y,
  z = B.z + 1
FROM B
WHERE A.x = B.x
  AND A.y IS NULL;

UPDATE A alias
SET x = x + 1
WHERE f(x) IN (0, 1)

UPDATE A
SET x = x + 1
WHERE f(x) IN (0, 1);

UPDATE A
SET z = B.z
FROM B
WHERE A.x = B.x
  AND A.y = B.y

UPDATE A
SET z = B.z
FROM B
WHERE A.x = B.x
  AND A.y = B.y;

Para ver ejemplos, consulta Ejemplos de UPDATE.

Debido a las cuotas DML, te recomendamos que uses las declaraciones MERGE más grandes en lugar de varias declaraciones UPDATE y INSERT individuales. Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Netezza. Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta Garantías de coherencia y aislamiento de transacción.

Declaraciones DELETE y TRUNCATE

Las declaraciones DELETE y TRUNCATE son alternativas para quitar filas de una tabla sin afectar el esquema ni los índices de esta. La declaración TRUNCATE tiene el mismo efecto que la declaración DELETE, pero es mucho más rápida que la declaración DELETE para tablas grandes. La declaración TRUNCATE es compatible con Netezza, pero no con BigQuery. Sin embargo, puedes usar declaraciones DELETE en Netezza y BigQuery.

En BigQuery, la declaración DELETE debe tener una cláusula WHERE. En Netezza, la cláusula WHERE es opcional. Si no se especifica la cláusula WHERE, se borran todas las filas de la tabla Netezza.

Netezza BigQuery Descripción

BEGIN;
LOCK TABLE A IN EXCLUSIVE MODE;
DELETE FROM A;
INSERT INTO A SELECT * FROM B;
COMMIT;

El equivalente a una transacción es reemplazar el contenido de una tabla por el resultado de la consulta. Puedes hacerlo con una operación de query o una operación de copiado(cp) operation.

bq query \
--replace \
--destination_table \
tableA \
'SELECT * \
FROM tableB \
WHERE ...'

bq cp \
-f tableA tableB

Reemplaza el contenido de una tabla por los resultados de una consulta.

DELETE FROM database.table

DELETE FROM table WHERE TRUE;

En Netezza, cuando se ejecuta una instrucción de borrado, las filas no se borran de forma física, sino que solo se marcan para su eliminación. Ejecutar los comandos GROOM TABLE o nzreclaim más adelante quita las filas marcadas para la eliminación y recupera el espacio en el disco correspondiente.
GROOM TABLE Netezza usa el comando GROOM TABLE con el objetivo de recuperar espacio en el disco mediante la eliminación de las filas marcadas para su eliminación.

Declaración MERGE

Una declaración MERGE debe coincidir como máximo con una fila de origen para cada fila de destino. Las secuencias de comandos del DML en BigQuery tienen una semántica de coherencia apenas diferente de la que tienen las declaraciones equivalentes de Netezza. Para obtener una descripción general del aislamiento de instantáneas y el control de sesiones y transacciones, consulta Garantías de coherencia y aislamiento de transacción. Para ver ejemplos, consulta Ejemplos de BigQuery MERGE y Ejemplos de Netezza MERGE.

Sintaxis del DDL

En esta sección, se compara la sintaxis de DDL de Netezza y BigQuery.

Declaración CREATE TABLE

Netezza BigQuery Descripción
TEMP
TEMPORARY
Con la compatibilidad con DDL de BigQuery, puedes crear una tabla a partir de los resultados de una consulta y especificar su vencimiento en el momento de la creación. Por ejemplo, durante tres días:

CREATE TABLE 'fh-bigquery.public_dump.vtemp'
OPTIONS(
expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(),
INTERVAL 3 DAY))
Crea tablas temporales para una sesión.
ZONE MAPS No compatible. Búsqueda rápida de la condición WHERE.
DISTRIBUTE ON PARTITION BY Partición. Esta no es una traducción directa. DISTRIBUTE ON comparte datos entre nodos, por lo general, con una clave única para una distribución uniforme, mientras que PARTITION BY reduce los datos a segmentos.
ORGANIZE ON CLUSTER BY Netezza y BigQuery admiten hasta cuatro claves para el agrupamiento en clústeres. Las tablas base agrupadas en clústeres (CBT) de Netezza proporcionan la misma prioridad a cada una de las columnas de agrupamiento en clústeres. BigQuery otorga prioridad a la primera columna en la que se agrupa la tabla, seguida de la segunda, y así sucesivamente.
ROW SECURITY Authorized View Seguridad a nivel de la fila
CONSTRAINT No compatible Comprueba las restricciones.

Declaración DROP

Netezza BigQuery Descripción
DROP TABLE DROP TABLE
DROP DATABASE DROP DATABASE
DROP VIEW DROP VIEW

Atributos y opciones de columnas

Netezza BigQuery Descripción
NULL
NOT NULL
NULLABLE
REQUIRED
Especifica si la columna puede contener valores NULL.
REFERENCES No compatible Especifica la restricción de la columna.
UNIQUE No compatible Cada valor de la columna debe ser único.
DEFAULT No compatible Valor predeterminado para todos los valores de la columna.

Tablas temporales

Netezza admite tablas TEMPORARY que existen durante la duración de una sesión.

Sigue estos pasos para compilar una tabla temporal en BigQuery:

  1. Cree un conjunto de datos con un tiempo de actividad corto (por ejemplo, 12 horas).
  2. Crea la tabla temporal en el conjunto de datos, con un prefijo de nombre de tabla de temp. Por ejemplo, para crear una tabla que venza en una hora, haz lo siguiente:

    CREATE TABLE temp.name (col1, col2, ...)
    OPTIONS(expiration_timestamp = TIMESTAMP_ADD(CURRENT_TIMESTAMP(),
    INTERVAL 1 HOUR));
  3. Empieza a leer y escribir desde la tabla temporal.

También puedes quitar los duplicados de forma independiente para encontrar errores en los sistemas posteriores.

Ten en cuenta que BigQuery no es compatible con las columnas DEFAULT y IDENTITY (secuencias).

Instrucciones de SQL de procedimiento

Netezza usa el lenguaje de programación NZPLSQL para trabajar con procedimientos almacenados. NZPLSQL se basa en el lenguaje PL/pgSQL de Postgres. En esta sección, se describe cómo convertir las instrucciones de SQL de procedimiento que se usan en procedimientos, funciones y activadores almacenados de Netezza a BigQuery.

Declaración CREATE PROCEDURE

Netezza y BigQuery admiten la creación de procedimientos almacenados mediante la declaración CREATE PROCEDURE. Para obtener más información, consulta Trabaja con procedimientos almacenados de SQL.

Declaración y asignación de variables

Netezza BigQuery Descripción
DECLARE var datatype(len) [DEFAULT value]; DECLARE Declarar la variable.
SET var = value; SET Asigna valor a la variable

Controladores de excepciones

Netezza admite controladores de excepciones que se pueden activar para ciertas condiciones de error. BigQuery no es compatible con los controladores de condiciones.

Netezza BigQuery Descripción
EXCEPTION No compatible Declara el controlador de excepciones de SQL para detectar errores generales.

Instrucciones de SQL dinámicas

Netezza admite consultas en SQL dinámicas dentro de procedimientos almacenados. BigQuery no admite instrucciones en SQL dinámicas.

Netezza BigQuery Descripción
EXECUTE IMMEDIATE sql_str; EXECUTE IMMEDIATE sql_str; Ejecuta SQL dinámico.

Instrucciones de flujo de control

Netezza BigQuery Descripción
IF THEN ELSE STATEMENT
IF condición
THEN ...
ELSE ...
END IF;
IF condición
THEN ...
ELSE ...
END IF;
Ejecuta de manera condicional.
Control iterativo
FOR var AS SELECT ...
DO stmts END FOR;
FOR var AS cur CURSOR
FOR SELECT ...
DO stmts END FOR;
No compatible Itera en una colección de filas.
Control iterativo
LOOP stmts END LOOP;
LOOP
sql_statement_list END LOOP;
Bloque de bucle de declaraciones.
EXIT WHEN BREAK Salir de un procedimiento.
WHILE *condition* LOOP WHILE condición
DO ...
END WHILE
Ejecuta un bucle de declaraciones hasta que falle una condición de tiempo.

Otras declaraciones y elementos del lenguaje de procedimiento

Netezza BigQuery Descripción
CALL proc(param,...) No compatible Ejecuta un procedimiento.
EXEC proc(param,...) No compatible Ejecuta un procedimiento.
EXECUTE proc(param,...) No compatible Ejecuta un procedimiento.

Instrucciones de SQL de varias instrucciones y varias líneas

Netezza y BigQuery admiten transacciones (sesiones) y, por lo tanto, admiten declaraciones separadas por punto y coma que se ejecutan juntas de manera coherente. Para obtener más información, consulta Transacciones de varias declaraciones.

Otras instrucciones de SQL

Netezza BigQuery Descripción
GENERATE STATISTICS Genera estadísticas para todas las tablas en la base de datos actual.
GENERATE STATISTICS ON table_name Genera estadísticas para una tabla específica.
GENERATE STATISTICS ON table_name(col1,col4) Usa funciones estadísticas, como MIN, MAX, AVG,, etc., usa la IU o la API de Cloud Data Loss Prevention. Genera estadísticas para columnas específicas en una tabla.
GENERATE STATISTICS ON table_name APPROX_COUNT_DISTINCT(col) Muestra la cantidad de valores únicos para las columnas.
INSERT INTO table_name INSERT INTO table_name Inserta una fila.
LOCK TABLE table_name FOR EXCLUSIVE; No compatible Bloquea fila.
SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL ... BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia y aislamiento de transacción. Define el nivel de aislamiento de la transacción.
BEGIN TRANSACTION
END TRANSACTION
COMMIT
BigQuery siempre usa el aislamiento de instantáneas. Para obtener más información, consulta Garantías de coherencia y aislamiento de transacción. Define el límite de transacción para las solicitudes de varias declaraciones.
EXPLAIN ... No compatible. Funciones similares en el plan de consultas y el cronograma Muestra el plan de consultas para una declaración SELECT.
Metadatos de vistas de usuario
metadatos de vistas del sistema
SELECT
* EXCEPT(is_typed)
FROM
mydataset.INFORMATION_SCHEMA.TABLES;

BigQueryEsquema de información
Consulta objetos en la base de datos

Garantías de coherencia y aislamiento de transacción

Tanto Teradata como BigQuery son atómicos, es decir, cumplen con el estándar ACID en un nivel por transformación en muchas filas. Por ejemplo, una operación MERGE es atómica por completo, incluso con varios valores insertados.

Transacciones

Netezza acepta sintácticamente los cuatro modos de aislamiento de transacción de ANSI SQL. Sin embargo, sin importar el modo que se especifique, solo se usa el modo SERIALIZABLE, que proporciona el mayor nivel de coherencia posible. Este modo también evita lecturas no sincronizadas, no repetibles y fantasmas entre transacciones simultáneas. Netezza no usa el bloqueo convencional para aplicar la coherencia. En su lugar, usa la verificación de dependencia de serialización, una forma de control de simultaneidad optimista para revertir automáticamente la última transacción cuando dos transacciones intentan modificar los mismos datos.

BigQuery también admite transacciones. BigQuery ayuda a garantizar el control de simultaneidad optimista (gana el primero en confirmarse) con el aislamiento de instantáneas, de modo que una consulta lea los últimos datos que se confirmaron antes de comenzar la consulta. Este enfoque garantiza el mismo nivel de coherencia por fila, por transformación y entre filas dentro de la misma declaración DML y evita los interbloqueos. En el caso de varias actualizaciones de DML en la misma tabla, BigQuery cambia al control de simultaneidad pesimista. Los trabajos de carga pueden ejecutarse de forma independiente por completo y agregarse a las tablas.

Revertir

Netezza admite la declaración ROLLBACK para anular la transacción actual y revertir todos los cambios realizados en la transacción.

En BigQuery, puedes usar la sentencia ROLLBACK TRANSACTION.

Límites de bases de datos

Límite Netezza BigQuery
Tablas por base de datos 32,000 Sin restricciones
Columnas por tabla 1600 10000
Tamaño máximo de fila 64 KB 100 MB
Longitud del nombre de la columna y la tabla 128 bytes 16,384 caracteres Unicode
Filas por tabla Ilimitado Ilimitado
Longitud máxima de la solicitud de SQL 1 MB (extensión máxima sin resolver de la consulta de SQL estándar).

12 MB (extensión máximaresuelta de la consulta en SQL estándar y heredado).

Transmisión:
10 MB (límite de tamaño de la solicitud HTTP)
10,000 (máximo de filas por solicitud)
Tamaño máximo de solicitudes y respuestas 10 MB (solicitud) y 10 GB (respuesta) o casi sin límite si usas la paginación o la API de Cloud Storage.
Cantidad máxima de sesiones simultáneas 63 transacciones de lectura y escritura simultáneas 2000 conexiones simultáneas al servidor. 100 consultas simultáneas (se pueden generar con una reserva de ranura) y 300 solicitudes a la API simultáneas por usuario

¿Qué sigue?