ORACLE INDEX SIKIŞTIRMA TEKNĐKLERĐ

Benzer belgeler
PCTFREE - PCTUSED ORACLE DEĞERLERĐ

ORACLE VERĐTABANINDA TABLO ve INDEX SIKIŞTIRMA

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

UTL_FILE PERFORMANSI

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

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.

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

Oracle da kullanılan veri tipleri:

PostgreSQL ve PL/pgSQL

YAPISAL SORGULAMA DİLİ (SQL)

PostgreSQL ve PL/pgSQL

VERĐTABANI YÖNETĐM SĐSTEMLERĐ

Bellek Yönetimiyle İlgili Notlar ORACLE BELLEK YÖNETĐMĐYLE ĐLGĐLĐ NOTLAR

VERİ TABANI YÖNETİM SİSTEMLERİ I

SQL veri tabalarına erişmek ve onları kullanmak için geliştirilmiş bir lisandır.

5 SQL- Yapısal Sorgulama Dili. Veritabanı 1

SAKLI YORDAM (Stored Procedure) Sibel Somyürek

SQL e Giriş. Uzm. Murat YAZICI

VIEW LERDE SQL HINT KULLANIMI

İLERİ VERİTABANI SİSTEMLERİ SUAT ÜSTKAN

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

Tablolar Arası İlşikiler ve Alan Özellikleri Siparis.musteri_no musteri.musteri_no Siparis.urun_kodu musteri.urun_kodu

Bölüm 4: DDL Veri Tanımlama Dili

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

Genel Kavramlar. Bilgisayar ortamında işlenebilecek durumda bulunan kayıtlar. Birbiri ile ilişkili veriler topluluğu ve veriler arası ilişkiler

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

SQL Deyimleri. Öğr.Gör.Volkan ALTINTAŞ Volkanaltintas.com

20461C Querying Microsoft SQL Server Modül Seviye Belirleme Testi

TRIGGER. Trigger lar, tablo üzerinde tanımlanabilen ve bu tablo üzerinde bir işlem gerçekleştiğinde tetiklenen programlama ögeleridir.

SQL'e Giriş. SELECT Deyimi. SQL Komutları. Yardımcı Deyimler

MOBİL UYGULAMA GELİŞTİRME

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

Aşağıdaki tabloyu inceleyin. Yeni kayıt girme, var olan bir kaydı silme veya güncelleme işlemlerini bu tabloya göre yapacağız.

Bu işleçlerin dışında, aşağıda belirtilen karşılaştırma işleçlerinden de yararlanılır.

Data Programming SQL Language. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

Veritabanı sistemlerinde veri bütünlüğünü sağlayabilmek için CONSTRAINTS olarak adlandırılan bazı zorlayıcı ifadeler kullanılabilir.

SQL TRIGGERS (Tetikleyiciler)

Veritabanı Tasarımı. Kullanıcı Erişimini Kontrol Etme

EXISTS VE NOT EXISTS fonksiyonları

Emrah UYSAL 1 TABLESPACE ENCRYPTION ORACLE 11G

SQL Komutları (2) Uzm. Murat YAZICI

BÖLÜM -6: VERİLERİ DEĞİŞTİRMEK

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

SQL'e Giriş 2. CREATE TABLE tabloadı (kolon isimleri ve veri türleri) (BOLUM_NO NUMBER, BOLUM_ADI CHAR(10));

DML işlemleri. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı May Öğr. Gör. Murat KEÇECĠOĞLU

YAPISAL SORGULAMA DİLİ. BARIŞ ARIBURNU barisariburnu.com

VERİTABANI Veritabanı Yönetimi

Yukarıdakilerden hangileri DML (Data Manipulation Language) ile gerçekleştirilir?

Veritabanı Yönetim Sistemleri (Veritabanı Tasarımı) SQL (Structured Query Language)

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

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

Veritabanlarına ve SQL'e Giriş. Devrim GÜNDÜZ. Teknoloji Destek Merkezi --

Bir çeşit prosedür. Ancak bu prosedür kendiliğinden çalışır. Çalışması için tabloya veri eklemek, veri silmek, veri değiştirmek yeterlidir.

ACCESS PLATFORMUNDA SQL

SQL sorguları çalıştırıldığında veriler tablo üzerinden iki yöntemle alınır.

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

Tablolar Arası İlşikiler ve Alan Özellikleri. Şekil 1. Magaza veritabanının tabloları ve tablolar arasındaki ilişkiler

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

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

PostgreSQL Veritabanı Sunucusu. 8.2 neler getiriyor?

BÖLÜM- 9: KULLANICI ERİŞİMLERİNİ YÖNETMEK

Veritabanı Tasarımı. Sütun Değerlerini Güncelleme ve Satırları Silme

Veri Tabanı ve Yönetimi

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

Mysql Veritabanı Komutları

SORGULAR. Öğr.Gör.Volkan Altıntaş

Veri Tabanı Hafta Dersi

EBE-368 Veri Tabanı Yönetim Sistemleri İlişkisel Model (The Relational Model)

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

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

FABREKA YAZILIM ELEKTRONİK DANIŞMANLIK TİC. LTD. ŞTİ.

VERİ TABANI YÖNETİM SİSTEMLERİ I

VT Sistem Gerçeklemesi Ders Notları- #11

Öğr.Gör.Murat KEÇECĠOĞLU. Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

SUNGURLU MESLEK YÜKSEKOKULU 5. T-SQL-2

Veritabanı Yönetim Sistemleri (Başarım Eniyileme Performance Tuning)

Veri Tabanı Programlamaya Giriş

SORGULAR VE ÇEŞİTLERİ II

T-SQL NEDİR? Microsoft T-SQL Transact-SQL

BMB202. Veritabanı Yönetimi Ders 6. SQL. Erdinç Uzun NKÜ Çorlu Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü

KULLANICI TANIMLI FONKSİYONLAR

Creating Tables in Oracle

Veri tabanı içinde bulunan tablolardakibazı sütunlarda bulunan bilgilerin, herkes tarafından görülmesi istenmeyebilir.

BÖLÜM- 8: DİĞER ŞEMA NESNELERİNİ OLUŞTURMA

İNTERNET PROGRAMCILIĞI HAFTA. MYSQL ile VERİTABANI İŞLEMLERİ - 1. Hazırlayan Fatih BALAMAN. İçindekiler. Hedefler. Veritabanı Oluşturma, Silme

Öğr.Gör.Murat KEÇECĠOĞLU 27 May. 28 May Elbistan Meslek Yüksek Okulu Bahar Yarıyılı

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.

T.C GAZİ ÜNİVERSİTESİ BİLİŞİM ENSTİTÜSÜ YÖNETİM BİLİŞİM SİSTEMLERİ ANA BİLİM DALI MS SQL KOMUTLARI VE MS SQL KOMUTLARI İLE İLGİLİ UYGULAMALAR

Elbistan Meslek Yüksek Okulu GÜZ Yarıyılı Ara Öğr. Gör. Murat KEÇECĠOĞLU

ASM (Automatic Storage Manager) 11 Mayıs 2009

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

Veritabanı Tasarımı. Tablo Değiştirme

Üst Düzey Programlama

VERİ TABANI YÖNETİM SİSTEMLERİ-II

Çok tablolu sorgulamalar

Veritabanı Tasarımı. Veritabanı Hareketleri

SP_RENAMEDB eski_isim, yeni_isim VEYA SP_RENAMEDB 'eski isim', 'yeni isim'

Veritabanı Tasarımı. Seriler ile Çalışma

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

Bölüm 3: DML Veri İşleme Dili

Transkript:

ORACLE INDEX SIKIŞTIRMA TEKNĐKLERĐ 1

İçindekiler 1. INDEX SIKIŞTIRMA... 3 2. INDEX SIKIŞTIRMA TESTLERİ... 3 2.1. Sıkıştırılmamış B-Tree Index... 4 2.2. Tek Sütunu Sıkıştırılmış B-Tree Index... 5 2.3. İki Sütunu Sıkıştırılmış B-Tree Index... 5 2.4. Üç Sütunu Sıkıştırılmış B-Tree Index... 6 2.5. Varsayılan Değerlerle B-Tree... 7 2.6. Bitmap Index... 7 2.7. Tablo Güncellemelerinde Bitmap ve Sıkıştırılmış B-tree Index... 8 3. SONUÇ... 9 2

1. INDEX SIKIŞTIRMA Daha önce hazırladığım bir yazıda (Oracle Veritabanında Tablo ve ) tablo ve index sıkıştırmaya değinmiştim. Bu yazıda Index sıkıştırmanın inceliklerine değineceğim. Create Index dediğimiz zaman yarattığımız Index ler B-tree index lerdir. Çalışmaların çoğu bu tarz index ler üzerinden yapılır. Sıkıştırma konusunda da temel uygulamamız B-tree index üzerine olacak. B-tree index leri sıkıştırırken dikkat etmemiz gereken hangi sütunların tekrar ettiğidir. Örneğin elimizde 5 sütunu olan bir tablo olsun. Bunun üç sütunundan bir index oluşturacağımızı varsayalım. Index e girecek sütunların değerlerinin aşağıdaki gibi olduğunu düşünelim: ID VERI SAYI TIP_1 TIP_2 ===================================================== 1 DENEME 1.333 A - 1 DENEME 3.143 F - 2 DENEME 5.511 G - 1 DENEME 9.681 E T... Bu tabloda ID ve VERI genelde aynı değerleri alırken; sayı farklı değerler almaktadır. Bunları bir üçlü olarak index lerseniz, sıkıştırma işleminde bir bütün olarak (örneğin; 1 DENEME 1.333 şeklinde...) düşünmeniz gerekir. Eğer üçlü olarak sıkıştırmaya kalkarsak, sıkıştırabileceğimiz eş sayısı azalır. Ama bunu ikiliye düşürürsek, sıkıştırabileceğimiz eş sayısı ciddi oranda artar. SAYI sütunu index in hâlâ bir parçasıdır ama sıkıştırılacak grubun içine alınmaz. Bu bahsettiğim durumu index compress ine ek bilgi girerek deneyebilirsiniz. Aşağıda bununla ilgili çeşitli testler yapılmıştır. 2. INDEX SIKIŞTIRMA TESTLERİ Denemeleri yapabilmek için ön hazırlık olarak bir tablo yaratılmış ve buna 50bin kayıtlık değer girilmiştir. CREATE TABLE D_CCEBI.DENEME ( ID NUMBER(10), VERI CHAR(1000), SAYI FLOAT(5) ) PCTUSED 0 PCTFREE 0 3

INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 30M MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) NOCOMPRESS PARALLEL (DEGREE 4) ; set timing on begin FOR i IN 1..50000 LOOP insert into D_CCEBI.DENEME values( mod(i,10), 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', DBMS_RANDOM.VALUE( )*10 ); if mod(i,10000)=0 then END IF; END LOOP; END; PL/SQL procedure successfully completed. Elapsed: 00:00:39.64 Farkedeceğiniz gibi tablonun ilk ve ikinci sütunu sıkça tekrar edecek değerlere sahiptir. Üçüncü ise 1 ile 10 arasında herhangi bir değer alabilecek rakamsal bir ifadedir. Sıkıştırılma işlemi kasıtlı olarak yapılmamıştır. Boyut olarak 57MB alan kaplamaktadır. SELECT ROUND(bytes/1024/1024,2) TABLE_SIZE FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='DENEME'; TABLE_SIZE 57MB 2.1. Sıkıştırılmamış B-Tree Index Şimdi bu tabloya hiç sıkıştırılmamış bir b-tree index yaratalım. CREATE INDEX D_CCEBI.IDX_NOCOMPRESS ON D_CCEBI.DENEME( ID, VERI, SAYI ) Elapsed: 00:01:17.67 SELECT ROUND(bytes/1024/1024,2) FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='IDX_NOCOMPRESS'; 4

66,25MB Tabloya sorgu denemesi yaparsanız, Index i kullanmak yerine full gittiğini görebilirsiniz. Ancak biz index kullanmasını zorluyoruz ve cost 1016 çıkıyor: SELECT /*+INDEX( DENEME ) */ * FROM D_CCEBI.DENEME WHERE ID = 5 AND VERI LIKE 'Lorem%' AND SAYI > 1; --- --- 0 SELECT STATEMENT 6268 6292K 1016 (1) 00:00:13 * 1 INDEX RANGE SCAN IDX_NOCOMPRESS 6268 6292K 1016 (1) 00:00:13 --- 2.2. Tek Sütunu Sıkıştırılmış B-Tree Index Đkinci denemede sadece ID sütununu compress ederek, deneme yapacağız: CREATE INDEX D_CCEBI.IDX_COMPRESS_COL1 ON D_CCEBI.DENEME( ID, VERI, SAYI ) COMPRESS 1 Elapsed: 00:01:00.23 SELECT ROUND(bytes/1024/1024,2) FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='IDX_COMPRESS_COL1'; 65,31MB 0 SELECT STATEMENT 6268 6292K 1002 (1) 00:00:13 * 1 INDEX RANGE SCAN IDX_COMPRESS_COL1 6268 6292K 1002 (1) 00:00:13 Boyut olarak 1MB azalma var. Cost ise 14 puan düştü. Tabloya full gitmek hâlâ daha iyi. Kayda değer bir gelişme yok. 2.3. İki Sütunu Sıkıştırılmış B-Tree Index Üçüncü denemede sadece ID ve VERI sütunlarını sıkıştırmasını istiyoruz: 5

CREATE INDEX D_CCEBI.IDX_COMPRESS_COL2 ON D_CCEBI.DENEME( ID, VERI, SAYI ) COMPRESS 2 Elapsed: 00:00:04.36 SELECT ROUND(bytes/1024/1024,2) FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='IDX_COMPRESS_COL2'; 1,38MB 0 SELECT STATEMENT 6268 6292K 24 (0) 00:00:01 * 1 INDEX RANGE SCAN IDX_COMPRESS_COL2 6268 6292K 24 (0) 00:00:01 Index in yaratılması için gereken süre %95 kısaldı; index boyutu %97 azaldı; cost %98 düştü. Ayrıca "Index kullan" zorlaması olmasa bile; tabloya full gitmek artık tercih edilmiyor. 2.4. Üç Sütunu Sıkıştırılmış B-Tree Index Dördüncü denemede bütün sütunları sıkıştırmasını istiyoruz: CREATE INDEX D_CCEBI.IDX_COMPRESS_COL3 ON D_CCEBI.DENEME( ID, VERI, SAYI ) COMPRESS 3 Elapsed: 00:00:07.92 SELECT ROUND(bytes/1024/1024,2) FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='IDX_COMPRESS_COL3'; 4,5MB 0 SELECT STATEMENT 6268 6292K 73 (0) 00:00:01 * 1 INDEX RANGE SCAN IDX_COMPRESS_COL3 6268 6292K 73 (0) 00:00:01 6

Üçüncü adımdaki başarıyı elde edemedik. Bu beklenen bir durum. Çünkü aynı blok içinde ID ve VERI ikilisinin aynı olduğu birden fazla satır olacaktır. Ama bu ikiliye bir de SAYI değerini eklersek, tekrar sayısı düşer. Çünkü SAYI, random bir değer tutmaktadır. 2.5. Varsayılan Değerlerle B-Tree Beşinci denemede aslında yukarıda yaptığımız işlemi tekrar edeceğiz. Eğer sütun sayısı vermezseniz, NON-UNIQUE INDEX ler için bütün sütunlar sıkıştırılır. UNIQUE index lerde ise son sütun hariç bütün sütunlar için sıkıştırılma işlemi gerçekleştirilir. 1 CREATE INDEX D_CCEBI.IDX_COMPRESS_COL_DEFAULT ON D_CCEBI.DENEME( ID, VERI, SAYI ) COMPRESS Elapsed: 00:00:09.75 SELECT ROUND(bytes/1024/1024,2) FROM DBA_SEGMENTS WHERE OWNER='D_CCEBI' AND SEGMENT_NAME='IDX_COMPRESS_COL_DEFAULT'; 4,5MB ------- ------- 0 SELECT STATEMENT 6268 6292K 73 (0) 00:00:01 * 1 INDEX RANGE SCAN IDX_COMPRESS_COL_DEFAULT 6268 6292K 73 (0) 00:00:01 ------- Görüldüğü üzere dördüncü deneme ile bir fark yok. 2.6. Bitmap Index Seçiciliği az olan index lerde bitmap index kullanmak bir başka yöntemdir. Bu sefer bir bitmap index yaratacağız. CREATE BITMAP INDEX D_CCEBI.IDX_BITMAP ON D_CCEBI.DENEME( ID, VERI, SAYI ) 1 http://richardfoote.wordpress.com/2008/02/17/index-compression-part-i-low/ 7

Elapsed: 00:00:05.07 3,88MB ---- ---- 0 SELECT STATEMENT 6268 6292K 63 (0) 00:00:01 1 BITMAP CONVERSION TO ROWIDS 6268 6292K 63 (0) 00:00:01 * 2 BITMAP INDEX RANGE SCAN IDX_BITMAP ---- Yukarıda da bahsettiğim gibi seçiciliği az olan tablo sütunlarında bitmap index kullanmak yararlı bir opsiyon. Ancak Bitmap index için sıkıştırma şansımız yok. Gerçi düşük bir boyuta sahip olduğundan muhtemelen sıkıştırmaya benzer bir durum var. 2.7. Tablo Güncellemelerinde Bitmap ve Sıkıştırılmış B-tree Index Testlerin sonunda bitmap index ile doğru sıkıştırılmış b-tree index in düşük seçicilik olsa bile kapıştığını gördük. Peki yeni değer girme veya silme durumunda sonuç (index boyutları, kayıt girme/silme zamanları vs...) nasıl değişecek? Şimdi de bu sorunun cevabını arayalım: Her iki index için de tablo drop edilip, önce 50bin kayıt girildi ve test başlangıç durumuna alındı. Ardından aşağıdaki ifade çalıştı: set timing on begin -- 30BIN YENI KAYIT GIRILIR FOR i IN 1..30000 LOOP insert into D_CCEBI.DENEME values(mod(i,10), 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', DBMS_RANDOM.VALUE( )*10 ); if mod(i,10000)=0 then END IF; END LOOP; -- ID DEGERI 2'DEN UFAK OLANLAR SILINIR DELETE FROM D_CCEBI.DENEME WHERE ID < 2; END; 8

Sıkıştırılmış b-tree index ile işlem 01 dk. sürdü. Đşlem sonunda index boyutu 1.38MB tan 3.38MB a çıktı. Cost ise 24 ten 52 ye yükseldi. Bitmap index ile işlem tekrar edildiğinde 01dk. 10sn. sürdü. Boyut 3.88 den 4.81 e çıktı. Cost 63 ten 90 a yükseldi. 3. SONUÇ Yapılan çalışmalarda şunu gördük; seçiciliği az olan bir durum söz konusu ise normal bir b-tree index yaratmak sağlıklı değil. Bunun yerine bitmap kullanmak gerekiyor. Ancak sıkıştırılacak sütunları doğru seçerseniz, seçicilik düşük olsa bile B-tree index ile bitmap index ten daha başarılı sonuçlar elde edebilirsiniz. Ayrıca B-tree index i sıkıştırırken bütün sütunların sıkıştırılmasının sağlıklı sonuç vermediği görülüyor. Önemli olan bir block içinde yer alacak sütun eşlerinin hangisinin daha çok tekrar edeceğini kestirebilmek. Diğer bir konu da tablonun işlem görmesi... Sıkıştırılan index eğer çok DML gören bir tablodaysa, index i sıkıştırmak mantıklı değildir. Yerden kazanmak bu kadar önemliyse ve sıkıştırmakta kararlıysanız, zaman zaman index i drop edip, tekrar yaratmayı tercih edebilirsiniz. Drop edip tekrar yaratma bitmap index lerde sıkça kullanılan bir yöntemdir. Compress b-tree index lerde de gerek fragmentasyonun önüne geçmek, gerekse alanı geri kazanmak için aynı metodu deneyebilirsiniz. Güncellenen bir tabloda sıkıştırılmış b-tree index, ara ara yeniden yaratılmadığı (veya rebuild edilmediği) takdirde index in boyut artışı kaçınılmaz olarak devam eder. Bu da cost artışına neden olacak; hatta bir süre sonra index yerine tabloya full gitme gibi durumlar gerçekleşecektir. Yine de sıkıştırılan b-tree index in bitmap index e göre bir avantajı vardır. Sık güncellenen bir tabloda sıkıştırılmış b-tree index leri drop edip tekrar yaratmayı sıklıkla yapmasanız bile, bitmap index e nazaran, güncellemelerde daha az işlem gücü gerekecektir. 9