查找

記事
· 2024年5月29日 7m read

Optimización de consultas SQL en IRIS

¡Hola a todos los estimados miembros de la comunidad de desarrolladores de InterSystems en español!

Aunque suelo consultar la comunidad de desarrolladores y alguna vez he dejado alguna pregunta por aquí, este será mi primer artículo y qué mejor ocasión para hacerlo que participando en el 3er concurso de artículos técnicos.

El tema que trataré en este artículo será el de las diferentes herramientas que nos proporciona InterSystems IRIS para optimizar tanto las bases de datos como las consultas que ejecutamos así como los nuevos tipos de almacenamiento y de datos.

 

Optimizando nuestras consultas SQL

Para este artículo he montado en una instancia de InterSystems IRIS Community un pequeño ejemplo importando un CSV con 5 millones de registros de hipotéticas ventas realizadas a lo largo de los años en diferentes ciudades.

La estructura de las tablas será muy sencilla, pero suficiente para realizar las pruebas que necesitamos, disculpad los nombres, pero ya sabéis que no hay nada más permanente que una solución temporal:

Sales.Record

SumaVentasMensuales CodigoCiudad Anyo Mes
454323 1 1995 3
... ... ... ...

Concurso.Localidad

CodigoCiudad Ciudad CodigoComunidad Comunidad
1 Valladolid 1 Castilla y León
... ...    

Vamos a intentar extraer cual es la media histórica de las ventas de una ciudad como Valladolid en un año determinado:

Vamos a ver lo que tarda nuestra consulta en devolvernos la media de ventas mensuales:

El resultado ha sido un poco más de 8 segundos en retornar el valor medio de las ventas mensuales Si veis disponemos de una opción que nos permitirá conocer el plan de ejecución de la consulta (Mostrar plan). Veamos paso a paso que va a hacer nuestra consulta:

Veamos el módulo H que tiene una información bastante intesante:

• Divide master map Concurso.Localidad(L).IDKEY into subranges of IDs.

• Call module A in parallel on each subrange, piping results into temp-file D.
 

Estas dos líneas lo que nos cuentan es que primeramente dividiremos la tabla Concurso.Localidad por rangos de ID y llamaremos al módulo A de forma paralela para cada brango obtenido, esta computación en paralelo implementada por defecto en IRIS acelerará nuestra consulta sin necesidad de indicarlo.

Como veis nuestra consulta es bastante costosa, ¿a qué es debido? Como podéis ver nuestra consulta está recorriendo por entero la tabla Concurso.Ventas con sus 5 millones de consultas y para cada fila le va a aplicar la condición de que la ciudad sea "Valladolid" y el año determinado. Esto como podéis imaginar no es lo más óptimo. ¿Cómo podríamos mejorar el rendimiento?

 

Añadiendo índices

Como bien sabréis, indexar una columna nos permitirá mejorar el rendimiento de aquellas consultas que contengan una condición sobre dicha consulta, por lo que vamos a probar incluyendo un índice sobre nuestra columna Anyo de nuestra tabla Sales.Record:

Creamos nuestro índice del tipo BITMAP ya que contendrá un conjunto bastante pequeño de diferentes valores y mejorará el rendimiento de nuestras consultas sobre un índice normal (aquí podéis leer la documentación asociada).

Este índice no va a modificar el plan de ejecución, pero lo que hará será acelerar la consulta, veamos el resultado:

Como podemos ver nuestro rendimiento ha mejorado, echemos un vistazo al plan de consulta con el índice incluido:

Como podéis ver, en el módulo B ya no leemos la tabla Concurso.Ventas entera con sus 5 millones de registros, si no que mediante el índice extraemos previamente todos aquellos valores con el Anyo 1996, de tal forma que excluimos de la lectura los no coincidentes.

¿Buena mejora, no? Pero no nos quedemos aquí, podemos mejorar más aún con el...

 

Optimizador de consultas

InterSystems IRIS nos proporciona un optimizador de consultas por defecto que utilizará determinadas herramientas de cara a definir el plan de consulta, no es lo mismo realizar una consulta directamente sobre la tabla con 5 millones de registros de ventas que hacerlo primero sobre la de localidades y a continuación sobre la de ventas excluyendo los registros que no pertenezcan a la localidad solicitada.

La forma más sencilla de optimizar las tablas es ejecutando un sencillo TUNE TABLE sobre la tabla que queremos optimizar. Este comando nos configurará en la definición de la clase de nuestra tabla los siguientes parámetros:

  • ExtentSize: este parámetro contendrá el número de filas de la tabla, podemos definirlo nosotros mismos poniendo el valor que queramos siempre y cuando guarde una proporción con los valores reales respecto a las demás tablas,
  • Selectivity: el porcentaje que representa cada distinto valor de la columna respecto al total, es decir, si tenemos sólo 2 tipos de valores su Selectivity será el 50%, si tenemos 64 como el caso de las localidades será 1.56% si no tenemos valores repetidos.
  • BlockCount: con el valor estimado de bloques del mapa que usará por cada mapa de SQL basado en el ExtentSize.

Echemos un vistazo a la sección Storage de la clase Concurso.Ventas antes de aplicaciar el tunning a la tabla:

Storage Default
{
<Data name="VentasDefaultData">
<Value name="1">
<Value>%%CLASSNAME</Value>
</Value>
<Value name="2">
<Value>SumaVentasMensuales</Value>
</Value>
<Value name="3">
<Value>%Source</Value>
</Value>
<Value name="4">
<Value>Mes</Value>
</Value>
<Value name="5">
<Value>Año</Value>
</Value>
<Value name="6">
<Value>CodigoCiudad</Value>
</Value>
</Data>
<DataLocation>^Concurso.VentasD</DataLocation>
<DefaultData>VentasDefaultData</DefaultData>
<ExtentSize>2000000</ExtentSize>
<IdLocation>^Concurso.VentasD</IdLocation>
<IndexLocation>^Concurso.VentasI</IndexLocation>
<SQLMap name="AñoIdx">
<BlockCount>-10634</BlockCount>
</SQLMap>
<StreamLocation>^Concurso.VentasS</StreamLocation>
<Type>%Storage.Persistent</Type>
}

Como podéis ver tiene una serie de valores por defecto que no ayudarán a mejorar nuestras consultas sobre ella. Ejecutemos el comando TUNE TABLE para ambas tablas y veamos que consecuencias tiene tanto sobre nuestra clase como sobre nuestra consulta.

Veamos nuestra sección Storage:

Storage Default
{
...
<ExtentSize>6468826</ExtentSize>
<Property name="Año">
<AverageFieldSize>4</AverageFieldSize>
<Histogram>...</Histogram>
<Selectivity>2.9412%</Selectivity>
</Property>
<Property name="CodigoCiudad">
<AverageFieldSize>6.7</AverageFieldSize>
<Histogram>...</Histogram>
<Selectivity>3.3333%</Selectivity>
</Property>
<Property name="Mes">
<AverageFieldSize>3</AverageFieldSize>
<Histogram>...</Histogram>
<Selectivity>8.3333%</Selectivity>
</Property>
<Property name="SumaVentasMensuales">
<AverageFieldSize>5</AverageFieldSize>
<Histogram>...</Histogram>
<OutlierSelectivity>.000393:794574</OutlierSelectivity>
<Selectivity>0.0002%</Selectivity>
</Property>
<SQLMap name="$Ventas">
<BlockCount>-48</BlockCount>
</SQLMap>
...
}

Ahora tanto Concurso.Localidad como Concurso.Ventas están correctamente configuradas, veamos su impacto en el plan de ejecución de la consulta:

La mejora es de un 31% respecto a la consulta anterior, y su coste es menos de la mitad de la consulta original, veamos cuanto tarda ahora nuestra consulta:

Así es, como podéis ver hemos pasado de 8 segundos inicialmente a 4.6 incluyendo los índices adecuados a nuestras tablas a poco menos de 1 segundo aplicando TUNE TABLES.

Podéis consultar en está página más posibles optimizaciones para vuestras consultas como por ejemplo %FirstTable, que forzará al optimizador a leer la tabla seleccionada en primer lugar y que puede resultar interesante para limitar las lecturas sobre aquellas tablas de grandes dimesiones filtradas por valores procedentes de la seleccionada.

 

Almacenamiento columnar o Columnar Storage

InterSystems IRIS no sólo nos proporciona las anteriores herramientas para sacarle el máximo partido a nuestras consultas, sino que también pone a nuestro alcance la funcionalidad de almacenamiento columnar destinado para casos como el ejemplo utilizado para este artículo, grandes volúmenes de datos superior al millón de registros sobre el que queremos realizar operaciones de agregación como SUM o AVG.

Este almacenamiento columnar lo podemos definir a nivel de tabla o bien a nivel de columna, como más nos interese. Para que se entienda mejor que es el almacenamiento columnar usaré una imagen de la propia documentación de ISC.

Atendiendo a la explicación podréis ver como para nuestro ejemplo puede ser interesante definir la columna de ventas mensuales como un almacenamiento de tipo columnar, para ver las diferencias he vuelto a montar de 0 las tablas sin índices y sin la ejecución del TUNE TABLE.

El único cambio necesario en Concurso.Ventas para que nuestra columna SumaVentasMensuales utilice el almacenamiento columnar será definir la siguiente propiedad:

Property SumaVentasMensuales As %Integer(STORAGEDEFAULT = "columnar");

Comprobemos ahora el plan de la consulta.

El coste de nuestra consulta con almacenamiento columnar es de 65.487.882, mientras que con almacenamiento en filas era de 100.529.682, una mejora sustancial únicamente modificando el tipo de almacenamiento a utilizar. Veamos cuanto tarda la consulta en ejecutarse:

Algo más de 1 segundo comparado con los más de 8 segundos que tardó con el almacenamiento vectorial.

 

Cierre y despedida

Aquí terminamos este artículo sobre optimización de consultas SQL con InterSystems IRIS que espero os haya resultado de utilidad.

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年5月29日 3m read

Wall-M : Performe consultas semânticas na caixa de entrada do seu email e tenha respostas acuradas com citações de fontes

 

Introdução

Com o crescimento da Gen AI, acreditamos que agora os usuários devem ser aptos a acessar dados não estruturados de uma maneira muito mais simples. A maioria das pessoas tem muitos emails que não conseguem dar conta. Por exemplo, em investimentos/trading, os profissionais dependem de decisões rápidas que levem em consideração o máximo de informação possível. Da mesma maneira, empregados seniores em uma startup lidando com muitos times e disciplinas podem ter dificuldade em organizar todos os emails que recebem. Esses problemas comuns podem ser resolvidos usando GenAI e ajudar a fazer suas vidas mais fáceis e organizadas. A possibilidade de alucinação em modelos GenAI pode ser assustadora, e é aí que a pesquisa RAG + Hybrid aparece para salvar o dia. É isso que nos inspirou a construir o produto WALL-M (Work Assistant LL-M: Assistente de trabalho LLM - Large Language Model: Grandes modelos de linguagem).  No HackUPC 2024, desenvolvemos o WALL-M como parte do desafio de pesquisa por vetores InterSystems É uma plataforma de geração de recuperação aumentada (RAG - Retrieval Augmented Generation), desenhada para responder perguntas de forma acurada em emails com o mínimo de alucinações possíveis. Essa solução endereça o desafio de lidar com longos e numerosos emails, especialmente em áreas movidas pela velocidade, como investimento e trading, startups com muitos times e disciplinas, ou indivíduos que procuram administrar suas caixas de entrada cheias.

 

O que ele faz

Você pode carregar os emails da sua caixa de entrada e escolher filtrar por data e remetentes para definir o contexto para o LLM. Então, dentro do contexto, você pode escolher consultas específicas relacionadas aos emails escolhidos. Exemplo 1: ideias de trading baseadas em selecionar relatórios bancários ou relatórios de pesquisa de investimento. Exemplo 2: Um funcionário em uma companhia/startup pode pedir uma lista de itens de ação baseados nos emails relacionados a trabalho recebidos na última semana.


Depois disso, se você tiver quaisquer outras questões, também adicionamos um segmento para conversar com o Wall-M, baseado no contexto selecionado usando a consulta inicial. Isso assegura que todas as questões subsequentes também receberão respostas que não alucinam e incluem os emails fonte usados para gerar a resposta.
 

Como construimos ele

Frontend: Taipy

Backend: InterSystems Database, SQL

RAG + Vector Search: InterSystems Software, ChatGPT

Tools: LangChain, LlamaIndex

 

Desafios que encontramos

Aprender a usar com a framework (estrutura) de Python full-stack "TaiPy". Otimização de prompt para evitar alucinações. Usar LangChain para obter um padrão específico que inclui citações apontando para a fonte da resposta/alegação. Incompatibilidades entre diferentes ferramentas que queríamos usar.

Próximos passos para o Wall-M

Usar a prova de conceito para os casos de uso específicos e avaliar sua performance usando benchmarks  para validar a credibilidade do produto. Melhorar a integração com aplicações comuns de emails como Outlook e Gmail com usos personalizados para melhorar a utilidade do Wall-M.

Teste você mesmo

Nosso repositório GitHub : https://github.com/lars-quaedvlieg/WALL-M

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 2024年5月29日

InterSystems Ideas News #13

Hi Developers!

Welcome to Issue #13 of the InterSystems Ideas news! We dedicate this news bulletin to recently posted ideas:

​​​​✓ Most popular new ideas

✓ Recently posted ideas marked for implementation by Community members

✓ New ideas related to topics like Vector Search, GenAI and ML

 

More than 50 new ideas have been posted since the last news bulletin. We have selected and focused on the 3 most interesting groups to avoid overloading you with information. You can find all new ideas on the Ideas Portal if you're curious.

 The first group consists of the most popular new ideas based on the number of votes.

 The second group of ideas includes recently posted ideas that have "Community Opportunity" status, which means that they can be implemented by Developer Community members. You can implement them to join the Ideas portal Hall of Fame.

Finally, here are the ideas that were submitted as a part of the Vector Search, GenAI and ML programming contest.

 

👏 Many thanks to the authors of all ideas👏


✨Create your ideas, support ideas you like by comments and votes! Don't forget to advertise your ideas to Developer Community members. 🙏

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
お知らせ
· 2024年5月29日

[Video] Building a FHIR Facade

Hey Community,

Play the new video on InterSystems Developers YouTube:

⏯ Building a FHIR Facade @ Global Summit 2023

Learn how to use our FHIR architecture with existing backend systems to provide data through a production instead of or in addition to a resource repository. The following points are covered:

  • An overview of the architecture classes (repoManager, Interaction, InteractionStrategy);
  • Creating a foundation namespace+FHIR endpoint;
  • Implementing five Interaction methods (Read/Search/Add/ Delete/Update);
  • Mapping from and to FHIR in a production;
  • Validating the basic FHIR schema.

🗣 Presenter: @Keren Skubach, Senior Sales Engineer, InterSystems

Enjoy watching and look out for more videos! 👍

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください
記事
· 2024年5月29日 3m read

Descripción general de las opciones de uso de InterSystems IRIS® SQL - Parte 1

  

Hola comunidad,

En esta serie de artículos, exploraremos las siguientes opciones de uso de InterSystems SQL:

  1. SQL embebido

  2. SQL dinámico

  3. Class Queries


Descripción general SQL

InterSystems SQL proporciona un conjunto completo de funciones relacionales estándar, incluida la capacidad de definir esquemas de tablas, ejecutar consultas y definir y ejecutar procedimientos almacenados. Podéis ejecutar InterSystems SQL de forma interactiva desde el portal de gestión o mediante programación utilizando una interfaz de shell SQL. El SQL embebido permite incrustar sentencias SQL en el código ObjectScript, mientras que el SQL dinámico permite ejecutar sentencias SQL dinámicas desde ObjectScript en tiempo de ejecución.

 
1. SQL embebido

Dentro de ObjectScript, InterSystems SQL admite SQL embebido: la capacidad de colocar una declaración SQL dentro del cuerpo de un método (u otro código). Con Embedded SQL, podéis consultar un único registro o definir un cursor y utilizarlo para consultar varios registros. El SQL embebido se compila. Por defecto, se compila la primera vez que se ejecuta (tiempo de ejecución), no cuando se compila la rutina que lo contiene. El SQL embebido es bastante potente cuando se utiliza junto con la capacidad de acceso a objetos de InterSystems IRIS.


2. SQL Dinámico

SQL Dinámico se refiere a las sentencias SQL que se preparan y ejecutan en tiempo de ejecución. En SQL Dinámico, la preparación y la ejecución de un comando SQL son operaciones separadas. El SQL dinámico permite programar dentro de InterSystems IRIS de forma similar a una aplicación ODBC o JDBC (salvo que se ejecuta la sentencia SQL dentro del mismo contexto de proceso que el motor de base de datos). SQL dinámico se invoca desde un programa ObjectScript. Las consultas SQL dinámicas se preparan en tiempo de ejecución del programa, no en tiempo de compilación. 


3. Class Queries

Una class query o consulta de clase es una herramienta, contenida en una clase y diseñada para usarse con SQL dinámico, para buscar registros que cumplan criterios específicos. Con las consultas de clase, podéis crear búsquedas predefinidas para una aplicación. Por ejemplo, podéis buscar registros por nombre o proporcionar una lista de registros que cumplan un conjunto particular de condiciones, como todos los vuelos de París a Madrid.

Antes de pasar a la primera opción, creemos una clase persistente Demo.Person, que también extiende la clase %Populate para poder generar algunos datos de prueba.

Class Demo.Person Extends (%Persistent, %Populate)
{
/// Person's name.
Property Name As %String(POPSPEC = "Name()") [ Required ];
/// Person's Social Security number. This is validated using pattern match.
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
/// Person's Date of Birth.
Property DOB As %Date(POPSPEC = "Date()");
/// Person's City
Property CITY As %String;
}

Ejecutad la siguiente sentencia SQL para comprobar los datos de la tabla después de compilar la clase anterior:

SELECT
ID, CITY, DOB, Name, SSN
FROM Demo.Person


Ahora ejecutad el siguiente comando para rellenar 20 registros:

do ##class(Demo.Person).Populate(20)

Volved a ejecutar la consulta SQL (SELECT):


Hemos creado la tabla y la hemos rellenado con algunos datos. En el próximo artículo, revisaremos SQL embebido.

Gracias

ディスカッション (0)1
続けるにはログインするか新規登録を行ってください