lunes, 17 de abril de 2023

Oracle 23c - Sentencias SELECT sin cláusula FROM

En este artículo vamos a conocer un cambio introducido en Oracle Database 23c en la sintaxis de SQL y PL/SQL que permiten ejecutar sentencias SELECT sin la clausula FROM.


SELECT FROM DUAL

Como muchos de ustedes sabrán, hay muchas ocasiones donde deseamos mostrar algún dato que no proviene de una tabla en particular, siendo un ejemplo muy frecuente el querer obtener la fecha usando la función SYSDATE, o el resultado de cualquier otra función o expresión que no requiera datos de una tabla.

Para poder ejecutar un SELECT que no accede a ninguna tabla en particular, Oracle provee desde sus primeras versiones una tabla llamada DUAL que contiene una sola fila, la cual es utilizada para poder ejecutar un SELECT que no accede a datos de una tabla en particular, ya que la clausula FROM es obligatoria (o lo era, hasta Oracle Database 23c).

Con la sintaxis tradicional, para ver la fecha actual vamos a ejecutar lo siguiente:

SELECT SYSDATE FROM DUAL;
Y obtendremos el siguiente resultado:

SYSDATE ------------------- 14-04-2023 18:52:22
Desde Oracle 10g, el optimizador de SQL de Oracle reconoce que efectivamente no queremos acceder a los datos de la tabla DUAL sino que sólo queremos devolver el resultado de una función, por lo que implementa una optimización que evita tener que acceder a la tabla. Esa optimización se llama FAST DUAL y la podemos corroborar viendo el plan de ejecución de la sentencia anterior:


Si bien esta mejora implica una ventaja en performance, todavía era necesario escribir la clausula FROM usando la tabla DUAL para que Oracle pudiera ejecutar este tipo de sentencias SELECT que no requieren acceder a ninguna tabla.

SELECT sin FROM en Oracle 23c

Oracle 23c ahora permite ejecutar sentencias SELECT sin necesidad de especificar una clausula FROM, como podemos ver a continuación:

SELECT SYSDATE;

Con esta nueva sintaxis simplificada obtendremos también el resultado deseado:

SYSDATE ------------------- 14-04-2023 18:58:58
Por supuesto, se puede seguir usando la clausula FROM dual, pero ya no es requerido.

SELECT sin FROM en PL/SQL

Este cambio de Oracle Database 23c puede utilizase también en PL/SQL. Acá podemos ver un ejemplo donde usamos la función USER para mostrar que usuario esta conectado a la base de datos:



Que sucede en el trasfondo?

Para los que le genera interés saber como se implementa este cambio, podemos probar de ver el plan de ejecución de la sentencia para ver que operación realiza efectivamente. Si intentamos hacerlo con SQL Developer, recibiremos el siguiente error (ya que el cambio en la sintaxis todavía no es reconocido por esta versión de SQL Developer):


Pero podemos usar la funcionalidad EXPLAIN PLAN directamente para ver el plan de ejecución:

EXPLAIN PLAN FOR SELECT SYSDATE; SELECT plan_table_output FROM TABLE(dbms_xplan.display('plan_table',null,'basic'));

Al usar EXPLAIN PLAN y consultar el resultado del mismo, obtendremos lo siguiente (el resaltado en rojo fue agregado por mi):

Explained. PLAN_TABLE_OUTPUT --------------------------------------------------- Plan hash value: 1388734953 --------------------------------- | Id | Operation | Name | --------------------------------- | 0 | SELECT STATEMENT | | | 1 | FAST DUAL | | ---------------------------------
Aquí nos queda claro que el plan es el mismo que cuando usamos la cláusula FROM, ya que está usando FAST DUAL. Esto nos demuestra que Oracle internamente transforma la sentencia para incluir FROM DUAL, sin necesidad de que nosotros lo escribamos en el código.

Conclusión

Esta nueva funcionalidad nos permite escribir sentencias SELECT más cortas sin necesidad de usar la tabla DUAL, lo cual suele generar desconcierto en aquellas personas que recién se introducen en el mundo Oracle.

Si desean conocer más sobre Oracle 23c, es recomendable que vean estos artículos en este blog como punto de partida:

Adicionalmente, pueden consultar todos los artículos relacionados a Oracle Database 23c agrupados en en el tag Database 23c.


No hay comentarios.:

Publicar un comentario