DynamoDB PartiQL vs SQL: qué cambia (y qué se rompe)
La mayor fuente de confusión con PartiQL de DynamoDB — tanto para humanos como para asistentes de IA — es tratarlo como SQL relacional. No lo es. PartiQL es una superficie compatible con SQL sobre las operaciones existentes de DynamoDB, no un motor de consultas capaz de unir, agrupar o agregar. Las palabras clave familiares esconden una máquina muy distinta por debajo.
El modelo mental
Cada sentencia PartiQL se compila a una de las operaciones nativas de DynamoDB:
| Lo que escribes | DynamoDB ejecuta |
|---|---|
SELECT … WHERE PK = … | GetItem o Query |
SELECT … (sin PK) | Scan (lee la tabla entera) |
INSERT INTO … | PutItem |
UPDATE … WHERE PK=… AND SK=… | UpdateItem (un ítem) |
DELETE … WHERE PK=… AND SK=… | DeleteItem (un ítem) |
No hay ningún planificador capaz de leer de dos tablas, construir un hash join o
plegar filas en un COUNT. Si una operación no se asigna a un único Get/Query/Scan/
Put/Update/Delete, PartiQL sencillamente no puede expresarla. Esa es toda la historia
— todo lo de abajo es una consecuencia de este único hecho.
El mismo mapeo, como un flujo — la cláusula WHERE decide si un SELECT es un
Query barato o un Scan de tabla completa:
Cada sentencia se resuelve en exactamente una operación nativa — ese mapeo uno a uno es la razón por la que PartiQL no puede unir, agrupar ni agregar.
Qué cambia — característica por característica
Cada que el SQL Workbench de DynoTable sí puede ejecutar está marcado. El Workbench materializa tus tablas a través del motor de consultas real de DynamoDB y ejecuta SQL real encima — SQL dentro de las reglas de patrones de acceso de DynamoDB.
| Característica | SQL estándar | DynamoDB PartiQL | DynoTable Workbench |
|---|---|---|---|
JOIN … ON … | INNER / LEFT (a una PK o GSI partition key) | ||
RIGHT / FULL / CROSS / comma-join | |||
| Self-join | (todavía no) | ||
| Subconsultas / tablas derivadas | |||
CTEs (WITH …) | |||
UNION / INTERSECT / EXCEPT | |||
GROUP BY / HAVING | |||
Agregados (COUNT/SUM/AVG/MIN/MAX) | |||
DISTINCT | |||
CASE / CAST | |||
| Funciones de ventana | |||
ORDER BY | cualquier columna | solo sort key (necesita WHERE con partition key) | cualquier columna |
LIMIT | inline (usa el parámetro limit de la petición) | ||
LIKE | (usa contains / begins_with) | ||
IS NULL / IS NOT NULL | (usa attribute_not_exists / attribute_exists) | ||
SELECT * sin una PK | escanea | Scan silencioso de tabla completa | (con visibilidad de costo) |
Qué se rompe, y por qué
Estos son los fallos que el validador de PartiQL de DynoTable señala antes de que la consulta llegue a la red — cada uno se remonta a una restricción real de DynamoDB.
SELECT *sin una partition key es unScanoculto. PartiQL no dará error; simplemente lee cada ítem y filtra después, que es el clásico cepo de costo Query-vs-Scan detrás de una sintaxis amigable.UPDATE/DELETEnecesitan la clave primaria completa. Se asignan a unUpdateItem/DeleteItemde un solo ítem, así que elWHEREdebe fijar la partition key (y la sort key, en una tabla con clave compuesta). No puedes "actualizar todas las filas donde status = 'open'" en una sola sentencia.- Las comillas dobles son identificadores, no cadenas. PartiQL de DynamoDB sigue
el estándar SQL aquí:
"name"es un nombre de columna/tabla,'name'es un valor de cadena. Entrecomillar un valor con comillas dobles es el error de principiante más común — el mensaje del validador es literalmente "Double quotes delimit identifiers in DynamoDB PartiQL, not strings. Use single quotes for string values." INusa corchetes, no paréntesis:WHERE pk IN ['a','b'], con un tope de 50 valores de PK / 100 valores que no son clave.- Sin
JOIN, sin agregados. No hay ningún motor que combine tablas o pliegue filas. Este es el compromiso del single-table-design: modelas para tus patrones de acceso por adelantado porque la capa de consultas no puede reformar los datos después.
Por qué los asistentes de IA se equivocan en esto
Los LLM están entrenados sobre océanos de SQL relacional, así que emiten con
confianza JOIN, GROUP BY, LIKE, LIMIT inline y literales de cadena con
comillas dobles contra DynamoDB — todo lo cual DynamoDB rechaza. El autofix de
consultas de modelo de DynoTable existe precisamente porque los modelos baratos
producen estos patrones de forma fiable: elimina las comillas con doble escape,
reescribe LIKE '%x%' → contains, IS NULL → attribute_not_exists, y eleva el
LIMIT inline al parámetro de la petición. Si tu IA está generando "PartiQL" que se
lee como Postgres, esa es la señal.
El SQL Workbench de DynoTable: las consultas que PartiQL no puede ejecutar
Cuando realmente necesitas un JOIN o un GROUP BY, el SQL Workbench de
DynoTable es la respuesta. Valida el lado destino de cada JOIN contra una partition
key, materializa las filas unidas a través del motor real Query/Scan de DynamoDB, y
luego ejecuta tu SQL completo (agregados, GROUP BY, DISTINCT, CASE, CAST)
encima — SQL dentro de las reglas de patrones de acceso de DynamoDB.
-- Runs in the DynoTable Workbench (NOT in PartiQL):
SELECT c.country, COUNT(*) AS orders, SUM(o.total) AS revenue
FROM orders o
INNER JOIN customers c ON o.customerId = c.PK
GROUP BY c.country
ORDER BY revenue DESCRestricciones honestas (el Workbench impone el modelo de acceso de DynamoDB, no pretende ser Postgres):
- Solo
INNER JOINyLEFT JOIN— el atributo destino delONdebe ser una partition key o una GSI partition key. SinRIGHT/FULL/CROSS/ comma-join. - Aún sin self-joins, sin subconsultas, sin tablas derivadas, sin funciones de ventana.
- Los joins y las proyecciones operan sobre atributos escalares.
Si solo necesitas componer condiciones y expresiones de clave para la API en bruto, el
DynamoDB Expression Builder genera el
FilterExpression / KeyConditionExpression correcto sin la superficie de PartiQL en
absoluto. Para PartiQL bien hecho, mira los ejemplos de PartiQL
resueltos; para dimensionar cuánto costará cualquier consulta, usa la
calculadora de tamaño de ítem. Ten en cuenta
que PartiQL nunca cambia el formato de red — los valores siguen viajando como
DynamoDB-JSON. ¿Eligiendo un cliente? Mira cómo se posiciona el
Workbench frente a una GUI sencilla de DynamoDB o
Dynobase.
Preguntas frecuentes
¿PartiQL es lo mismo que SQL?
No. PartiQL es un lenguaje de consultas compatible con SQL, pero en DynamoDB solo
expone operaciones que se asignan a un único Get/Query/Scan/Put/Update/Delete. No
tiene joins, agregados, subconsultas ni GROUP BY.
¿Puede PartiQL de DynamoDB hacer un JOIN?
No. PartiQL de DynamoDB no puede unir tablas. El SQL Workbench de DynoTable sí puede
ejecutar INNER/LEFT JOIN (a una partition key o GSI partition key) materializando
los datos a través del motor de consultas real de DynamoDB.
¿PartiQL de DynamoDB admite GROUP BY o COUNT?
No — no hay agregados ni GROUP BY en PartiQL de DynamoDB. Usa el SQL Workbench de
DynoTable para consultas COUNT/SUM/AVG/GROUP BY/HAVING.
¿Por qué mi SELECT * cuesta tanto?
Sin una partition key en el WHERE, PartiQL ejecuta un Scan de tabla completa y
mide cada ítem leído antes de aplicar el filtro. Añade un predicado de partition key
para convertirlo en un Query.
¿Debería usar comillas simples o dobles en PartiQL?
Comillas simples para valores de cadena ('CUSTOMER#42'), comillas dobles para
identificadores como nombres de tabla y de atributo ("AppData"). Entrecomillar un
valor con comillas dobles es el error más común de PartiQL.
¿Listo para ejecutar SQL real contra DynamoDB? Descarga DynoTable y abre una pestaña de Workbench.