Rastgele Yazılar : Veri ve Redo Log Dosyalarının Dosya Sisteminden ASM 'e ...
Rastgele Yazılar : SSIS ile Veri Aktarımı Esnasındaki bir hata
Rastgele Yazılar : Microsoft Datawarehouse'a Varım diyor!
Rastgele Yazılar : USER TANIMLAMA(USER PRIVILEGES)
Rastgele Yazılar : Alınan Backupların Sağlamlığını Nasıl Test Edebiliriz
Rastgele Yazılar : Mükerrer kayıtların silinmesi
Rastgele Yazılar : Tabloların Sıkıştırılması
Rastgele Yazılar : Web Madenciliği -- Bölüm 1
Rastgele Yazılar : SQL Server'da XML Parsing
Rastgele Yazılar : OBI Dashboard Tablarını Çoklu Satırda Görüntüleme
Sql Optimizer; herhangi bir sql sorgusu çalıştırıldığında ,istenilen bilgiye nasıl ulaşacağına “Optimizer” adı verilen veri tabanı optimizasyon bileşeni karar vermektedir. Sql Optimizer ile ilgili geniş bilgiye https://datawarehouse.gen.tr/Makale.aspx?ID=300&seo=sql-optimize-nedir-- buradan ulaşabilirsiniz.
SELECT name,department_id,name
FROM employees e, departments d
WHERE e.department_id=d.department_id
----Önerilmez
SELECT e.name,d.department_id,d.name
----Önerilir
Kolonlar için referans verilmediğinde (hangi tabloya bakması gerektiğini belirtmeksek) veri tabanı tüm tablolarda bu alanlar için arama yapmakta ve sorgu daha yavaş çalışmaktadır.
SELECT department_id, avg (salary)
FROM employees
GROUP BY department_id
HAVING department_id in (1,2);
---Önerilmez
WHERE department_id in (1,2)
GROUP BY departmant_id
---Önerilir
İlk işlemde öncelikle department_id’ye göre grouplama yaparken tüm kayıtlar için AVG işlemi yapmaktadır. Sonrasında koşulumuza uyan dataları sıralamaktadır. İkinci sorguda ise öncelikle şarta uyan dataları bulmaktadır. Şonrasında grouplamayı yapıp AVG işlemini gerçekleştirmektedir.Bu yüzden ikinci sorgu önerilir.
SELECT name,department_id
UNION
FROM employees2
UNION ALL
UNION tekrarlayan kayıtları elemektedir. UNION ALL ise şartsız her iki sorgu sonucundaki tüm kayıtları getirmektedir. Eleme işleminden dolayı UNION ALL sistemi yormaz ve daha hızlıdır.
SELECT employee_id, name, department_id
WHERE department_id IN (
SELECT department_id from departments)
FROM employees e
WHERE department_id EXISTS (
SELECT department_id from departments de
WHERE e.department_id=de.department_id)
IN bir listede aranan verinin olup olmadığını kontrol eder. EXISTS sadece kayıtların varlığını kontrol ederken, IN ise gerçek verileri kontrol eder. Alt sorgularda EXISTS daha iyi sonuçlar verdiğinden tercih edilmelidir.
SELECT DISTINCT department_id,name,FROM employees e,departments de
WHERE e.department_id=de.department_id;
SELECT department_id,name,FROM employees e
WHERE e.department_id EXISTS
( SELECT department_id FROM departments de
WHERE e.department_id=de.department_id);
Sorguda gelen kayıtlarda tekrarlı olanları görüntülememek için DISTINCT kullanılır. EXISTS ise bir alt sorguda gelen kayıtlar içinde istenilenlerin olup olmadığını kontrol eder. DISTINCT, gelen sonuçlarda tekrarlı olanları belirlemeden önce sıralama yaptığıdan verimsizdir ve bu yüzden de EXISTS tercih edilmelidir.
SELECT ...
FROM ps_jrnl_header a
WHERE jrnl_hdr_status=’B’
OR EXISTS
(SELECT ‘N’
FROM ps_jrnl_header
WHERE business_unit_js =a.business.unit_js
AND journal_id=a.journal_id
AND unpost_seq=a.unpost_seq
AND jrnl_hdr_status =’E’ );
FROM ps_jrnl_header a, ps_jrnl_header b
WHERE a.business_unit_js =b.business.unit_js
AND a.journal_id=b.journal_id
AND a.unpost_seq=b.unpost_seq
AND a. jrnl_hdr_status =’E’
AND b.jrnl_hdr_status !=’E’;
UNION kullanıldığında, optimizer kayıtları getirmek için iki benzer işlem gerçekleştirir. OR yapısında ise optimizer karar verirken daha karmaşık işlemler yapar ve daha az verimli sonuçlara ulaşır.