Çok yavaş çalışan bi sorgu.Bu sorguya bi bakabilirmisiniz.

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Çok yavaş çalışan bi sorgu.Bu sorguya bi bakabilirmisiniz.

Mesaj gönderen meron06 »

Sel.al.arkadaşlar.firebird vt kullanıyorum.2 tablomda ortalama 500 kadar kayıt var.iç içe yazdığım sorgu anormal derecede yavaş çalışıyor.

select HASTAAD, HASTANO, HASTASOYAD, MURACAATNO, SERVISADI, SERVISKODU, GELISNO, DRADI, DRKODU, GIRISTARIHI from GELISLERDETAY
where GELISNO IN (SELECT DISTINCT GELISNO FROM HIZMETLER
WHERE ISLEMTURU='LABORATUVAR' AND TARIH>=:GTARIH AND TARIH<=:BTARIH and DURUM='H')

bu sorguyu bi incelemeniz mümkünmü arkadaşlar.anormal derecede yavaş çalışıyor.bu sorguyu nasıl hızlandıra bilirim.denemek için sp ile yaptım hiç bi fark olmadı.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Her ne kadar defalarca söylenmişse de tekrarlıyayım. Where kısmındaki kıyaslama alanlarını INDEKS li olmaslı perfomansı artırır bu ilk düşünülecek durum. İkincisi IN kullanırken dikkat etmek lazım :!: Ben her kayıtta IN den sonraki SELECT in çalıştığını düşünüyorum :?: Dolaysıyla olayı JOIN ile yapman perfomansı artıracaktır :idea:

Kod: Tümünü seç

select gd.HASTAAD, gd.HASTANO, gd.HASTASOYAD, gd.MURACAATNO, gd.SERVISADI, gd.SERVISKODU, gd.GELISNO, gd.DRADI, gd.DRKODU, gd.GIRISTARIHI from GELISLERDETAY gd, HIZMETLER h
where h.ISLEMTURU='LABORATUVAR' AND h.TARIH BETWEEN :GTARIH AND :BTARIH and h.DURUM='H'
  and gd.GELISNO = h.GELISNO 
h.TARIH>=:GTARIH AND h.TARIH<=:BTARIH yerine h.TARIH BETWEEN :GTARIH AND :BTARIH kullanabilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

Kod: Tümünü seç

E ISLEMTURU='LABORATUVAR' AND TARIH>=:GTARIH AND TARIH<=:BTARIH and DURUM='H')
ISLEMTURU nu integer yapın, gerekli açıklamayı calculated yaparsınız, ayrıca buna index tanımlayın(veya ana en fazla kullanılan farklı olan sutuna),
DURUM u integer yapın, gerekli açıklamayı calculated yaparsınız,
TARIH < > .. ifadesini betweenle yazın, hız olarak farkedermi bilmiyorum ama okunaklılığı artar.

ek: @recep abi ne zaman yazdın ya :shock: :D merak ettimde bu inin bu şekilde çalıştığını nasıl anladınız, ben kendi projemde aynı tipte iki sorguyu in le ve join ile denemiştim, ibexpertte kayıt getirme süreleri aynı, join in hazırlanma süresi daha uzundu :roll: benmi yanlış yapıyorum yoksa :o
.-.-.-.-.-.-.-. ^_^
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

cevaplarınız için teşekkür ederim arkadaşlar müsait ıolurolmaz deneyip buraya sonucu yazacam.
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

Recep abi denedim ama sorgu sonucunda aynı özellikte kayıtlar geliyor.örneğin benim hizmetler tablomda gelis numaraları aynı olan birden fazla kayıtım var. burda bi distinct işlemine tabi tutmak lazım.ama başaramadım.
meron06
Üye
Mesajlar: 393
Kayıt: 15 Eki 2005 04:23

Mesaj gönderen meron06 »

Arkadaşlar çok tşekkür ederim sorunu şu şekilde çözdüm.yardımlarınız için teşekkür ederim gayette iyi çalışıyor.
select DISTINCT(GELISLERDETAY.GELISNO),GELISLERDETAY.GELISNO,GELISLERDETAY.HASTAAD, GELISLERDETAY.HASTANO, GELISLERDETAY.HASTASOYAD, GELISLERDETAY.MURACAATNO, GELISLERDETAY.SERVISADI, GELISLERDETAY.SERVISKODU, GELISLERDETAY.DRADI, GELISLERDETAY.DRKODU, GELISLERDETAY.GIRISTARIHI from GELISLERDETAY , HIZMETLER
where HIZMETLER.ISLEMTURU='LABORATUVAR' AND HIZMETLER.TARIH BETWEEN :GTARIH AND :BTARIH and HIZMETLER.DURUM='H'
and GELISLERDETAY.GELISNO =HIZMETLER.GELISNO

tşk.ederim receb abi saolasın Allah kolaylık versin.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Çözüm olabildiyse ne mutlu. Fakat benim gözümden kaçan @mege nin söylediği karakter/string karşılaştırmaları da sayısal alanlara çevirerek daha yüksek perfomanslar elde edebilirsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Recep Abi,
IN kullanımında eğer sonraki alt sorgu ana sorgudan bagımsız ise ilk once o hesaplanır ve her satırda calismaz...

Kod: Tümünü seç

Select * from ULKE where ULKE_NO in( Select ULKE_NO from DIGER_TABLO)
boyle bir cumle Query optimizer tarafından

Kod: Tümünü seç

Select * from ULKE where ULKE_NO in( 1,5,10,15,60)
gibi bir şekle donuşturulerek çalıştırılır...

Fakat altsorguda eğer ana sorgu ile bir ilişki var ise

Kod: Tümünü seç

Select * from ULKE as U where 
(Select T. ULKE_NO from TABLO as T where T.ALAN=U.ALAN)
Belk itam anlaşılır bir örnek olmadı fakat yukarıdaki tarzda altsorugnun ana sorgu ile de bir ilşkisi var ise o zaman Recep Abi'nin dediği gibi her satırda yeniden hesaplanan bir altsorug karşımıza çıkar ki bunu mümkün ise join şekline donuşturmek ciddi performans sağlayacaktır.

Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hocam öyle gibi görünse de verdiğin örneklerde öyle çalışır belki fakat yukarıdaki örnekte where içinde ana tablonun/sorgunun bir alanı olunca ve her kayıtta değiştikçe alt sorgu da her seferinde yeniden çalışacaktır diye düşünüyorum :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

evet abi aynısını soyluyorum zaten ana sorgudan alan kullanılması durumunda mecburen her satırda yeniden calisacak detay sorgu
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

hım anladım teşekkürler :wink: :elsalla: ben fahrettin abinin ilk söylediği şekilde denemiştim, (dbworkbench'indi sanırsam), query optimizer tarzı bir modülü vardı ve grafik olarak her bir subquerynin birbirleri ile bağlantısını ve harcadığı süreleri gösteriyordu, ama üstteki query ile bağlantısı olmayan bir şekilde denemiştim :mrgreen:
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

fahrettin yazdı:evet abi aynısını soyluyorum zaten ana sorgudan alan kullanılması durumunda mecburen her satırda yeniden calisacak detay sorgu
Evet hocam önceki mesajda aynını söylemişsin. Yani sorguların birbirinden bağımsızlığı veya bağımlılığı önemli :wink:
fahrettin yazdı:IN kullanımında eğer sonraki alt sorgu ana sorgudan bagımsız ise ilk once o hesaplanır ve her satırda calismaz...
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla