Ö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:
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:
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';
Serinin 4. yazısında görüşmek üzere, performanslı sorgular dileriz 🙂