Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
iki tablodan iç içe sorgu problemi (sorun çözüldü)
#1
Thumbs Up 
Arkadaşlar herkese sağlıklı günler dilerim. Yazdığım bir projedeki sorgu yavaşlığını bulmaya çalışıyorum. İki tablo içinden veri alarak sorgulama yapıyorum. iç içe sorgu kullanıyorum. yapmak istediğim ödeme yapmayan müşterileri bulmak. Sorgu çalışıyor ama program yanıt vermez hale geliyor donuyor. Aynı sorguyu ibexpert ile yapıyorum orda da aynı... sorgu çok geç cevap veriyor. ortalama 30sn. Gelen listeye dokunduğumda ibexpert donuyor. Müşteriler tablosunda 5000 civarı kayıt var. Satışlar tablosunda ise 150 bin civarı... Kodda bir anormallik olsa sorgulama yapmaz... Bu sorguyu nasıl farklılaştırabilirim nasıl hızlandırabilirim?

SELECT musteriler.adi_soyadi,musteriler.adres,musteriler.telefon,musteriler.telefon1,((musteriler.satis+musteriler.taksitlisatis) - (musteriler.odemeler - musteriler.odemeler_taksit)) AS BAKIYE
FROM musteriler WHERE (Gizle=0) AND musteriler.Id not In (SELECT satislar.musteri_Id FROM satislar WHERE (satislar.tur_id=2))
Cevapla
#2
(12-04-2020, Saat: 16:36)baloglurecep Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese sağlıklı günler dilerim. Yazdığım bir projedeki sorgu yavaşlığını bulmaya çalışıyorum. İki tablo içinden veri alarak sorgulama yapıyorum. iç içe sorgu kullanıyorum. yapmak istediğim ödeme yapmayan müşterileri bulmak. Sorgu çalışıyor ama program yanıt vermez hale geliyor donuyor. Aynı sorguyu ibexpert ile yapıyorum orda da aynı... sorgu çok geç cevap veriyor. ortalama 30sn. Gelen listeye dokunduğumda ibexpert donuyor. Müşteriler tablosunda 5000 civarı kayıt var. Satışlar tablosunda ise 150 bin civarı... Kodda bir anormallik olsa sorgulama yapmaz... Bu sorguyu nasıl farklılaştırabilirim nasıl hızlandırabilirim?

SELECT musteriler.adi_soyadi,musteriler.adres,musteriler.telefon,musteriler.telefon1,((musteriler.satis+musteriler.taksitlisatis) - (musteriler.odemeler - musteriler.odemeler_taksit)) AS BAKIYE
FROM musteriler WHERE (Gizle=0) AND musteriler.Id not In (SELECT satislar.musteri_Id FROM satislar WHERE (satislar.tur_id=2))

Merhaba,

30 sn değilde 10 sn düşürseniz bile bu işlemi yaparken yine aynı sorunu yaşarsanız. Bu sorunu çözmek için, bu işlemi thread içinde yaparsanız donma sorunu engellemiş olursunuz, bununla birlikte kullanıcıya bilgilendirme ekranı çıkarmanız daha faydalı olur.

İyi çalışmalar.
Cevapla
#3
değerli pro_imaj hocam öncelikle cevabınız için çok teşekkür ederim. thread işlemini duydum makaleleri okudum (değerli hocamız Tuğrul Helvacı'nın bu konuda güzel bir kalesi de var TIKLAYIN   ) projelerimde hiç kullanmadım. özellikle sorgularda bunu nasıl kullanabilirim? Delphinin örneği anlaşılması yorumlanması çok güç. Hele hele bunu hiç kullanmamış benim gibi kişiler için...
Cevapla
#4
(12-04-2020, Saat: 17:09)baloglurecep Adlı Kullanıcıdan Alıntı: değerli pro_imaj hocam öncelikle cevabınız için çok teşekkür ederim. thread işlemini duydum makaleleri okudum (değerli hocamız Tuğrul Helvacı'nın bu konuda güzel bir kalesi de var TIKLAYIN   ) projelerimde hiç kullanmadım. özellikle sorgularda bunu nasıl kullanabilirim? Delphinin örneği anlaşılması yorumlanması çok güç. Hele hele bunu hiç kullanmamış benim gibi kişiler için...

Thread konusunda bende kullandığım şeklinyle örnek vereyim bu şekilde deneyebilirsiniz.

      
  //Burada kullanıcıya göstereceğiniz mesaj ekranını açtırabilirsiniz
 
 TThread.CreateAnonymousThread(
       procedure()
       begin

         try
           //Buraya uzun zaman alan sql kodlarınızı yazabilirsiniz.
         except

         end;

         TThread.Queue(nil,
           procedure()
           begin

               //Buraya işlem yapılırken göstermek yazmak istediğiniz kodları yazabilirsiniz.

           end);

       end).Start;

Bu şekilde dener misiniz.
Cevapla
#5
(12-04-2020, Saat: 16:36)baloglurecep Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese sağlıklı günler dilerim. Yazdığım bir projedeki sorgu yavaşlığını bulmaya çalışıyorum. İki tablo içinden veri alarak sorgulama yapıyorum. iç içe sorgu kullanıyorum. yapmak istediğim ödeme yapmayan müşterileri bulmak. Sorgu çalışıyor ama program yanıt vermez hale geliyor donuyor. Aynı sorguyu ibexpert ile yapıyorum orda da aynı... sorgu çok geç cevap veriyor. ortalama 30sn. Gelen listeye dokunduğumda ibexpert donuyor. Müşteriler tablosunda 5000 civarı kayıt var. Satışlar tablosunda ise 150 bin civarı... Kodda bir anormallik olsa sorgulama yapmaz... Bu sorguyu nasıl farklılaştırabilirim nasıl hızlandırabilirim?

SELECT musteriler.adi_soyadi,musteriler.adres,musteriler.telefon,musteriler.telefon1,((musteriler.satis+musteriler.taksitlisatis) - (musteriler.odemeler - musteriler.odemeler_taksit)) AS BAKIYE
FROM musteriler WHERE (Gizle=0) AND musteriler.Id not In (SELECT satislar.musteri_Id FROM satislar WHERE (satislar.tur_id=2))

@baloglurecep hocam, ben bu tip sorgulamalarımı view ile yapıyorum. View ile yapsanız çok farkeder diye düşünüyorum dener misiniz lütfen.
Dosyalarınızı kendi bulutunuza yedekleyin. Yandex Disk

Eyvallah..
Cevapla
#6
IN sözcüğü kullanıldığında index yerine natural scan gerçekleşir. Join veya Exists ile bu iş çok hızlı olacaktır. Çünkü 150 bin kayıt fazla bir kayıt değil.
Cevapla
#7
(12-04-2020, Saat: 16:36)aloglurecep Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese sağlıklı günler dilerim. Yazdığım bir projedeki sorgu yavaşlığını bulmaya çalışıyorum. İki tablo içinden veri alarak sorgulama yapıyorum. iç içe sorgu kullanıyorum. yapmak istediğim ödeme yapmayan müşterileri bulmak. Sorgu çalışıyor ama program yanıt vermez hale geliyor donuyor. Aynı sorguyu ibexpert ile yapıyorum orda da aynı... sorgu çok geç cevap veriyor. ortalama 30sn. Gelen listeye dokunduğumda ibexpert donuyor. Müşteriler tablosunda 5000 civarı kayıt var. Satışlar tablosunda ise 150 bin civarı... Kodda bir anormallik olsa sorgulama yapmaz... Bu sorguyu nasıl farklılaştırabilirim nasıl hızlandırabilirim?

SELECT musteriler.adi_soyadi,musteriler.adres,musteriler.telefon,musteriler.telefon1,((musteriler.satis+musteriler.taksitlisatis) - (musteriler.odemeler - musteriler.odemeler_taksit)) AS BAKIYE
FROM musteriler WHERE (Gizle=0) AND musteriler.Id not In (SELECT satislar.musteri_Id FROM satislar WHERE (satislar.tur_id=2))

Merhabalar,

Nacizane bir kontrol yapmanız faydalı olacaktır.
- Tablo yapınız da INDEX alanları mevcut mu? -ve- WHERE alanlar da INDEX mevcut mu?

Bir sorum da olacak;
- Ödeme yapmayanlar bir tarih içinde sorgulanması gerekmiyor mu? Zira öyle ise sorgunuz da Tarih kısıtlaması yok.

Yanlış anlamadı isem; İki tablonuz mevcut.

Aşağıdaki örnek ile devam ederseniz sanırım sorun çözümlenebilir.

   

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#8
(13-04-2020, Saat: 01:43)hi_selamlar Adlı Kullanıcıdan Alıntı:
(12-04-2020, Saat: 16:36)aloglurecep Adlı Kullanıcıdan Alıntı: Arkadaşlar herkese sağlıklı günler dilerim. Yazdığım bir projedeki sorgu yavaşlığını bulmaya çalışıyorum. İki tablo içinden veri alarak sorgulama yapıyorum. iç içe sorgu kullanıyorum. yapmak istediğim ödeme yapmayan müşterileri bulmak. Sorgu çalışıyor ama program yanıt vermez hale geliyor donuyor. Aynı sorguyu ibexpert ile yapıyorum orda da aynı... sorgu çok geç cevap veriyor. ortalama 30sn. Gelen listeye dokunduğumda ibexpert donuyor. Müşteriler tablosunda 5000 civarı kayıt var. Satışlar tablosunda ise 150 bin civarı... Kodda bir anormallik olsa sorgulama yapmaz... Bu sorguyu nasıl farklılaştırabilirim nasıl hızlandırabilirim?

SELECT musteriler.adi_soyadi,musteriler.adres,musteriler.telefon,musteriler.telefon1,((musteriler.satis+musteriler.taksitlisatis) - (musteriler.odemeler - musteriler.odemeler_taksit)) AS BAKIYE
FROM musteriler WHERE (Gizle=0) AND musteriler.Id not In (SELECT satislar.musteri_Id FROM satislar WHERE (satislar.tur_id=2))

Merhabalar,

Nacizane bir kontrol yapmanız faydalı olacaktır.
- Tablo yapınız da INDEX alanları mevcut mu? -ve- WHERE alanlar da INDEX mevcut mu?

Bir sorum da olacak;
- Ödeme yapmayanlar bir tarih içinde sorgulanması gerekmiyor mu? Zira öyle ise sorgunuz da Tarih kısıtlaması yok.

Yanlış anlamadı isem; İki tablonuz mevcut.

Aşağıdaki örnek ile devam ederseniz sanırım sorun çözümlenebilir.



Kolay gelsin.

Öncelikle cevabınız için çok teşekkür ederim.  Tablo yapımda index özellikle arama alanlarında index yok. Sadece otomatik artan id ler var.  Dediğniz gibi satışlar tablosunda tarih alanı var. o kısmı filitre yaparken ekliyorum.  Tarih arasında ödeme yapmayanlar için....
Cevapla
#9
(13-04-2020, Saat: 16:34)baloglurecep Adlı Kullanıcıdan Alıntı:
(13-04-2020, Saat: 01:43)hi_selamlar Adlı Kullanıcıdan Alıntı: Merhabalar,

Nacizane bir kontrol yapmanız faydalı olacaktır.
- Tablo yapınız da INDEX alanları mevcut mu? -ve- WHERE alanlar da INDEX mevcut mu?

Bir sorum da olacak;
- Ödeme yapmayanlar bir tarih içinde sorgulanması gerekmiyor mu? Zira öyle ise sorgunuz da Tarih kısıtlaması yok.

Yanlış anlamadı isem; İki tablonuz mevcut.

Aşağıdaki örnek ile devam ederseniz sanırım sorun çözümlenebilir.



Kolay gelsin.

Öncelikle cevabınız için çok teşekkür ederim.  Tablo yapımda index özellikle arama alanlarında index yok. Sadece otomatik artan id ler var.  Dediğniz gibi satışlar tablosunda tarih alanı var. o kısmı filitre yaparken ekliyorum.  Tarih arasında ödeme yapmayanlar için....

Merhabalar,

Lütfen öncelikle INDEX'lerinizi ekleyin.  Belli bir hız artışı olacaktır.
Dönen sonuç üzerinde Filtre yapma ile uğraşmayın. Filtrelemeyi SQL içerisinde yapın.

Verdiğim kod örneğinde belli tarihler arasında satış yapan müşterilerin ID'leri mevcut.
Sonraki Sorgunuzu siz yazarak sonuca ulaşabilirsiniz.

Kolay gelsin.
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#10
gönderdiğiniz db'ye göre
CREATE INDEX MUSTERILER_IDXGIZLE ON MUSTERILER (GIZLE);
CREATE INDEX SATISLAR_IDXMUSTERI_ID ON SATISLAR (MUSTERI_ID);
CREATE INDEX SATISLAR_IDXTUR_ID ON SATISLAR (TUR_ID);
indexleri create ettikten sonra aşağıdaki SQL'i deneyin

SELECT
  M.adi_soyadi,
  M.adres,
  M.telefon,
  M.telefon1,((M.satis+M.taksitlisatis) - (M.odemeler - M.odemeler_taksit)) AS BAKIYE
FROM musteriler M
left JOIN satislar S ON M.id = S.musteri_id and s.tur_id = 2
WHERE M.gizle = 0
AND S.id is null
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Ibexpert ile yapilamayan kolon degisikligi(unique)(cozuldu) 41linea41 1 435 29-11-2019, Saat: 14:26
Son Yorum: hi_selamlar
  Çözüldü-store procedurde değişken kullanma sorunu sadikacar60 2 767 06-05-2019, Saat: 07:54
Son Yorum: sadikacar60
  çözüldü- DBeaver editöründe yeni veritabanı oluşturma sadikacar60 9 2.150 16-02-2019, Saat: 22:44
Son Yorum: sadikacar60
  Parametrik sorgu klavye 14 2.797 21-12-2018, Saat: 10:23
Son Yorum: klavye
  Firebird 3 embedded versiyon autoinc alan problemi canbir 5 2.018 21-11-2018, Saat: 22:38
Son Yorum: SercanTEK



Konuyu Okuyanlar: 1 Ziyaretçi