Özet: Doğru ve performanslı sorgu(SQL) yazmanın ipuçları ve dikkat edilmesi gereken noktalar anlatılıyor. Serinin 3. yazısı.

SQL Performanslarında Dikkat Edilmesi Gerekenler -1  ve SQL Performanslarında Dikkat Edilmesi Gerekenler -2  ile devam eden serinin devamı niteliğinde aşağıdaki durumları Oracle Sql performansı noktasında dikkatinize sunuyoruz;

8- Sorguda gerekli filtreler koyarak IO ve execution zamanını düşürebiliriz. Mümkün olduğunca büyük kısıtlamalar yapmak faydalı olacaktır. Bu sayede ilgili verilere erişmek için index’leri de kullanmış olacaktır.

select * from all_objects where object_name like '%AB%';

yerine

select * from all_objects where object_name like '%AB%'
and owner='ORHAN' and object_type='TABLE'

gibi

Her iki sorgunun execution planına bakarak maliyetlerini karşılaştırabilirsiniz:

8_1

8_2

9- Partition’lı tablonun kullanıldığı sorguda PARTITION key’i ile belirteceğimiz ilgili partition’a gitmekle sorgunun maliyetini düşürecek, performansını artırmış olacağız.

select colon1, clon2, ... from table_name where id > 100;

yerine

select colon1, clon2, ... from table_name partition (p201704)
where id > 100;

gibi

Her iki sorgunun execution planına bakarak maliyetlerini karşılaştırabilirsiniz:

9_1

9_2

10- Sorguda koşulda kullandığımız RTRIM, TO_CHAR, UPPER, TRUNC vb. gibi fonksiyonlar ilgili kolonlar üzerindeki index’lerin kullanımını iptal edeceğinden dolayı eğer sıklıkla sorgumuzda bu ilgili kolonlar için bu fonksiyonları kullanacaksak fonksiyonel index (function based index) oluşturmamız gerekir. Bu sayede index kullanmış olacağından sorgumuz daha performanslı olacaktır.

 

create table my_objects as select * from all_objects;

SELECT object_name FROM my_objects
WHERE UPPER(object_name) ='ERROR_TABLOM';

CREATE INDEX idx_object_name ON my_objects (UPPER(object_name));

SELECT object_name FROM my_objects
WHERE UPPER(object_name) ='ERROR_TABLOM';

 

10_1

10_2

Serinin 4. yazısında görüşmek üzere, performanslı sorgular dileriz  🙂