Artigo
· Ago. 16 3min de leitura

Como identificar quais globais temporárias estão consumindo espaço na base de dados IRISTEMP

Rubrica InterSystems FAQ 

Globais temporárias armazenadas nas bases de dados IRISTEMP/CACHETEMP são usadas quando um processo não precisa guardar dados indefinidamente, mas requere a poderosa performance das globais. As bases de dados IRISTEMP/CACHETEMP não são jounralizadas, então usar globais temporárias não cria arquivos de journal.

O sistema usa as bases de dados IRISTEMP/CACHETEMP para armazenamento temporário e estão disponíveis para usuários para o mesmo objetivo.

Para mais informações sobre globais temporárias e a base de dados IRISTEMP, veja o documento a seguir:
Globais Temporárias e a Base de Dados IRISTEMP

As globais usadas como temporárias são:

1. Globais temporáriass de sistema (^IRIS.Temp*, ^%cspSession, ^CacheTemp*, ^mtemp*, etc.)
2. Globais temporárias mapeadas para IRISTEMP/CACHETEMP pelo usuário
3. 
Globais privadas por processo  (^||name, ^|"^"|name, ^["^"]name, ^["^",""]name, etc. )
4. Tabela de GLOBAL TEMPORÁRIA

 -> A definição da tabela é persistente (disponível para todos os processos) e os dados da tabela são guardados em globais privadas por processo (duram apenas pela duração do processo)

Os tamanhos de 1 e 2 podem ser checados usando a utilidade ^%GSIZE.

USER>do ^%GSIZE

Directory name: c:\intersystems\iris\mgr\user\ => c:\intersystems\iris\mgr\iristemp\
                                               // Especifique a pasta da base de dados iristemp
All Globals? No => yes       // Sim para mostrar todas as globais: 34 itens selecionados
34 available globals
Show details?? No => No   // Não para não mostrar informações detalhadas
Device:
Right margin: 80 =>

3,4 Globais privadas por processo podem ser vistas usando a utilidade ^GETPPGINFO.

Para mais informações sobre a utilidade ^GETPPGINFO, veja os documentos a seguir:
Sobre a utilidade ^GETPPGINFO [IRIS]
Sobre a utilidade ^GETPPGINFO

O exemplo que se segue lista as globais privadas por processo de todos os processos atuais:

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

Outro método é exibir os conteúdos de processos individuais que usam globais privadas por processo em grandes quantidades.

A seguir, uma amostra que exibe o número de blocos de globais privadas por processo que sejam maiores ou iguais a 20, de cada processo.

 set ns=$namespace
 znspace "%SYS"
 
 // Somente incluídos os processos com mais blocos PPG que o número total de processos
 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") // ID do processo
    set cnt=rs.%Get("PrivateGlobalBlockCount") // Número total de blocos PPG
    
    // Quando o número de blocos PPG por processo é 0 ou mais, os conteúdos são exibidos (o exemplo a seguir mostra 20 ou mais blocos).
    if cnt > 20 {
       set rs2=##class(%ResultSet).%New("%SYS.ProcessQuery:PPG")
       // "N" Não retorna subscritos de um PPG, somente o nome da raiz
       // "B" Returna o número de blocos usados pelo PPG (precisa da opção "N")
       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
Discussão (0)1
Entre ou crie uma conta para continuar