Oracle Fetch First

Herkese Selam,

Bu yazıda sizlere Oracle 12c ile beraber gelen ve hayatımızı biraz daha kolaylaştıran bir mekanizmadan bahsedeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

PL/SQL ve SQL tabanlı yaptığımız her işte veya yazdığımız münferit her sorguda sıklıkla sorgudan dönen ilk N kaydı çekme ihtiyacımız oluyor. Bu ihtiyaca istinaden de genellikle inline view lar yaratarak ihtiyacımızı karşılamaya çalışıyoruz. Bu durumu nasıl handle ettiğimizi hatırlayacak olursak;

Problem: hr.fetchex tablosunda y kolonuna göre azalan sıralama yapıldığında ilk 5 kaydı alan sorgu yazımı.

CREATE TABLE hr.fetchex
(
x NUMBER,
y NUMBER
);

INSERT INTO hr.fetchex
VALUES (1, 2);

INSERT INTO hr.fetchex
VALUES (2, 2);

INSERT INTO hr.fetchex
VALUES (3, 9);

INSERT INTO hr.fetchex
VALUES (4, 9);

INSERT INTO hr.fetchex
VALUES (5, 9);

INSERT INTO hr.fetchex
VALUES (6, 4);

INSERT INTO hr.fetchex
VALUES (7, 5);

INSERT INTO hr.fetchex
VALUES (8, 5);

INSERT INTO hr.fetchex
VALUES (9, 5);

INSERT INTO hr.fetchex
VALUES (10, 6);
COMMIT;
SELECT *
FROM ( SELECT *
FROM hr.fetchex
ORDER BY y DESC)
WHERE ROWNUM < 6;

sonuc1

 

 

 

 

İhtiyacımıza istinaden gerekli inline view ı yaratarak ilk 5 kaydı ekrana getirdik.

Şimdi bu sorgunun execution planına bakalım.

EXPLAIN PLAN
FOR
SELECT *
FROM ( SELECT *
FROM hr.fetchex
ORDER BY y DESC)
WHERE ROWNUM < 6;
SET LINESIZE 2000

SELECT * FROM TABLE (DBMS_XPLAN.display ());

plantable1

 

Oracle,  12c ile beraber  bu tarz ihtiyaçlarımızı inline view yazma zahmetine girmeden yapabilme alt yapısını “FETCH FIRST” mekanizmasını kurarak kullanıcılarına sundu.

Şimdi yukarıdaki problemi bu mekanizma ile nasıl çözebiliriz ona bakalım.

SELECT *
FROM hr.fetchex
ORDER BY y DESC
FETCH FIRST 5 ROWS ONLY;

Evet yukarıdaki koddan anlaşılacağı gibi sadece FETCH FIRST yazıp kaç değeri istediğimi yazarak ihtiyacımı kolay bir şekilde karşılamış oldum.  Şimdi oluşan execution plana bakalım.

plantable2

 

 

 

 

 

 

 

2 Sorgunun execution planına baktığımızda cost olarak çok ufakta olsa bir değişim olduğunu görmekteyiz. Ancak test yaptığımız tablo içindeki data miktarı çok az olduğu için büyük veri setleri içerisinde bu tarz bir işlemin farklı performans sonuçları ortaya çıkaracağını tahmin etmek çokta zor değil.

Şimdi Fetch First ile yapabileceğimiz farklı bir kaç örneğe bakalım;

Problem: Eğer son satırda dönecek değer bir sonraki satırlarda da devam ediyorsa o değer sonlanana kadar her satırı sonuca dahil et.

SELECT *
FROM hr.fetchex
ORDER BY y DESC
FETCH FIRST 5 ROWS WITH TIES;

sonuc2.

 

 

 

 

 

Problem: y kolonuna göre azalan bir sıralamada tüm datanın ilk %40’ını getiren sorgu.

SELECT *
FROM hr.fetchex
ORDER BY y DESC
FETCH FIRST 40 PERCENT ROWS ONLY;

sonuc3

 

 

 

 

Problem: (Sayfalama)  y kolonuna göre azalan bir sıralamada tüm data içinden  5. kayıt ile 8. kayıt arasındaki kayıtları listele.

SELECT *
FROM hr.fetchex
ORDER BY y DESC
OFFSET 5 ROWS FETCH NEXT 3 ROWS ONLY;

sonuc4

 

 

Evet sık kullanılan örneklerden de görüleceği üzere Oracle bu alt yapı ile bu tarz ihtiyaçlarımıza oldukça pratik çözümler üreterek bize hem performans hemde zaman kazandırmış durumda.

Kaynaklar; 

http://docs.oracle.com

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, 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