Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Sorguyu Hızlandırma
#1
Değerli arkadaşlar merhaba,

80 adet field ve yaklaşık 11 bin kayıt olan bir tabloda aşağıdaki sorguyu çalıştırıyorum. Sonuçta 43 adet kayıt geri dönüyor.

Sorguda 6 tane ürün (yonca, korunga vs) adı var ve bu ürün isimleri değişebiliyor. Yani kullanıcının girdiği kayıtlara bağlı olarak ürün sayısı  1'de olabilir 100'de olabilir.

Fakat ürün sayısı arttıkça sorgu yavaşlıyor. Aşağıdaki sorguda 6 ürün için sorgu yaklaşık 20 saniye kadar sürüyor.

Ürün sayısının ve tablodaki toplam kayıt sayısının daha fazla olduğunu düşünecek olursak sonuca ulaşma süresi belki birkaç dakikayı bulacak.

Bu sorguyu hızlandırmak için yapabileceğimiz bir şeyler olabilir mi acaba?

SELECT
M1.tcno,M1.ADI_SOYADI
,M1.ADRES,M1.TELEFON,COUNT(M1.ADA_PARSEL) as PARSEL_SAYISI,
SUM(M1.BEYAN_ALAN) as BEYAN, sum(M1.TESPIT_ALAN) as TESPIT
, ( SELECT SUM(M2.TESPIT_ALAN) FROM tbl_yem_bitkileri M2 WHERE M2.EKILEN_URUN = 'Yonca (Yeşil Ot)' and M2.TARIM_SEKLI='Sulu' AND M2.TCNO = M1.TCNO and M2.KONTROL_YILI='2021') AS Yonca_sulu
, ( SELECT SUM(M7.TESPIT_ALAN) FROM tbl_yem_bitkileri M7 WHERE M7.EKILEN_URUN = 'Yonca (Yeşil Ot)' and M7.TARIM_SEKLI='Kuru' AND M7.TCNO = M1.TCNO and M7.KONTROL_YILI='2021') AS Yonca_Kuru
, ( SELECT SUM(M3.TESPIT_ALAN) FROM tbl_yem_bitkileri M3 WHERE M3.EKILEN_URUN = 'Korunga (Yeşil Ot)' and M3.TARIM_SEKLI='Sulu' AND M3.TCNO = M1.TCNO and M3.KONTROL_YILI='2021')AS Korunga_sulu
, ( SELECT SUM(M8.TESPIT_ALAN) FROM tbl_yem_bitkileri M8 WHERE M8.EKILEN_URUN = 'Korunga (Yeşil Ot)' and M8.TARIM_SEKLI='Kuru' AND M8.TCNO = M1.TCNO and M8.KONTROL_YILI='2021')AS Korunga_Kuru
, ( SELECT SUM(M4.TESPIT_ALAN) FROM tbl_yem_bitkileri M4 WHERE M4.EKILEN_URUN = 'Yulaf (Yeşil Ot)' and M4.TARIM_SEKLI='Sulu' AND M4.TCNO = M1.TCNO  and M4.KONTROL_YILI='2021')AS Yulaf_sulu
, ( SELECT SUM(M9.TESPIT_ALAN) FROM tbl_yem_bitkileri M9 WHERE M9.EKILEN_URUN = 'Yulaf (Yeşil Ot)' and M9.TARIM_SEKLI='Kuru' AND M9.TCNO = M1.TCNO  and M9.KONTROL_YILI='2021')AS Yulaf_Kuru
, ( SELECT SUM(M5.TESPIT_ALAN) FROM tbl_yem_bitkileri M5 WHERE M5.EKILEN_URUN = 'Fiğ (Yeşil Ot)' and M5.TARIM_SEKLI='Sulu' AND M5.TCNO = M1.TCNO  and M5.KONTROL_YILI='2021') AS Fig_sulu
, ( SELECT SUM(M10.TESPIT_ALAN) FROM tbl_yem_bitkileri M10 WHERE M10.EKILEN_URUN = 'Fiğ (Yeşil Ot)' and M10.TARIM_SEKLI='Kuru' AND M10.TCNO = M1.TCNO  and M10.KONTROL_YILI='2021') AS Fig_Kuru
, ( SELECT SUM(M6.TESPIT_ALAN) FROM tbl_yem_bitkileri M6 WHERE M6.EKILEN_URUN = 'Tritikale (Yeşil Ot)' and M6.TARIM_SEKLI='Sulu' AND M6.TCNO = M1.TCNO  and M6.KONTROL_YILI='2021' ) AS Tritikale_sulu
, ( SELECT SUM(M11.TESPIT_ALAN) FROM tbl_yem_bitkileri M11 WHERE M11.EKILEN_URUN = 'Tritikale (Yeşil Ot)' and M11.TARIM_SEKLI='Kuru' AND M11.TCNO = M1.TCNO  and M11.KONTROL_YILI='2021' ) AS Tritikale_Kuru
, ( SELECT SUM(M12.TESPIT_ALAN) FROM tbl_yem_bitkileri M12 WHERE M12.EKILEN_URUN = 'Arpa (Yeşil Ot)' and M12.TARIM_SEKLI='Sulu' AND M12.TCNO = M1.TCNO  and M12.KONTROL_YILI='2021' ) AS Arpa_sulu
, ( SELECT SUM(M13.TESPIT_ALAN) FROM tbl_yem_bitkileri M13 WHERE M13.EKILEN_URUN = 'Arpa (Yeşil Ot)' and M13.TARIM_SEKLI='Kuru' AND M13.TCNO = M1.TCNO  and M13.KONTROL_YILI='2021' ) AS Arpa_Kuru
FROM tbl_yem_bitkileri M1
Where M1.GRUP='YEM' and M1.TASINMAZ_DURUMU='Aktif'   and M1.KONTROL_YILI='2021'
GROUP BY M1.tcno,M1.ADI_SOYADI
,M1.ADRES,M1.TELEFON
   Having sum(M1.TESPIT_ALAN) >= 10
Order By M1.ADI_SOYADI
Cevapla
#2
1- Aynı tablo üzerinde nested sorgulamalar yerine UNION lar ile çalışın. Yani 12 adet alt sorgu yerine her bir sorguyu ayrı bir dataset olarak değerlendirip, UNION ile birleştirerek tek dataset oluşturmak sorgunuzu hızlandıracaktır.
2- EKILEN_URUN, TARIM_SEKLI, KONTROL_YILI, GRUP, TASINMAZ_DURUMU ve KONTROL_YILI gibi alanlarınızı string (varchar, text vb.) yerine, sayısal olarak tutun.
3- SQL cümlenizde geçen tüm koşulların (Where, grup by ve having altındaki) referans gösterdiği alanları tek tek indexleyin.
4- Birden fazla koşullarda (and ile kullandığınız) ise grup index oluşturun.
Begin : = end / 2;
Cevapla
#3
Firebird veritabanının hızlı çalışması için bazı küçük püf noktaları var;
1- Sorgulara dahil edeceğiniz alanların tümünü (WHERE, ORDER, SUM VB. TAMAMI) indexleyin. (IbExpert Indices sekmesinden)
2- Sorgu yazarken ilk olarak Integer, SmallInt, BigInt gibi sayısal değerleri çekin, sonra date ve varchar gelsin
Where M1.GRUP='YEM' and M1.TASINMAZ_DURUMU='Aktif' and M1.KONTROL_YILI='2021' yerine
Where M1.KONTROL_YILI='2021'and M1.GRUP='YEM' and M1.TASINMAZ_DURUMU='Aktif' gibi

Sorgu dönme hızının en az 5 kat arttığını göreceksiniz
Cevapla
#4
Dediklerinizi yaptım, index oluşturdum, where kısmında sayısal değerleri öne aldım. Fark edilir derece sorgu hızı arttı. Teşekkür ederim arkadaşlar.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  FB Birden Fazla sorguyu çalıştırma mcuyan 6 4.240 10-01-2019, Saat: 23:47
Son Yorum: mcuyan
  İki sorguyu birleştirme? canbir 12 9.719 12-11-2018, Saat: 11:14
Son Yorum: enes6635



Konuyu Okuyanlar: 1 Ziyaretçi