1.AMAÇ VE KAPSAM
Productıon olarak çalışan veritabanlarında querylere göre index oluşturup performans testleri yapmak oldukça riskli bir çalışmadır, bundan dolayı oracle bize virtual index özelliğini sağlamış. Bu özellik sayesinde index oluşturmadan querylerinizin performanslarını kontrol edebilirsiniz ve bu esnada uygulamadan gelen quer
ylerin execution planları bozulmayıp eski çalışmalarına devam edicektir.
2.UYGULAMA
2.1. Tablomuzu oluşturalım.
SQL> CREATE TABLE BCANBAKAL.ISLEM_LOG_02 ( LOG_ID VARCHAR2(40 BYTE) NOT NULL, LOG_YAPAN VARCHAR2(40 BYTE), LOG_YAPILAN VARCHAR2(40 BYTE), LOG_ISLEM_KATEGORI VARCHAR2(25 BYTE), LOG_ISLEM VARCHAR2(255 BYTE), LOG_ISLEM_SONUC CHAR(1 BYTE), LOG_ACIKLAMA VARCHAR2(1000 BYTE), LOG_SON_ISLEM_DAMGA VARCHAR2(20 BYTE), LOG_IP VARCHAR2(15 BYTE) ) TABLESPACE USERS PCTUSED 0 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K NEXT 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING;
2.2. Cost değeri yüksek olsun diye tablomun içine biraz data gömdüm.
SQL> select count(*) from bcanbakal.islem_log_02; COUNT(*) ---------- 632053 1 row selected.
2.3. Simdi LOG_IP kolonu üstünden bir sorgu çekip costunu görelim.
SQL> SQL> SET AUTOTRACE TRACEONLY explain statistics SQL> SELECT * FROM bcanbakal.ISLEM_LOG_02 WHERE LOG_IP ='95.9.29.232'; 293 rows selected. Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=28769 Card=87 Bytes=94 K) 1 0 TABLE ACCESS STORAGE FULL BCANBAKAL.ISLEM_LOG_02 (Cost=28769 Card=87 Bytes=94 K)
2.4. Nosegment opsiyonuylan ISLEM_LOG_02 tablosu üstünde bir virtual index olusturalim.
SQL> CREATE INDEX IDX_ISLEM_LOG_02_LOGIP ON ISLEM_LOG_02(LOG_IP) NOSEGMENT; Index Created
2.5. Olusturmus oldugumuz virtual indexi kullanabilmek için Oracle’ın underscore parametrelerinden biri olan _use_nosegment_indexes aktif hale getirmemiz gerekiyor.
SQL> ALTER SESSION SET "_use_nosegment_indexes" = TRUE; SET AUTOTRACE TRACEONLY explain statistics SELECT * FROM bcanbakal.ISLEM_LOG_02 WHERE LOG_IP ='95.9.29.232'; Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=2 Card=87 Bytes=94 K) 1 0 TABLE ACCESS BY INDEX ROWID BCANBAKAL.ISLEM_LOG_02 (Cost=2 Card=87 Bytes=94 K) 2 1 INDEX RANGE SCAN BCANBAKAL.IDX_ISLEM_LOG_02_LOGIP (Cost=1 Card=87)
2.6. Virtual indeximiz gerçek olmaya hak kazandı, sql sorgusunun costu 28769 dan 2 ye düştü.Son olarak indeximizi oluşturuyoruz..
SQL> CREATE INDEX IDX_ISLEM_LOG_02_LOGIP_r ON ISLEM_LOG_02(LOG_IP);
Ahmet KILINÇ says
Merhaba,
Güzel bir yazı olmuş, eline sağlık.
Bugra Canbakal says
Merhaba Ahmet hocam işinize yaradığına sevindim.
Muhammet UÇAR says
Öğretici ve faydalı bir makaleyi paylaşmanız çok güzel. Başarılarının devam etmesi dileğiyle.
Bugra Canbakal says
Yazıyı beyendiğinize sevindim, teşekkürler
İbrahim KURT says
Elinize sağlık çok güzel bir yazı olmuş.