Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

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
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

Arkadaşlar selalar. Firebirdde bir garip hata ile karşılaştım. İçerisinde not in ile başka bir sorgu çalıştırıyorum. sanıyorum iç içe sorgulamada sıkıntı yaşıyorum. sorgu sonucu bana bir dakkadan fazla zamanda geliyor makina kilitlenyor işlemci kullanımı yüzde 50 yi geçiyor. anlamadım gitti.

yapmak istediğim müşterilerin idlerine bakarak satışlar tablosunda verilen iki tarih arasında ödemesi olmayanları (satıstur=2) bulup bakiyeler tablsosundan bakiye bilgilerini alarak göstermek..



şu koda bakarmısınız arkadaşlar... şimdiden herkese teşekkürler

IF ORDER='' THEN ORDER:='musteriler.Adi_soyadi';

DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.Close;
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Clear;
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('SELECT musteriler.*,(bakiyeler.satis+bakiyeler.taksitlisatis - bakiyeler.odemeler - bakiyeler.odemeler_taksit) AS BAKIYE');
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('FROM musteriler');
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('inner join bakiyeler on (musteriler.id = bakiyeler.musteri_id)');
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('WHERE Gizle=0 AND musteriler.Id Not In (SELECT satislar.musteri_Id FROM satislar');
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('WHERE satislar.tarih>='+QuotedStr(DateToStr(bsSkinDateEdit1.DATE))+' And satislar.tarih<='+QuotedStr(DateToStr(bsSkinDateEdit2.DATE))+' AND satislar.tur_id=2)');
if trim(bsSkinEdit2.Text)<>'' then Begin
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('and adres like '+QuotedStr('%'+bsSkinEdit2.Text+'%'));
end;
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.SelectSQL.Add('ORDER BY '+ORDER );
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.Open;
DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.FetchAll;
bsSkinEdit1.Text:='Geri dönen kayıt sayısı :'+ inttostr(DM.Q_RAP_IKI_T_ODEME_YAPMAYAN.RecordCount);
bgoktas
Kıdemli Üye
Mesajlar: 769
Kayıt: 27 Nis 2004 10:32
Konum: istanbul

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen bgoktas »

Sorunuzu daha anlşılabilir bir formatta ve sadece sql'i içeren bir hale getirmeniz daha açıklayıcı ve potansiyel cevap verecekler için daha cazip olur kanaatindeyim :!:
kolay gelsin...
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

biraz daha anlaşılır hale getirmek istedim.

Kod: Tümünü seç

with DM.Q_RAP_IKI_T_ODEME_YAPMAYAN do begin

Close;
SelectSQL.Clear;
SelectSQL.Add('SELECT musteriler.*,(bakiyeler.satis+bakiyeler.taksitlisatis - bakiyeler.odemeler - bakiyeler.odemeler_taksit) AS BAKIYE');
SelectSQL.Add('FROM musteriler');
SelectSQL.Add('inner join bakiyeler on (musteriler.id = bakiyeler.musteri_id) WHERE Gizle=0 AND musteriler.Id Not In (SELECT satislar.musteri_Id FROM satislar ');
SelectSQL.Add('WHERE satislar.tarih>='+QuotedStr(DateToStr(bsSkinDateEdit1.DATE))+' And satislar.tarih<='+QuotedStr(DateToStr(bsSkinDateEdit2.DATE))+' AND satislar.tur_id=2)');

if trim(bsSkinEdit2.Text)<>'' then Begin
SelectSQL.Add('and adres like '+QuotedStr('%'+bsSkinEdit2.Text+'%'));
end;
SelectSQL.Add('ORDER BY '+ORDER );
Open;
FetchAll;
end;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen rsimsek »

@bgoktas ın bahsettiği IBExpert gibi bir SQL aracınday sadece sorguyu yalın haliyle yazmanızı istedi. Delphi kodlarından ayıklamak zaman alacak :?

Kod: Tümünü seç

SELECT m.*, (b.satis + b.taksitlisatis - b.odemeler - b.odemeler_taksit) AS BAKIYE 
FROM musteriler m
INNER JOIN bakiyeler b ON (m.id = b.musteri_id)
WHERE m.Gizle = 0 AND m.Id Not In (SELECT s.musteri_Id FROM satislar s 
                                   WHERE s.tur_id = 2 AND s.tarih >= :Tarih1)
   AND m.adres like '%'|| :Adres ||'%'
ORDER BY m.Adi_soyadi 
Sanırım sonuçta böyle bir şey olacak. Baştakı m.* yerine ya gerekli alan adlarını yazın ya da kaldırıp ibexpert veya benzeri ile dener misiniz?

Ayrıca bir de bu şekilde deneyin.

Kod: Tümünü seç

SELECT (b.satis + b.taksitlisatis - b.odemeler - b.odemeler_taksit) AS BAKIYE 
FROM musteriler m, bakiyeler b
WHERE m.Gizle = 0 AND m.Id Not In (SELECT s.musteri_Id FROM satislar s 
                                   WHERE s.tur_id = 2 AND s.tarih >= :Tarih1)
   AND m.adres like '%'|| :Adres ||'%'
   AND b.musteri_id = m.id
ORDER BY m.Adi_soyadi 
Not: : lı parametreler yerine sabit değerler de yazabilirsiniz.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

arkadaşlar ilgi ve alakanıza teşekkür ediyorum. Kodlardan anlamışsınızdır. yapmak istediğim şu. müşterier tablom var. diğer tablolar ona bağlı alt tablolar. bakiyer tablosu viev tablo. satışlar tablosu müşterinin satış ve ödemelrin tutulduğu tablo. ben müşteri tablosoundan baz alanları alıp, bakiyelerden bakiye bilgisini alıp kullanıcının değer vereceği date bileşenine göre 2 tarih aralığında ödeme yapmayanları buldurmak. bir haftadır çabalıyorum. kodlardaki hatayı bulamadım. sanırım iç içe sorgulamada firebird tam çözüm mü üretmiyor. çünkü bir yerdede iç içe sorgu kullanmıştım ondada sıkıntı vardı. onu inner joinle birleştirerk yaptım o sorun kayboldu. bunu istediğim gibi yapamdım. yardımcı olan arkadaşlara teşekkür ediyorum. bunu vievde yapayım diyorum od olmuyrr.

hocam yardımlarınızı bekliyorum...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen rsimsek »

Kodu düzenlediğim şekliyle her yapı da yapmak istediğini karşılamıyor mu? ve her ikisini de denedin mi?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen Hakan Can »

View olan "Bakiyeler" tablosunun yerine view'ı oluşturan SQL cümlesini direk kullanıp (kısıtlamaları yani WHERE şartını da kullanarak) deneyebilir misin?
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

Rsimsek hocam dediklerini denedim yine aynı olmadı. Bir viev oluşturdum. ona gerekli olan tüm alanları attım. delphiden sorgulama yaparken not between kodu kullanyım dedim 30.12.1899 diye garip bir hata verdi. not between kullanamazmıyım yada iki tarih arasında olmayan kayıtarı nasıl getireyim.
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

arkadaşlar hala bir cevap buamdım sorunu çözemedim. yardım edin lütfen
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen rsimsek »

WHERE de kullanılan alanlar indeksli mi acaba?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
baloglurecep
Üye
Mesajlar: 261
Kayıt: 21 Tem 2006 04:59
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen baloglurecep »

kullandığım 3 tablom var.
müşteriler
bakiyeler
satışlar

müşterilerde Id indeksli (pk),tüm diğer tablolarda müşteri ıd olarak kullınılan alan.
bakiyerde Id ve satışlarda Id alanları indeksli (pk), yalnız bu iki tablodaki müşteri_Id ler indexli değil. sadece müşterilerdeki ıd indexli.

yapmak istediğim müşteri tablosundan bir kaç alan ile bakiyerdedeki toplam bakiyeyi göstererek bilgi amaçlı ve arama için satışlar tablosundaki tarih alanına göre kullanıcının gireceği değer aralıklarında ödeme olmayanları (tur_Id=2) bulup getirmesini istiyorum. kısaca özeti bu hocam.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Sql sorgu işlemciyi yüzde 50 kullanıyor ve 1 dakika sürüyor

Mesaj gönderen aslangeri »

s.a.
diğer tablolardaki müşteriid alanlarınıda indexler.
eğer tabloları ilişkilendirdiysen (fk) kendisi index oluşturmuştur zaten.
delphiden sorgulama yaparken not between kodu kullanyım dedim 30.12.1899 diye garip bir hata verdi. not between kullanamazmıyım yada iki tarih arasında olmayan kayıtarı nasıl getireyim.
burda verdiği hata mesajının tamamını verseydin keşke. parametre kullanmıyorsan tarih formatında bir hata olabilir.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla