Temporary Undo (Geçici Geri Alma) Nedir ?

23 Haz by Ahmet Duruöz

Temporary Undo (Geçici Geri Alma) Nedir ?

Geçici(temp) tablolar, ara sonuçların hazırlanmasında yaygın olarak kullanılmaktadır. Bu tabloları değiştirmek normal tablolardan çok daha hızlıdır. Performans kazancı temel olarak yineleme girişlerinin olmamasındandır. Geçici tablolardaki değişiklikler doğrudan oluşturulur. Ancak, geçici tablolardaki işlemler için yine de redolog üretilir. Geçici tablolar için geri alma(undo), geçici süre boyunca tutarlı okumalar ve işlem geri alımları için yararlıdır.

Oracle Database 12’den itibaren geçici tabloların işlemleriyle oluşturulan undo segment’lerin temp tablo alanında depolanması mümkündür. Bu, global temp tabloların fiziksel standby veritabanlarında ve salt okunur veritabanlarında kullanılmasına ve yeniden oluşturma gereksiniminin ortadan kaldırılmasına olanak tanır. Bu moda temporary undo denir.

 

temporary undo

 

Temporary Undo Yararları :

  • Temporary Undo, geri alma tablo alanlarında depolanan undo miktarını azaltır. Geri alma işleminde daha az geri alma tablo alanları, geri alma kayıtları için daha gerçekçi geri alma saklama süresi gereksinimlerine neden olabilir.
  • Temporary Undo, redolog boyutunu azaltır. Performansın iyileşmesine sebep olur çünkü daha az redolog üretilmiştir ve LogMiner gibi araçlarla redolog parse işlemi yapıldığında daha az redolog ile uğracağından parse işlemi kısa sürecektir.
  • Temporary Undo, Oracle Active DataGuard konfigüre edilmiş ise , standby veritabanındaki geçici tablolar üzerindeki DML işlemlerini etkinleştirir. Ancak, DDL işlemlerinin standby veritabanında da olması için primary veritabanında yağpılması gerekmektedir.

Temporary Undo Özelliğinin Etkinleştirilmesi :

Belirli bir oturum veya tüm veritabanı için temporary undo özelliğini etkinleştirebilirsiniz. Temporary undo etkinleştirildiğinde ALTER SESSION deyimini kullanan bir oturum için, diğer oturumlar etkilenmeden temporary undo oluşturulur. ALTER SYSTEM deyimi kullanarak sistem için temporary undoyı etkinleştirildiğinde, varolan tüm oturumlar ve yeni oturumlar için temporary undo oluşturulur.

Bir oturum ilk kez geçici nesneler kullandığında, TEMP_UNDO_ENABLED parametresinin değeri, oturumun geri kalanı için ayarlanır. Bu nedenle, bir oturum ve oturum için temporary undo etkinleştirilmişse geçici nesneler kullanıyorsa, oturum için temporary undo devre dışı bırakılamaz. Benzer şekilde, temporary undo bir oturum için devre dışı bırakılırsa ve oturum geçici nesneler kullanırsa, temporary undo oturum için etkinleştirilemez.

Temporary Undo özelliği, COMPATIBLE parametresi en az 12.1.0.0.0 olarak ayarlanmış veritabanlarında kullanılabilir.

Temporary Undo, Oracle Active Data Guard konfigüre edilmiş fiziksel bir standby veritabanı için varsayılan olarak etkindir. Dolayısıyla TEMP_UNDO_ENABLED parametresinin , bu şekildeki standby veritabanlarında hiçbir etkisi yoktur.

Bir session için etkinleştirilmesi :

SQL> ALTER SESSION SET temp_undo_enabled = true;

Database instance’ı için etkinleştirilmesi:

SQL> ALTER SYSTEM SET temp_undo_enabled = true;

Temporary undo etkinleştirildiğinde bir session’da ilk temp tablo kullanımı ile çalışmaya başlayacaktır.

Temporary Undo Kullanımının İzlemesi :

V$TEMPUNDOSTAT, bir veritabanı instance’ı için temporary undo ile ilgili çeşitli istatistikleri gösterir. Sistemin nasıl çalıştığını göstermek için istatistiksel verilerin bir histogramını gösterir. Görünümdeki her satır, 10 dakikalık bir süre için. Satırlar, BEGIN_TIME sütun değerinin azalan düzenindedir.

V$TEMPUNDOSTAT görünümünün bazı önemli sütunları şunlardır :

BEGIN_TIME: Zaman aralığının başlangıcını tanımlar
TXNCOUNT: İlgili zaman aralığında geçici olarak geri alma segmentine bağlanan toplam işlem sayısı
MAXCONCURRENCY: İlgili zaman aralığında aynı anda yürütülen ve geçici nesneleri değiştiren en fazla işlem sayısı
UNDOBLKCNT: İlgili zaman aralığında tüketilen toplam temporary undo blok sayısı
USCOUNT: İlgili zaman aralığında oluşturulan temporary undo segmentleri
NOSPACEERRCNT: İlgili zaman aralığında , temporary undo için boş alan kalmadı hatasının oluşmasına kadar kalan toplam süre

Aşağıdaki view’lerden de temporary undo ile çeşitli bilgilere ulaşılabilir.

  • V$UNDOSTAT
  • V$ROLLSTAT
  • V$TRANSACTION
  • DBA_UNDO_EXTENTS
  • DBA_HIST_UNDOSTAT

Aşağıdaki gibi bir sogru ile temporary undo durumunu görebilirsiniz.

SELECT to_char(BEGIN_TIME,'dd/mm/yy hh24:mi:ss') "BEGIN TIME", TXNCOUNT "TXNCNT", MAXCONCURRENCY, UNDOBLKCNT, USCOUNT "USCNT", NOSPACEERRCNT "NOSPEERRCNT" FROM  V$TEMPUNDOSTAT;

 

 

Temporary undo özelliğinin ne kadar etkili olduğunu gösteren bir örnek yapalım. Bir global temp tablo oluşturup, bu tabloya temporary undo etkin değilken ve etkin olduğunda veri girişleri yapalım. Bu işlemler sonrasında temp undo etkin olduğunda üretilen redolog miktarının ciddi oranda düştüğü görülecektir.

SQL> CREATE GLOBAL TEMPORARY TABLE my_temp_table (id NUMBER,name  VARCHAR2(20)) ON COMMIT DELETE ROWS;

Table created.


SQL> SET AUTOTRACE ON STATISTICS;
SQL> INSERT INTO my_temp_table
WITH data AS (
  SELECT 1 AS id
  FROM   dual
  CONNECT BY level < 10000
)
SELECT rownum, TO_CHAR(rownum)
FROM   data a, data b
WHERE  rownum <= 1000000;

1000000 rows created.


Statistics
----------------------------------------------------------
	 46  recursive calls
      15694  db block gets
       2399  consistent gets
	 17  physical reads
	980  redo size
	855  bytes sent via SQL*Net to client
       1099  bytes received via SQL*Net from client
	  3  SQL*Net roundtrips to/from client
	  3  sorts (memory)
	  0  sorts (disk)
    1000000  rows processed

 

Bu session’da kullanılan undo miktarını kontrol edelim.

 

SQL> SET AUTOTRACE OFF;
SQL> SELECT t.used_ublk,t.used_urec FROM v$transaction t,v$session s WHERE  s.saddr = t.ses_addr AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');

 USED_UBLK  USED_UREC
---------- ----------
	 1	    1

 

Aynı işlemleri temporary undo özelliğini etkinleştirip deneyelim.

 

SQL> ALTER SESSION SET TEMP_UNDO_ENABLED = TRUE;

Session altered.

SQL> SET AUTOTRACE ON STATISTICS;
SQL> INSERT INTO my_temp_table
WITH data AS (
  SELECT 1 AS id
  FROM   dual
  CONNECT BY level < 10000
)
SELECT rownum, TO_CHAR(rownum)
FROM   data a, data b
WHERE  rownum <= 1000000; 

1000000 rows created.


Statistics
----------------------------------------------------------
	 23  recursive calls
      15678  db block gets
       2348  consistent gets
	 16  physical reads
	376  redo size
	858  bytes sent via SQL*Net to client
       1099  bytes received via SQL*Net from client
	  3  SQL*Net roundtrips to/from client
	  3  sorts (memory)
	  0  sorts (disk)
    1000000  rows processed

 

Görüleceği üzere üretilen redo boyutu ciddi oranda düştü.

 

SQL> SET AUTOTRACE OFF
SQL> SELECT t.used_ublk,t.used_urec FROM v$transaction t,v$session s WHERE  s.saddr = t.ses_addr AND s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');

 USED_UBLK  USED_UREC
---------- ----------
	 1	    1

SQL>

 

Temporary undo kullanımı aşağıdaki gibi olmuştur.

 

SQL> SET LINESIZE 200
SQL> ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-YYYY HH24:MI:SS';

Session altered.

SQL> SELECT * FROM   v$tempundostat WHERE  end_time >= SYSDATE - INTERVAL '1' MINUTE;

BEGIN_TIME	     	 END_TIME		      UNDOTSN    TXNCOUNT   MAXCONCURRENCY MAXQUERYLEN MAXQUERYID	 UNDOBLKCNT	EXTCNT	   USCOUNT    SSOLDERRCNT NOSPACEERRCNT	CON_ID
-------------------- -------------------- ---------- ---------- -------------- ----------- ------------- ---------- ---------- ---------- ----------- ------------- ----------
23-JUN-2020 18:50:39 23-JUN-2020 19:01:21 3	         3 	        0		       0		   643	         7		    1	       0		  0	          0

SQL>

 

 

Loading

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir