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 yUNION
- 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
- Crea una carpeta local, por ejemplo: sql-iris-demo/
- Clonamos el repo https://github.com/kathitadurcon/sql-iris-demo
- Abre una terminal y navega a esa carpeta
- Ejecuta:
docker build -t iris-sql-demo .
docker run -d --name iris-sql -p 52773:52773 -p 1972:1972 iris-sql-demo
- Inicia sesión en la terminal de IRIS:
docker exec -it iris-sql iris session IRIS
- 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 |
Ahora Vamos con el VIDEO