Oracle SQL Execution Plan Nedir ve Nelere Dikkat Edilmeli?

Burhan Ara
Bentego Teknoloji
Published in
3 min readJul 25, 2024

Oracle SQL’de performans optimizasyonu yapmak, veritabanı yöneticileri ve geliştiriciler için kritik bir görevdir. Bu sürecin temel taşlarından biri, execution plan okumayı ve anlamayı bilmektir. Bu yazıda, Oracle SQL execution plan’ının ne olduğunu, nasıl okunacağını ve nelere dikkat edilmesi gerektiğini örneklerle açıklanacaktır.

Execution Plan Nedir?

Execution plan, bir SQL sorgusunun veritabanı tarafından yürütülmesi sırasında hangi adımların izleneceğini gösteren mantıksal bir yapıdır. Bu plan, veritabanı optimizasyoncusu tarafından sorgunun en verimli şekilde çalıştırılması için oluşturulur ve tablo taramaları, indeks kullanımı, joinler gibi işlemleri içerir.

Neden Execution Planı Önemlidir?

  • Performans Analizi: Yavaş çalışan sorguların neden yavaş olduğunu anlamak için execution planını incelemek gerekir.
  • Optimizasyon: Planı analiz ederek sorguları daha verimli hale getirmek için gerekli adımlar atılabilir.
  • İndeks Kullanımı: İndekslerin etkinliğini kontrol etmek ve yeni indeksler oluşturmak için planı incelemek önemlidir.
  • Sorgu Tuning: Sorguları ayarlayarak performansı artırmak için planı kullanmak mümkündür

Execution Plan Nasıl Oluşturulur?

Execution plan’ı görmek için EXPLAIN PLAN komutunu kullanabilirsiniz. Bu komut, sorgunun nasıl çalışacağını açıklayan bir plan oluşturur ve bunu PLAN_TABLE adlı bir tabloya yazar.

Örnek:

EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Execution Plan Bileşenleri

Execution plan’ı okurken dikkat edilmesi gereken bazı temel bileşenler vardır:

  1. Operation : Oracle’ın sorguyu yürütmek için gerçekleştirdiği işlemler (örn. TABLE ACCESS FULL, INDEX SCAN).
  2. Object : İşlem sırasında erişilen nesneler (tablolar, indeksler).
  3. Cost : Oracle’ın bu adımı gerçekleştirmek için öngördüğü maliyet. Genellikle sorgunun maliyetini düşürmek istenir.
  4. Cardinality : Adımın geri döndüreceği tahmini satır sayısı.
  5. Bytes : Adımın geri döndüreceği tahmini veri boyutu.

Dikkat Edilmesi Gereken Noktalar

  1. Full Table Scans (Tam Tablo Taramaları): Full table scan, tablodaki tüm satırların okunmasını gerektirir ve genellikle pahalı bir işlemdir. Mümkünse, sorgunun indeks kullanarak çalışmasını sağlamak performansı artırır.

Örnek:

SELECT * FROM customers WHERE city = 'İstanbul';

Bu sorguda, city kolonu için bir indeks yoksa, Oracle tüm tabloyu taramak zorunda kalabilir. Bu, büyük tablolarda yavaş çalışabilir.

2. Index Usage (İndeks Kullanımı): Sorgunun indeks kullandığından emin olun. Index scan (indeks taraması) ve index seek (indeks araması) işlemleri genellikle daha az maliyetlidir.

CREATE INDEX idx_employees_department_id ON employees(department_id);

EXPLAIN PLAN FOR
SELECT * FROM employees WHERE department_id = 10;

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

3. Joins : Sorgularınızdaki join işlemlerinin nasıl yapıldığına dikkat edin. Nested loops, hash joins ve merge joins gibi farklı join türleri vardır. Her birinin performans üzerindeki etkisi farklıdır.

4.Sort Operations : ORDER BY, GROUP BY, DISTINCT gibi ifadeler sorgunun sıralama yapmasına neden olur. Sıralama işlemleri pahalı olabilir. Gereksiz sıralamalardan kaçının ve mümkünse indekslerden yararlanın.

Optimizasyon İpuçları

  1. İndeksler: Sorgularınızın daha hızlı çalışması için uygun indeksler oluşturun. Ancak, çok fazla indeks oluşturmak da performansı olumsuz etkileyebilir. Sadece gerekli indeksleri oluşturun.
  2. Veri Tabanı İstatistikleri: Oracle, en iyi execution plan’ı seçmek için veri tabanı istatistiklerine güvenir. Bu istatistiklerin güncel olduğundan emin olun.
  3. Partitioning : Büyük tabloları bölümlere ayırarak sorgu performansını artırabilirsiniz. Bölümlendirme, özellikle büyük veri kümeleri ile çalışırken faydalıdır.
CREATE TABLE employees_part
PARTITION BY RANGE (hire_date)
(
PARTITION p1 VALUES LESS THAN (TO_DATE('2000-01-01', 'YYYY-MM-DD')),
PARTITION p2 VALUES LESS THAN (TO_DATE('2010-01-01', 'YYYY-MM-DD')),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
);

4. Query Rewriting : Sorgularınızı daha verimli hale getirmek için yeniden yazmayı düşünün. Örneğin, alt sorguları JOIN ile değiştirmek veya UNION ALL yerine UNION kullanmak gibi.

-- Alt sorgu
SELECT * FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location_id = 1700);

-- JOIN ile yeniden yazılmış hali
SELECT e.* FROM employees e JOIN departments d ON e.department_id = d.department_id WHERE d.location_id = 1700;

5. Hint Kullanımı: Oracle’ın execution plan’ı üzerinde daha fazla kontrol sahibi olmak için optimizer hint’lerini kullanabilirsiniz. Ancak, hint’leri dikkatli ve doğru bir şekilde kullanmak önemlidir.

SELECT /*+ INDEX(e idx_employees_department_id) */ * FROM employees e WHERE department_id = 10;

Execution plan’ı okumak ve optimizasyon yapmak, Oracle SQL performansını artırmak için kritik becerilerdir. Unutmayın, her sorgu ve veritabanı farklıdır, bu yüzden en iyi sonuçları almak için çeşitli teknikleri denemek önemlidir.

--

--