Artículo
· 27 mayo, 2025 Lectura de 7 min

Uso de SQL Dinámico vs SQL Embebido en InterSystems IRIS y Plan de ejecuciónContestant

InterSystems IRIS permite ejecutar consultas SQL directamente desde ObjectScript mediante:

  • SQL Embebido (Embedded SQL): consultas SQL compiladas en tiempo de desarrollo, con chequeo de tipos y mayor eficiencia.
  • SQL Dinámico (Dynamic SQL): permite construir y ejecutar sentencias SQL en tiempo de ejecución, ideal para casos flexibles o condicionales.

Que es SQL (Structured Query Language) es un lenguaje estándar utilizado para interactuar con bases de datos relacionales. Permite realizar operaciones como:

  • Consultar datos (SELECT)
  • Insertar registros (INSERT)
  • Actualizar datos (UPDATE)
  • Eliminar registros (DELETE)
  • Crear y modificar estructuras (tablas, índices, vistas, etc.)

SQL es usado en...

  • Bases de datos tradicionales: Oracle, MySQL, SQL Server, PostgreSQL
  • Bases de datos modernas: InterSystems IRIS, Snowflake, BigQuery, etc.
  • Aplicaciones web y móviles para acceder a datos desde backend o APIs

 

¿Por qué es importante?

  • Es el lenguaje universal para bases de datos
  • Permite extraer información útil desde grandes volúmenes de datos
  • Es compatible con herramientas de BI, ETL, dashboards, análisis y más

Según la documentación de intersystems en el siguiente link pueden obtener mayor detalle https://docs.intersystems.com/irislatest/csp/docbook/DocBook.UI.Page.cls?KEY=GSQL

Incluye:

  • Sintaxis general de SQL
  • Consultas SELECT, INSERT, UPDATE, DELETE
  • Uso de índices
  • Funciones agregadas (COUNT, SUM, AVG, etc.)
  • JOIN, subconsultas y UNION
  • Optimización de consultas
  • Vistas y procedimientos almacenados

 

En este artículo exploraremos ambos enfoques con ejemplos prácticos y su uso en clases definidas en IRIS.

Pero optimizar consultas SQL es una de las tareas más importantes para mantener el buen rendimiento de una aplicación basada en InterSystems IRIS. Muchas veces, pequeñas mejoras en el diseño de la consulta o en los índices pueden producir mejoras significativas en velocidad, especialmente cuando se trabaja con grandes volúmenes de datos.

En este artículo técnico, exploraremos también cómo usar El Plan de Ejecución, cómo interpretar los planes de ejecución y qué prácticas seguir para escribir consultas eficientes.

También agregue imagenes y detalle del paso a paso para poder probar y ejecutar un caso práctico con clases cargadas y un proyecto en Github, el cual tiene toda la estructura de clases y ejecución para usar con Docker

Definición de clase de ejemplo

Primero, crearemos una clase de ejemplo para almacenar datos de pacientes:

Class Demo.Paciente Extends (%Persistent)

{

    Property Nombre As %String;

    Property Edad As %Integer;

    Property Diagnostico As %String;

}

 

Y crearemos otra clase de ejemplo para almacenar datos de pacientes pero con índice:

Class Demo.PacienteIndice Extends (%Persistent)

{

    Property Nombre As %String;

    Property Edad As %Integer;

    Property Diagnostico As %String;

 

    Index EdadIndex On Edad;

}

 

Cómo funciona la ejecución de consultas en IRIS

El motor SQL de InterSystems IRIS convierte una consulta en un plan de ejecución, que define cómo se van a recuperar los datos. Este plan puede incluir:

  • Escaneos completos de tabla
  • Uso de índices
  • Ordenamientos intermedios
  • Tipos de join (nested loop, merge join, etc.)

Entender ese plan permite mejorar consultas que de otro modo serían lentas.

 

Continuamos con el script para insertar los datos  

https://github.com/kathitadurcon/sql-iris-demo/blob/main/sql-iris-demo/i...

SQL Embebido

¿Qué es?

SQL Embebido te permite insertar consultas SQL dentro del código ObjectScript. Estas consultas se compilan con el código, proporcionando rendimiento y verificación anticipada.

Ahora un ejemplo práctico

Class Demo.SQLEmbebido

{

    ClassMethod BuscarPacientes(minEdad As %Integer)

    {

        &sql(DECLARE c CURSOR FOR

              SELECT Nombre, Edad FROM Demo.Paciente WHERE Edad >= :minEdad)

 

        &sql(OPEN c)

        While (SQLCODE = 0) {

            &sql(FETCH c INTO :nombre, :edad)

            If (SQLCODE = 0) {

                Write "Paciente: ", nombre, " (", edad, " años)", !

            }

        }

        &sql(CLOSE c)

    }

}

Ejecución:

USER>Do ##class(Demo.SQLEmbebido).BuscarPacientes(35)

Resultado:

Paciente: Luis (45 años)

SQL Dinámico

¿Qué es?

SQL Dinámico te permite construir sentencias SQL en tiempo de ejecución, ideal para situaciones en las que no sabes con anticipación los filtros o campos que se usarán.

Ejemplo práctico

Class Demo.SQLDinamico

{

    ClassMethod BuscarPorDiagnostico(diagnostico As %String)

    {

        Set consulta = "SELECT Nombre, Edad FROM Demo.Paciente WHERE Diagnostico = ?"

        Set rs = ##class(%SQL.Statement).%New()

        Set sc = rs.%Prepare(consulta)

        If $$$ISERR(sc) {

            Write "Error preparando consulta",!

            Quit

        }

 

        Set r = rs.%Execute(diagnostico)

        While r.%Next() {

            Write "Paciente: ", r.%Get("Nombre"), " (", r.%Get("Edad"), " años)", !

        }

    }

}

Ejecución:

Do ##class(Demo.SQLDinamico).BuscarPorDiagnostico("Diabetes")

Resultado:

Paciente: Luis (45 años)

 

 Comparación rápida

Característica

SQL Embebido

SQL Dinámico

Validación en compilación 

 Sí

 No (se evalúa en ejecución)

Rendimiento

 Rápido

 Ligeramente más lento

Flexibilidad

 Menor

 Alta (puedes construir consultas)

Uso recomendado

Lógica fija y conocida    

Filtros condicionales o configurables

 

Tanto el SQL Embebido como el Dinámico son herramientas valiosas en InterSystems IRIS. Puedes usarlos según el contexto:

  • ¿Consultas conocidas, validadas y frecuentes? Usa SQL Embebido.
  • ¿Consultas variables o configurables? Usa SQL Dinámico.

 

Sigamos con un caso práctico!

Que necesitamos?

  • Un contenedor Docker con IRIS Community Edition.
  • Código fuente .cls con los ejemplos.
  • Script de inicialización para poblar la base de datos.
  • Instrucciones paso a paso.

Estructura del proyecto

sql-iris-demo/

├── Dockerfile

├── iris.script

└── cls/

    ├── Demo.Paciente.cls

    ├── Demo.SQL_Embebido.cls

    └── Demo.SQL_Dinamico.cls

Cómo ejecutar la demo

  1. Crea una carpeta local, por ejemplo: sql-iris-demo/
  2. Clonamos el repo https://github.com/kathitadurcon/sql-iris-demo
  3. Abre una terminal y navega a esa carpeta
  4. Ejecuta:

docker build -t iris-sql-demo .

docker run -d --name iris-sql -p 52773:52773 -p 1972:1972 iris-sql-demo

  1. Inicia sesión en la terminal de IRIS:

docker exec -it iris-sql iris session IRIS

  1. Dentro de la sesión, ejecuta:

Do ##class(Demo.SQLEmbebido).BuscarPacientes(35)

Do ##class(Demo.SQLDinamico).BuscarPorDiagnostico("Diabetes")

 

Salida esperada

Paciente: Luis (45 años)

Paciente: Luis (45 años)

 

Portal de Gestión para ver el Plan de ejecución

Entramos al Portal de Gestión, normalmente usamos usuario SuperUser clave SYS y nos pedirá cambiar la clave

http://localhost:52773/csp/sys/%25CSP.Portal.Home.zen

Vamos a SQL

Y nos aseguramos que el NameSpace sea USER

 

Anteriormente creamos dos clase Demo.Paciente y la clase Demo.PacienteIndice que tiene creado el índice para edad

Index EdadIndex On Edad;

 

Ejecutamos lo siguiente
SELECT

ID, Diagnostico, Edad, Nombre

FROM Demo.Paciente

WHERE Edad=32

 

Resultado

Ejecutamos lo siguiente

SELECT

ID, Diagnostico, Edad, Nombre

FROM Demo.PacienteIndice

WHERE Edad=32

 

Resultado

Interpretación:

Al agregar los indices a una clase y después hacer las consultas el costo relativo baja, a mayor volumen de datos se ve reflejado con respuestas más rápidas.

 

Reescritura de consultas para mejorar rendimiento

Algunos consejos útiles:

Problema

Solución sugerida

WHERE YEAR(Fecha) = 2023  

WHERE Fecha BETWEEN '2023-01-01' AND '2023-12-31'

SELECT *

Seleccionar solo las columnas necesarias

WHERE sin condición clara

Asegurarse de usar claves o índices en join o where

Comentarios (0)1
Inicie sesión o regístrese para continuar