UTL_FILE PERFORMANSI



Benzer belgeler
Kurumsal Kimlik Rehberi

PostgreSQL ve PL/pgSQL

PostgreSQL ve PL/pgSQL

ORACLE DA KÜRSÖRLER. Gerekli sistem değişkenleri

DĐNAMĐK ve STATĐK SQL KULLANMANIN PERFORMANSA ETKĐSĐ

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir. Çok satır dönerse hata verir.

3001 BAŞLANGIÇ AR-GE PROJELERİ DESTEKLEME PROGRAMI

ORACLE INDEX SIKIŞTIRMA TEKNĐKLERĐ

Hayata yüksekten bakın

Demir Hayat Sigorta A.Ş. Kurumsal Logo Kullanım Klavuzu

T.C. OSMANİYE KORKUT ATA ÜNİVERSİTESİ SOSYAL BİLİMLERİ ENSTİTÜSÜ..ANA BİLİM / ANA SANAT DALI

Sorgudan elde edilen değerin değişkenlere aktarılmasını sağlar. Sorgudan tek satır dönmesi gerekir, aksi durumda hata olur.

Oracle da kullanılan veri tipleri:

LOGO, PANTONE, CMYK, FONT

SEO Arama Motoru Optimizasyonu

MOBİL UYGULAMA GELİŞTİRME

PİŞİRME GRUBU (MTF) Tel Bantlı Tünel Fırınlar, (STF) Taş Tabanlı Tünel Fırınlar

KANUNİ MARKA KİMLİĞİ KILAVUZU

8 Oracle da tablo yapısı içinde otomatik artan kolon yoktur. (identity kolon

YAKIN DOĞU ÜNĠVERSĠTESĠ SOSYAL BĠLĠMLER ENSTĠTÜSÜ... ANABĠLĠM DALI / ANASANAT DALI TEZİN BAŞLIĞI AD SOYAD YÜKSEK LĠSANS TEZĠ / DOKTORA TEZĠ

Kurumsal Kimlik Kılavuzu

KURUMSAL KİMLİK KLAVUZU

Kurumsal Kimlik Standartları. Brand Guidelines Manual V

Exadata Üzerinde Veri Sıkıştırma Yöntemleri

K U R U M S A L K İ M L İ K K I L A V U Z U

Ayrıştırıcı Özellikler Değerler Marka Özü B C D E F. Basılı Malzemeler. MS Word için Antetli. E-posta imzası. Özel Günler Dijital Tebrik Kartı

3 Profesyonel Rehberlik Hizmetleri

1. PL/SQL de kontrol yapıları

AKILLI ULAŞIM SİSTEMLERİ DERNEĞİ LOGO VE KURUMSAL KİMLİK KILAVUZU

VERİ TABANI YÖNETİM SİSTEMLERİ II. 5. SQL PROGRAMLAMADA CURSOR (İMLEÇ) ve TRIGGERS (TETİKLEMELER)

KURUMSAL KİMLİK KILAVUZU

Renkli Olmayan Baskılarda Logonun Kullanımı


DOĞU KARADENİZ KALKINMA AJANSI DESTEK PROGRAMLARI GÖRÜNÜRLÜK REHBERİ

KURUMSAL KİMLİK KLAVUZU

SAKLI YORDAM (Stored Procedure) Sibel Somyürek

PCTFREE - PCTUSED ORACLE DEĞERLERĐ

Kullanıcı tanımlı fonksiyonlar SQL2000 ile gelen özelliklerden biridir. Fonksiyonlar tek bir değer veya tablo döndürmek için kullanılır.

Unutulmuş Özellikler: Oracle Veritabanına Yaptığınız Yatırımı Sonuna Kadar Kullanın

PROSPORT. Kurumsal Kimlik Kılavuzu

Kurum Kimliği Kılavuzu V.01

Turgut Özal Üniversitesi markası, üniversitenin kuruluş değerlerinin bir yansımasıdır. Marka, Turgut Özal Üniversitesi vizyon ve misyonuna hizmet

PROJELER İÇİN GÖRÜNÜRLÜK REHBERİ

KURUMSAL KİMLİK KLAVUZU

1 GİRİŞ 1.1 Önsöz 4 SONUÇ. 14x. 3 1/2 x x 5x x 3 1/2 x. 18x. x 3x x

KURUMSAL KİMLİK KILAVUZU

Emrah UYSAL 1 TABLESPACE ENCRYPTION ORACLE 11G

KULLANICI TANIMLI FONKSİYONLAR (Devam)

KURUMSAL KİMLİK KILAVUZU

KURUMSAL KİMLİK REHBERİ

SiViL TOPLUM DESTEKLERi

Marka ve Görsel Kimlik Rehberi Haziran 2017 Tarihi Not Alın!

ORACLE VERĐTABANINDA TABLO ve INDEX SIKIŞTIRMA

VERİ TABANI YÖNETİM SİSTEMLERİ II. 3. SQL PROGRAMLAMA BLOKLARI ve AKIŞ DENETİMİ

-- işareti tek satırlık açıklamalarda kullanılır. Açıklama olarak yazılan satırın önüne konulması yeterlidir.

SQL PROGRAMLAMA. Bir batch, bir arada bulunan bir dizi SQL deyimidir. Batch ayıracı GO deyimidir.

Tarihi Not alın 8 Haziran 2019

KULLANICI TANIMLI FONKSİYONLAR (Devam)

HİKAYE TAHTASI ETKİNLİĞİ. Yetişkinler İçin Güvenli İnternet Hilal Seda Yıldız

KULLANICI TANIMLI FONKSİYONLAR

KURUMSAL KiMLiK REHBERi

1 RUBY HAKINDA 1 Ruby nin Gelişim Hikayesi 1 Neden Ruby? 1 Neden Bu Kadar Popüler? 2

BLG4134 Görsel Programlama III. Öğr. Grv. Aybike ŞİMŞEK

«BM364» Veritabanı Uygulamaları

Lorem ipsum dolor sit amet

SQL e Giriş. Uzm. Murat YAZICI

KURUMSAL KİMLİK KILAVUZU

Mühendislik ve Mimarlık Fakültesi nde Geçen Ay

İnova Otomotiv Logosu Kullanım Talimatları

KÜLTÜRÜYLE,TARİHİYLE, YAŞANTISIYLA İSTANBUL ARTIK SİVAS TA.

Örnek: HAFTA12B isimli bir kullanıcı tanımlayalım. Bu kullanıcıya gerekli yetkileri verelim.

Basılı Malzemeler. logo. Kurumsal Kimlik Kitapçığı. Versiyon 1.2. Zarf (A4, Diplomat, A3) Kimlik Kartı. Antetli Kağıt ve Devam Kağıdı Kartvizit.

Öğr. Gör. Cansu AYVAZ GÜVEN VERİTABANI-II. Değişken Tanımlama Ve Akış Kontrol Deyimleri

YAPISAL SORGULAMA DİLİ (SQL)

arvento hakkında

OMÜ HAVACILIK VE UZAY BİLİMLERİ FAKÜLTESİ METEOROLOJİ MÜHENDİSLİĞİ BÖLÜMÜ MET103 BİLGİSAYAR PROGRAMLAMA I BÜTÜNLEME SINAVI

Önsöz. İçindekiler Algoritma Algoritma Nasıl Hazırlanır? Yazılımda Algoritma Mantığı Nedir? 1.2. Algoritma Örnekleri ve Sorular

2 PYTHON A GIRIŞ 13 PyCharm İle Python Projesi Oluşturma 15 Projenin Çalıştırılması 18 İlk Python Programımız 19 Açıklama Satırları 21

BÖLÜM- 11: BÜYÜK VERİ KÜMELERİ

Mifare Kart Yazıcı/Okuyucu Modül (MFM-200)

Pascalda oluşturulacak dosyalar değişkenler gibi programın başında tanımlanır.

Fonksiyonlar istenilen deger tipinde dönüs yapabilir. INT, VARCHAR deger döndürebileceğiniz gibi bir tablo da döndürebilirsiniz.

Kurumsal Kimlik Rehberi

Veritabanında Saklı Yordamlar: Bir Veritabanı Tasarımı ve Web Uygulaması

STORED PROCEDURE LER (Saklı Yordamlar)

Laboratuvar 2 Tek Kayıt Fonksiyonları

Veritabanına Giriş. Oğuzhan Ceylan. 19 Eylül 2011

TESİ. indeks. söylenebilir?? bir ilişkidir d) Hiçbiri. veya somutlaştırılmış. düzeyidir? sağlayabilir? sına. d) Hepsi. olabilir? c) Verilerin d) Hepsi

2- Total de 8000 byte yer tutup 4000 karakter olarak kullanabildiğimiz tip aşağıdakilerden hangisidir?

Advanced Oracle SQL Tuning

araç takip ve filo yönetim sistemleri

İçindekiler. Basılı İşler 49. Slogan 17 Font 20 Yardımcı Unsurlar. Yazışmalar 31. Bağlı, İlgili ve İlişkili Kurumlar 83

Tercihiniz sizi yansıtır

Veritabanı Tasarımı. Introduction to the Oracle Academy

AOSB 2017 EĞİTİM PROGRAMI

Oracle'dan PostgreSQL'e geçiş

EXISTS VE NOT EXISTS fonksiyonları

DAO İLE SQL KOMUTLARI. Sql komutlarını artık veri tabanında kullanmaktan başka çaremiz yok arkadaşlar. Şimdi bu sql derslerimize başlayalım.

Enerji pusulası Projesi nedir?

KURUMSAL KİMLİK KILAVUZU

Transkript:

UTL_FILE PERFORMANSI 1

İçindekiler 0.ÇALIŞMADA KULLANILMAK ÜZERE DATA OLUŞTURMA... 4 1. HERHANGİ BİR İYİLEŞTİRME YAPMADAN STANDART UTL_FILE KULLANIMI... 5 2. I/O MİKTARINI AZALTMAK İÇİN VARCHAR ARA DEĞİŞKEN KULLANMAK... 5 3. I/O MİKTARINI AZALTMAK İÇİN CLOB ARA DEĞİŞKEN KULLANMAK... 6 4. I/O MİKTARINI AZALTMAK İÇİN CLOB DEĞİŞKEN KULLANIP, SIKIŞTIRMA... 6 5. SIKIŞTIRILAN DATAYI DOSYA YERINE BLOB OLARAK TABLOYA YAZMA... 8 6. DATAYI SIKIŞTIRMADAN DOSYA YERINE CLOB OLARAK TABLOYA YAZMA... 9 7. KAYNAKLAR... 10 2

UTL_FILE işletim sistemi üzerinde birçok işlem yapmamızı (dosya yazma, okuma, silme, kopyalama vs...) sağlayan bir Oracle paketi. Bu yazıda, UTL_FILE paketini yazma işlemlerinde nasıl daha performanslı kullanabileceğimizi göreceğiz. UTL_FILE ile yazarken, performans arttırmanın yolu, olabildiğince az I/O yapmaktan geçiyor. Ne kadar çok I/O yapılırsa, diske o kadar sık erişileceğinden performans azalacaktır. Mesela her satırı ayrı ayrı yazmak yerine, bir noktaya kadar biriktirmek ardından veriyi yazmak, UTL_FILE işlem süresini kısaltacaktır. Çalışmadaki detayları aşağıda bulabilirsiniz. Fakat kısa bir özet geçmek gerekirse; 1. Veritabanında CLOB / BLOB ların tutulacağı bir tablo yaratıp, raporlar burada saklanabilir. Tablo CLOB olarak saklanacaksa, süre ve boyut olarak iyi bir sonuç elde edemiyoruz. Fakat sıkıştırıp, BLOB olarak saklama imkanı varsa, performans ve alan tüketimi iyi oluyor. Yine de çok data tutulması hâlinde veritabanını son derece hızlı şekilde büyütebilir. Eğer düzenli silme yapılmayacaksa, iyi bir seçim olmayacaktır. 2. Dosyalara yazmaya devam edilebilir. Fakat direkt UTL_FILE ile dosyaya çıkmak yerine değişkenlerde datayı biriktirmek, ardından biriken datayı dosyaya çıkmak performans artışı sağlar. 3. Datayı sıkıştırıp dosyaya yazmak, ya da sıkıştırıp tabloda tutmak mümkün. En zayıf sıkıştırma derecesiyle bile, çok ciddi tasarruflar sağlanabiliyor. Harcanan süre ve boyut arasındaki ilişkiyi iyi hesap etmek gerekli. 4. Sonuçları dosyaya yazarken External Table kullanabilirsiniz. Fakat denemelerimde iyi sonuçlar vermedi. Daha farklı parametrelerle daha iyi sonuçlar elde edilebilir. Fakat yazının ana konusu UTL_FILE olduğu ve External Table larla iyi sonuç elde edemediğimiçin çalışmadan çıkarttım. 3

Yaptığım denemelerin sonuçlarını aşağıda bulabilirsiniz: YÖNTEM SÜRE (SN) BOYUT (MB) 1. Standart UTL_FILE Kullanımı 42,36 265,84 2. VARCHAR Ara Değişken Kullanımı 21,40 265,84 3. CLOB Ara Değişken Kullanımı 19,87 265,84 4. CLOB Ara Değişken + Sıkıştırma, Dosyaya Çıkma * 36,12 58,47 5. CLOB Ara Değişken + Sıkıştırma, BLOB Tabloya Yazma * 60,86 60,00 6. CLOB Ara Değişken, CLOB Tabloya Yazma 116,94 216,00 * Sıkıştırma için UTL_COMPRESS paketindeki LZ_COMPRESS prosedürü en düşük sıkıştırma derecesi ile kullanıldı. Daha yüksek derecelerde, boyut ufaltmaktadır. Prosedür Lempel-Ziv algoritmasını kullanmakta ve sıkıştırılan dosyalar RAR, 7zip, vb... güncel programlarla extract edilebilir. (UTL_COMPRESS paketinde extraction için de bir prosedür bulunmaktadır.) 0.ÇALIŞMADA KULLANILMAK ÜZERE DATA OLUŞTURMA -- DATANIN SAKLANACAGI TABLO CREATE TABLE D_CCEBI.DENEME( ID NUMBER, DUMMY_DATA VARCHAR2(2000) ) TABLESPACE TB_DATA NOLOGGING; -- 250BIN SATIRLIK DATA OLUSTURMA KISMI SET SERVEROUTPUT ON V_TEMP DBMS_SQL.VARCHAR2S; i PLS_INTEGER; V_DATA VARCHAR2(2000); V_TEMP(0) := CONCAT( 'Lorem ipsum dolor sit amet, consectetur', 'In id mi vestibulum mauris lobortis rutrum' ); V_TEMP(1) := CONCAT( 'Suspendisse auctor lorem vitae arcu ultricies', 'Phasellus quis elit non nisl sollicitudin' ); V_TEMP(2) := CONCAT( 'Sed posuere nisi eget mauris pretium dictum.', 'Sed lorem massa, interdum ac euismod' ); V_TEMP(3) := CONCAT( 'Vestibulum gravida vehicula tempus. Duis', 'Pellentesque consectetur, enim eget vestibulum'); V_DATA := CONCAT( V_TEMP(0), V_TEMP(1) ); V_DATA := CONCAT( V_DATA, V_TEMP(2) ); V_DATA := CONCAT( V_DATA, V_TEMP(3) ); 4

FOR i IN 1..250000 LOOP INSERT /*+append nologging*/ INTO D_CCEBI.DENEME VALUES( i, V_DATA ); IF MOD(i,10000)=0 THEN COMMIT; COMMIT; Elapsed: 00:01:13:48 SQL> CREATE OR REPLACE DIRECTORY CCEBI_TEMP AS '/oracle/oracle1/file_test'; 1. HERHANGİ BİR İYİLEŞTİRME YAPMADAN STANDART UTL_FILE KULLANIMI -- DIREKT YAZDIRMA l_file UTL_FILE.FILE_TYPE; l_file := utl_file.fopen('ccebi_temp','deneme.text','w'); utl_file.put_line(l_file, c.dummy_data ); utl_file.fclose(l_file); Elapsed: 00:00:42:36 2. I/O MİKTARINI AZALTMAK İÇİN VARCHAR ARA DEĞİŞKEN KULLANMAK -- DEGISKENDE TUTUP YAZDIRMA l_file UTL_FILE.FILE_TYPE; V_BUFFER VARCHAR(32767) := null; l_file := utl_file.fopen('ccebi_temp','deneme.text','w',32767); IF v_buffer is null THEN V_BUFFER := C.DUMMY_DATA; ELSIF LENGTH(V_BUFFER) + 1 + LENGTH(C.DUMMY_DATA) <= 32767 THEN V_BUFFER := V_BUFFER CHR(10) C.DUMMY_DATA; ELSE utl_file.put_line( l_file, V_BUFFER ); V_BUFFER := C.DUMMY_DATA; 5

utl_file.put_line( l_file, V_BUFFER ); utl_file.fclose( l_file ); Elapsed: 00:00:21:40 3. I/O MİKTARINI AZALTMAK İÇİN CLOB ARA DEĞİŞKEN KULLANMAK -- CLOB DEGISKENDE TUTUP, TEK SEFERDE YAZDIRMA l_file UTL_FILE.FILE_TYPE; V_SMALL_BUFFER VARCHAR(32767) := null; V_BIG_BUFFER CLOB := 'NULL'; IF V_SMALL_BUFFER is null THEN ELSIF LENGTH(V_SMALL_BUFFER)+1+LENGTH(C.DUMMY_DATA) <= 32767 THEN V_SMALL_BUFFER := V_SMALL_BUFFER CHR(10) C.DUMMY_DATA; ELSE V_SMALL_BUFFER CHR(10) ); V_SMALL_BUFFER CHR(10) ); DBMS_XSLPROCESSOR.CLOB2FILE(V_BIG_BUFFER, 'CCEBI_TEMP', 'deneme.text'); DBMS_LOB.FREETEMPORARY( V_BIG_BUFFER ); Elapsed: 00:00:19:87 4. I/O MİKTARINI AZALTMAK İÇİN CLOB DEĞİŞKEN KULLANIP, SIKIŞTIRMA -- SIKISTIRMA ISLEMINDE KULLANILMAK UZERE IKI PROSEDUR YARATIYORUZ CREATE OR REPLACE FUNCTION D_CCEBI.c2b( c IN CLOB ) RETURN BLOB IS pos PLS_INTEGER := 1; buffer RAW( 32767 ); res BLOB; lob_len PLS_INTEGER := DBMS_LOB.getLength( c ); DBMS_LOB.createTemporary( res, TRUE ); DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite ); LOOP buffer := UTL_RAW.cast_to_raw( DBMS_LOB.SUBSTR( c, 16000, pos ) ); 6

IF UTL_RAW.LENGTH( buffer ) > 0 THEN DBMS_LOB.writeAppend( res, UTL_RAW.LENGTH( buffer ), buffer ); pos := pos + 16000; EXIT WHEN pos > lob_len; RETURN res; -- res is OPEN here CREATE OR REPLACE PROCEDURE D_CCEBI.write_blob_to_file (V_BLOB BLOB, V_FNAME VARCHAR2, V_DIRNAME VARCHAR2 ) IS vstart NUMBER := 1; bytelen NUMBER := 32000; len NUMBER; my_vr RAW(32000); x NUMBER; l_output utl_file.file_type; -- define output directory l_output := utl_file.fopen(v_dirname, V_FNAME,'wb', 32760); vstart := 1; bytelen := 32000; -- get length of blob len := dbms_lob.getlength(v_blob); -- save blob length x := len; -- if small enough for a single write IF len < 32760 THEN utl_file.put_raw(l_output,v_blob); utl_file.fflush(l_output); ELSE -- write in pieces vstart := 1; WHILE vstart < len and bytelen > 0 LOOP dbms_lob.read(v_blob,bytelen,vstart,my_vr); utl_file.put_raw(l_output,my_vr); utl_file.fflush(l_output); -- set the start position for the next cut vstart := vstart + bytelen; -- set the end position if less than 32000 bytes x := x - bytelen; IF x < 32000 THEN bytelen := x; 7

utl_file.fclose(l_output); -- SIKISTIRIP, DOSYA YAZMA l_file UTL_FILE.FILE_TYPE; V_SMALL_BUFFER VARCHAR(32767) := null; V_BIG_BUFFER CLOB := 'NULL'; V_COMPRESS_DATA BLOB; IF V_SMALL_BUFFER is null THEN ELSIF LENGTH(V_SMALL_BUFFER)+1+LENGTH(C.DUMMY_DATA) <= 32767 THEN V_SMALL_BUFFER := V_SMALL_BUFFER CHR(10) C.DUMMY_DATA; ELSE V_COMPRESS_DATA:=UTL_COMPRESS.LZ_COMPRESS( SRC=> d_ccebi.c2b( V_BIG_BUFFER ), quality=>1 ); d_ccebi.write_blob_to_file(v_compress_data, 'deneme2.lz','ccebi_temp'); DBMS_LOB.FREETEMPORARY( V_BIG_BUFFER ); Elapsed: 00:00:36:12 5. SIKIŞTIRILAN DATAYI DOSYA YERINE BLOB OLARAK TABLOYA YAZMA -- YAZILACAK TABLO CREATE TABLE D_CCEBI.RAPOR_TABLOSU ( RAPOR_ID NUMBER, TARIH DATE DEFAULT SYSDATE, RAPOR_VERI BLOB); -- SIKISTIRIP, TABLOYA KAYDETME l_file UTL_FILE.FILE_TYPE; V_SMALL_BUFFER VARCHAR(32767) := null; V_BIG_BUFFER CLOB := 'NULL'; V_COMPRESSED_DATA BLOB; 8

IF V_SMALL_BUFFER is null THEN ELSIF LENGTH(V_SMALL_BUFFER)+1+LENGTH(C.DUMMY_DATA) <= 32767 THEN V_SMALL_BUFFER := V_SMALL_BUFFER CHR(10) C.DUMMY_DATA; ELSE V_COMPRESSED_DATA:=UTL_COMPRESS.LZ_COMPRESS( SRC=> d_ccebi.c2b( V_BIG_BUFFER ), quality=>1 ); INSERT INTO D_CCEBI.RAPOR_TABLOSU VALUES( 1, SYSDATE, V_COMPRESSED_DATA ); COMMIT; DBMS_LOB.FREETEMPORARY( V_BIG_BUFFER ); Elapsed: 00:01:00:86 6. DATAYI SIKIŞTIRMADAN DOSYA YERINE CLOB OLARAK TABLOYA YAZMA CREATE TABLE D_CCEBI.RAPOR_TABLOSU ( RAPOR_ID NUMBER, TARIH DATE DEFAULT SYSDATE, RAPOR_VERI CLOB); l_file V_SMALL_BUFFER V_BIG_BUFFER UTL_FILE.FILE_TYPE; VARCHAR(32767) := null; CLOB := 'NULL'; IF V_SMALL_BUFFER is null THEN ELSIF LENGTH(V_SMALL_BUFFER) +1+ LENGTH(C.DUMMY_DATA) <= 32767 THEN V_SMALL_BUFFER := V_SMALL_BUFFER CHR(10) C.DUMMY_DATA; ELSE INSERT INTO D_CCEBI.RAPOR_TABLOSU VALUES( 1, SYSDATE, V_BIG_BUFFER ); 9

COMMIT; DBMS_LOB.FREETEMPORARY( V_BIG_BUFFER ); Elapsed: 00:01:56:94 Verilen örneklerin hepsinde alt satıra geçmek için chr(10) kullandığımı farketmişsinizdir. Ancak Windows tabanlı işletim sistemi kullanıyorsanız, chr(13) chr(10) kullanmanız gerekir. Kodunuzun platform bağımsız çalışması için statik olarak chr(10) yazmak yerine, aşağıdaki gibi bir yöntemi tercih edebilirsiniz: v_eol:= CASE WHEN DBMS_UTILITY.PORT_STRING LIKE 'IBMPC%' THEN CHR(13) CHR(10) ELSE CHR(10) Son olarak kodlardaki bir hatamı farkedip, beni uyaran Ümit Karaoğul a teşekkür ederim. 7. KAYNAKLAR TUNING PL/SQL FILE I/O ( http://www.oracle-developer.net/display.php?id=425 ) How to convert a CLOB to BLOB ( http://forums.oracle.com/forums/thread.jspa?messageid=1587220 ) Oracle UTL_FILE ( http://www.psoug.org/reference/utl_file.html ) 10