Artículo
· 10 sep, 2024 Lectura de 3 min

Cómo identificar qué globales temporales están consumiendo espacio en la base de datos IRISTEMP

Rúbrica de preguntas frecuentes de InterSystems

Los globales temporales almacenados en las bases de datos IRISTEMP/CACHETEMP se utilizan cuando un proceso no necesita almacenar datos de manera indefinida, pero requiere el potente rendimiento de los globales. Las bases de datos IRISTEMP/CACHETEMP no se registran en el diario, por lo que el uso de globales temporales no genera archivos de diario.

El sistema utiliza las bases de datos IRISTEMP/CACHETEMP para almacenamiento temporal y están disponibles para vosotros para el mismo fin.

Para obtener más información sobre los globales temporales y la base de datos IRISTEMP, ved el siguiente documento:  
Globales Temporales y la Base de Datos IRISTEMP.

Los globales que se usan como temporales son:

1. Globales temporales del sistema (^IRIS.Temp*, ^%cspSession, ^CacheTemp*, ^mtemp*, etc.)
2. Globales temporales asignados a IRISTEMP/CACHETEMP por el usuario
3. Globales privados del proceso (^||nombre, ^|"^"|nombre, ^["^"]nombre, ^["^",""]nombre, etc.)
4. Tabla GLOBAL TEMPORARY  

 -> La definición de la tabla es persistente (disponible para todos los procesos), y los datos de la tabla se almacenan en globales privados del proceso (solo duran mientras el proceso esté activo).

Las dimensiones de los puntos 1 y 2 pueden verificarse usando la utilidad ^%GSIZE.

USER>do ^%GSIZE

Directory name: c:\intersystems\iris\mgr\user\ => c:\intersystems\iris\mgr\iristemp\
                                               // Specify the iristemp database folder
All Globals? No => yes       // Yes to show all globals: 34 items selected
34 available globals
Show details?? No => No   //  No to not show detailed information 
Device:
Right margin: 80 =>

Los globales privados del proceso (3,4) pueden visualizarse usando la utilidad ^GETPPGINFO.

Para más información sobre la utilidad ^GETPPGINFO, ved el siguiente documento:  
Acerca de la utilidad ^GETPPGINFO [IRIS]  
Acerca de la utilidad ^GETPPGINFO.

El siguiente ejemplo muestra los globales privados del proceso de todos los procesos actuales:

 set ^||flintstones(1)="Fred"
 set ^||flintstones(2)="Wilma"
 znspace "%SYS"
 do ^GETPPGINFO("*")

Otro método es mostrar el contenido de los procesos individuales que utilizan globales privados del proceso en grandes cantidades.

El siguiente ejemplo muestra el número de bloques de globales privados del proceso por cada proceso que sea mayor o igual a 20.

 set ns=$namespace
 znspace "%SYS"
 
 // Only processes with more PPG blocks than the total number of processes are included
 set st=##class(%SQL.Statement).%New()
 set status=st.%PrepareClassQuery("%SYS.ProcessQuery","AllFields")
 set rs=st.%Execute()
 while rs.%Next() {
    set pid=rs.%Get("Pid") // Process ID
    set cnt=rs.%Get("PrivateGlobalBlockCount") // Number of PPG blocks
    
    // When the number of PPG blocks per process is 0 or more, the contents are output (the following example shows 20 or more blocks).
    if cnt > 20 {
       set rs2=##class(%ResultSet).%New("%SYS.ProcessQuery:PPG")
       // "N" Do not return subscripts of a PPG, just return the root name
       // "B" Return the number of blocks used by the PPG (needs the "N" option)
       do rs2.Execute("*",pid,"NB")
       for {
          quit:'rs2.Next()
          write cnt_" PID:"_pid_", PPG name "_rs2.GetData(1)_" is using "_rs2.GetData(3)_" disc blocks",!
       }
    }
 }
 
 znspace ns
Comentarios (0)1
Inicie sesión o regístrese para continuar