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 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>