2008-10-06 18 views
10

FAQ define el espacio de tabla temporal de la siguiente manera: se utilizanDescubrir cuál es el proceso/consulta está utilizando tabla de Oracle Oracle temp

espacios de tablas temporales a administrar el espacio de base de datos para ordenar operaciones y para almacenar tablas temporales globales. Por ejemplo, si une dos tablas grandes y Oracle no puede hacer la clasificación en la memoria, se asignará el espacio en un espacio de tabla temporal para realizar la operación ordenar .

Eso es genial, pero necesito más detalles sobre qué es exactamente el uso del espacio. Debido a las peculiaridades del diseño de la aplicación, la mayoría de las consultas realizan algún tipo de ordenamiento, por lo que debo restringirlo al ejecutable del cliente, la tabla de destino o la instrucción SQL.

Básicamente, estoy buscando pistas para decirme con mayor precisión qué podría estar mal con esta (una aplicación bastante grande). Cualquier tipo de pista puede ser útil, siempre que sea más preciso que "ordenar".

Respuesta

15

No estoy seguro de exactamente qué información tiene que entregar, pero usando la siguiente consulta le indicará qué programa/usuario/sesiones, etc. están utilizando actualmente su espacio temporal.

SELECT b.TABLESPACE 
     , b.segfile# 
     , b.segblk# 
     , ROUND ( ( (b.blocks * p.VALUE)/1024/1024), 2) size_mb 
     , a.SID 
     , a.serial# 
     , a.username 
     , a.osuser 
     , a.program 
     , a.status 
    FROM v$session a 
     , v$sort_usage b 
     , v$process c 
     , v$parameter p 
    WHERE p.NAME = 'db_block_size' 
    AND a.saddr = b.session_addr 
    AND a.paddr = c.addr 
ORDER BY b.TABLESPACE 
     , b.segfile# 
     , b.segblk# 
     , b.blocks; 

Una vez que averiguar qué sesión está haciendo el daño, a continuación, echar un vistazo a la de SQL se ejecuta, y que debe estar en el camino correcto.

3

Una regla de oro es que casi cualquier consulta que lleva más de un segundo, probablemente usa cierto espacio TEMP, y estos no son los justos que implican ORDEN apartaderos, sino también:

  1. apartaderos grupo (ORDENAR GROUPBY antes 10.2 y 10.2 de HASH GROUPBY en adelante)
  2. hash o enlaces intercalados
  3. tablas temporales globales (obviamente)
  4. Índice reconstruye

Ocasionalmente, el espacio utilizado en los espacios de tablas temporales no es liberado por Oracle (error/peculiaridad) por lo que debe soltar manualmente un archivo del espacio de tabla, soltarlo del sistema de archivos y crear otro.

+0

¿todos que se grabará v $ sort_usage? –

+0

De acuerdo con los documentos de Oracle, V $ TEMPSEG_USAGE contiene todas las operaciones diferentes que requieren espacio TEMP. –

3

gracias van para Michael OShea por su respuesta,

pero en caso de que tenga Oracle RAC varias instancias, entonces necesitará esto ...

SELECT b.TABLESPACE 
     , b.segfile# 
     , b.segblk# 
     , ROUND ( ( (b.blocks * p.VALUE)/1024/1024), 2) size_mb 
     , a.inst_ID 
     , a.SID 
     , a.serial# 
     , a.username 
     , a.osuser 
     , a.program 
     , a.status 
    FROM gv$session a 
     , gv$sort_usage b 
     , gv$process c 
     , gv$parameter p 
    WHERE p.NAME = 'db_block_size' 
    AND a.saddr = b.session_addr 
    AND a.paddr = c.addr 
    -- AND b.TABLESPACE='TEMP2' 
ORDER BY a.inst_ID , b.TABLESPACE 
     , b.segfile# 
     , b.segblk# 
     , b.blocks; 

y esto la secuencia de comandos para generar la matanza declaraciones: Por favor, revise qué sesiones se le matando ...

SELECT b.TABLESPACE, a.username , a.osuser , a.program , a.status , 
     'ALTER SYSTEM KILL SESSION '''||a.SID||','||a.SERIAL#||',@'||a.inst_ID||''' IMMEDIATE;' 
    FROM gv$session a 
     , gv$sort_usage b 
     , gv$process c 
     , gv$parameter p 
    WHERE p.NAME = 'db_block_size' 
    AND a.saddr = b.session_addr 
    AND a.paddr = c.addr 
    -- AND b.TABLESPACE='TEMP' 
ORDER BY a.inst_ID , b.TABLESPACE 
     , b.segfile# 
     , b.segblk# 
     , b.blocks; 
+0

Esto es oro. ¡Gracias! –

Cuestiones relacionadas