Arkadaşlar veritabanı olarak oracle kullanmaktayım. Böyle bir sorgum var*
SELECT A.ST2MANID,A.SAYBIL_ID,A.CIHAZ_NO,A.MONTH,A.WATT,A.BLOCK ,A.TARIH,A.PT_SPENT_UNIT,A.KWH,A.SEC,A.CUSTOMER_ID *FROM
(SELECT NVL(MIN(SM.ID),0) ST2MANID,ST.SAYBIL_ID,ST.CIHAZ_NO,
MC.MONTH,MC.WATT,MC.BLOCK,MC.TARIH,
MT.PT_SPENT_UNIT,parasal_aylik_tuketim(nvl(min(sm.id),0),mc.tarih) as KWH ,'0' AS SEC,SM.CUSTOMER_ID FROM PGEWOS_TB_ST2MAN SM
JOIN PGEWOS_TB_SAYTP2 ST ON ST.ID=SM.SAYTP2_ID
RIGHT JOIN PGEWOS_TB_MANCPT MC ON SM.ID=MC.ST2MAN_ID
RIGHT JOIN PGEWOS_TB_MANTKT MT ON SM.ID=MT.ST2MAN_ID AND MC.TARIH=MT.TARIH
RIGHT JOIN PGEWOS_TB_ABOSTS *AB ON AB.SAYBIL_ID = ST.SAYBIL_ID AND AB.DURUM = 2
WHERE MC.TARIH >= trunc(AB.T_TARIH,'MM')
GROUP BY ST.SAYBIL_ID,ST.CIHAZ_NO,
MC.MONTH,MC.WATT,MC.BLOCK,MC.TARIH,
MT.PT_SPENT_UNIT,SM.CUSTOMER_ID) A
Bu sorgu çalıştırınca yaklaşık olarak 20-25 saniye arasında veri getirmektedir. Benim için makul bir durum. Fakat ek olarak başka tabloya bağlanmam gerekiyor ve NOT IN komutu kullanmaktayım.
yani bundan sonra ek olarak bunu eklediğimde
WHERE A.ST2MANID NOT IN
(SELECT FT.ST2MAN_ID *FROM PGEWOS_TB_PRSFTR_G FT WHERE FT.DURUM = 1 AND A.TARIH = FT.TARIH AND FT.ESTIMATED_STATUS = 0)
ORDER BY A.CUSTOMER_ID,A.TARIH ASC
sorgu acayip uzuyor ve 10 dakikadan fazla yapiyor bu işlem. NOT IN komutu yavaş olduğunu biliyorum fakat bu kadar yavaş olacağına tahmin edemedim. Veriler sürekli büyümektedir ve bu süresi dolaysıyla daha fazla olacağı için bunu en kolay şekilde nasıl düzeltebilirim? Yada sizin tavsiyeleriniz nelerdir bunu parçalayarak 2 query bir şekilde yaparak yada başka bir yol varsa iyi olur. Her şeye açığım :
Teşekkürler
SELECT A.ST2MANID,A.SAYBIL_ID,A.CIHAZ_NO,A.MONTH,A.WATT,A.BLOCK ,A.TARIH,A.PT_SPENT_UNIT,A.KWH,A.SEC,A.CUSTOMER_ID *FROM
(SELECT NVL(MIN(SM.ID),0) ST2MANID,ST.SAYBIL_ID,ST.CIHAZ_NO,
MC.MONTH,MC.WATT,MC.BLOCK,MC.TARIH,
MT.PT_SPENT_UNIT,parasal_aylik_tuketim(nvl(min(sm.id),0),mc.tarih) as KWH ,'0' AS SEC,SM.CUSTOMER_ID FROM PGEWOS_TB_ST2MAN SM
JOIN PGEWOS_TB_SAYTP2 ST ON ST.ID=SM.SAYTP2_ID
RIGHT JOIN PGEWOS_TB_MANCPT MC ON SM.ID=MC.ST2MAN_ID
RIGHT JOIN PGEWOS_TB_MANTKT MT ON SM.ID=MT.ST2MAN_ID AND MC.TARIH=MT.TARIH
RIGHT JOIN PGEWOS_TB_ABOSTS *AB ON AB.SAYBIL_ID = ST.SAYBIL_ID AND AB.DURUM = 2
WHERE MC.TARIH >= trunc(AB.T_TARIH,'MM')
GROUP BY ST.SAYBIL_ID,ST.CIHAZ_NO,
MC.MONTH,MC.WATT,MC.BLOCK,MC.TARIH,
MT.PT_SPENT_UNIT,SM.CUSTOMER_ID) A
Bu sorgu çalıştırınca yaklaşık olarak 20-25 saniye arasında veri getirmektedir. Benim için makul bir durum. Fakat ek olarak başka tabloya bağlanmam gerekiyor ve NOT IN komutu kullanmaktayım.
yani bundan sonra ek olarak bunu eklediğimde
WHERE A.ST2MANID NOT IN
(SELECT FT.ST2MAN_ID *FROM PGEWOS_TB_PRSFTR_G FT WHERE FT.DURUM = 1 AND A.TARIH = FT.TARIH AND FT.ESTIMATED_STATUS = 0)
ORDER BY A.CUSTOMER_ID,A.TARIH ASC
sorgu acayip uzuyor ve 10 dakikadan fazla yapiyor bu işlem. NOT IN komutu yavaş olduğunu biliyorum fakat bu kadar yavaş olacağına tahmin edemedim. Veriler sürekli büyümektedir ve bu süresi dolaysıyla daha fazla olacağı için bunu en kolay şekilde nasıl düzeltebilirim? Yada sizin tavsiyeleriniz nelerdir bunu parçalayarak 2 query bir şekilde yaparak yada başka bir yol varsa iyi olur. Her şeye açığım :

Teşekkürler