Default Value Opsiyonu ile Kolon Ekleme Performansı

Herkese Selam,

Bu yazıda sizlere günlük hayatta sık bir şekilde kullandığımız, var olan tabloya default değer ile kolon ekleme opsyonunun performansını örnek ile göstereceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Konuyu doğrudan örnek üzerinden göstermenin daha faydalı olduğunu düşünüyorum. Bu bağlamda doğrudan bir tablo yaratıp içine 1M’lik data dolduracağım.

CREATE TABLE PERFTEST
(
   X   NUMBER,
   Y   DATE
);

INSERT INTO PERFTEST
       SELECT 1, SYSDATE
         FROM DUAL
   CONNECT BY LEVEL < 1000000;

COMMIT;


SELECT COUNT (*) FROM PERFTEST; --999999

Şimdi içerisinde 1M’lik olan tabloya default değerli bir kolon eklemeyelim ve ne kadar sürede eklediğini ölçelim.

ALTER TABLE PERFTEST ADD Z NUMBER DEFAULT 1;
--Table altered.
--Elapsed: 00:00:24.21

resulttt

 

 

 

 

Yazdığımız alter statement tablo içerisindeki tüm data’nın Z kolonunu 1 yaptı.

Evet şimdi performansını değerlendirmeden farklı bir yöntem ile aynı işlemi tekrarlayalım.

CREATE TABLE PERFTEST_NEW
(
   X   NUMBER,
   Y   DATE
);

INSERT INTO PERFTEST_NEW
       SELECT 1, SYSDATE
         FROM DUAL
   CONNECT BY LEVEL < 1000000;

COMMIT;

SELECT COUNT (*) FROM PERFTEST_NEW;--999999

Şimdi içerisinde 1M’lik olan tabloya default değerli bir kolon eklemeyelim ve ne kadar sürede eklediğini ölçelim.

SET TIMING ON

ALTER TABLE PERFTEST_NEW
   ADD Z NUMBER DEFAULT 1 NOT NULL;

--Table altered.
--Elapsed: 00:00:00.03

resulttt

 

 

 

 

Yazdığımız alter statement tablo içerisindeki tüm data’nın Z kolonunu 1 yaptı.

Evet sonuçlardan da anlaşılacağı üzere 2 yöntem arasında inanılmaz büyük bir zaman farkı var.

İlk yöntemde Oracle tabloya yeni kolonu ekledi ve içerdeki dataya ait her satırın yeni eklenen kolon değerini 1 olarak update etti.  Bundan dolayı içerideki kayıt sayısına bağlı olarak bu işlemin süresinin DB tarafında aratabileceği veya azalabileceği yorumu yapılabilir. Bunun yanı sıra, çok büyük bir tablo üzerinden bu işlemi gerçekleştiriyorsak zaman sorunun yanında, etkilenen satır sayısının fazlalığından kodun üreteceği log miktarı artacaktır. Bu durumda undosegment’imizin boyutu üretilen log miktarından az olacağı durumda bu işlem başarılı bir şekilde yapılamayacaktır.

İkinci yöntem ise Oracle’ın 11g R2 ile beraber gelen bir iyileştirme aslında. NOT NULL contrainti ile beraber bu işlem gerçekleştirildiği takdirde Oracle arka tarafta bir önceki yöntem için uyguladığı process i işletmiyor. Bu geliştirdikleri yeni yöntem sayesinde data miktarına bağlı kalmaksızın bu işlem saniyeler mertebesinde tamamlanabiliyor. Tek hadikapı olurda not null constrainti bu alan üzerinden kaldırmak isterseniz, bu kaldırma işleminin süresi tahmin edileceği üzere oldukça uzun olacaktır. Özetle default değerli kolon ekleme işlemini NOT NULL constrainti ile beraber yaptığımızda inanılmaz bir performans elde ediyoruz. Bu özelliğin Oracle 11g ile beraber geldiği unutulmamalıdır.

 

 

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root, Uncategorized and tagged , , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s