Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Farklı bir SQL sorgusuna ihtiyacım var.
#1
Merhaba arkadaşlar, benim uzun süredir üzerinde çalıştığım bir sorgum var.
Şu anda programda zaten kullanıyorum  fakat bana yavaş gibi geliyor, öğrenmek istediğim,
bu sorguyu daha farklı bir şekilde yazabilirmiyiz? Daha hızlı çalışabilirmi?

Gelelim sorguya;
Tablo yapılarım şu şekilde ;
Cari Hesap Tablom : KOD, UNVAN.... vs.vs.
Stok Tablo : KOD, ADI... vs.vs.

Cari hesapları gruplamak için şöyle bir yapı oluşturdum ;
Cari_grup_1 tablom : KOD,ADI
Cari_grup_2 tablom : KOD,CGR1KODU, ADI
yani cari_grup_2 tablom cari_grup_1 tabloma master-detail olarak bağlı

aynı şekilde
stok_grup_1 tablom ve stok_grup_2 tablolarımda var ve birbiri ile master detail şeklinde bağlı.

ayrıca Hangi cari hesabın veya stoğun hangi gruplara ait olduğunu tutmak içinde;
cari_grup tablom : KOD, CARI_KOD, CGR1_KODU, CGR2_KODU şeklinde master detail ile hem cari hesaplara
hemde cari hesap grup tablolarına ayrı ayrı bağlı, aynı şekilde stok tablomda stok_grup tablosu ile
her iki stok grup tablosunada master-detail ile bağlı.
Bu şekilde yapmamın amacı ise; Cari ve Stok kartlarıma istediğim şekilde sınırsız olarak
gruplar oluşturabilmemdir.


Bunların yanında ; Fatura tablolarım mevcut, mesela;
fatura_2 tablom : KOD, TARIH, CARIKODU, STOKKODu, MIKTAR ... vs.vs.
şeklinde alanlar mevcut. Bu haliyle hem Cari, hem Stok hemde bunlara bağlı gruplara master-detail ile
bağlanmış oluyorlar.

Şimdi benim şöyle bir rapor almam gerekiyor (olayda burda karışıyor zaten) ;

Şu tarihler arasında, şu stok grubundan, şu cari hesap grubuna ne kadar mal satılmış [ sum(MIKTAR) yani ] ?

Benim sorgum şu şekilde (Sade haliyle) ;

Önce STOK_VER View'i oluşturdum ki her STOK hangi gruplara ait tek tabloda görünsün;

CREATE VIEW STOK_VER(
    KOD,
    ADI,
    GR1KODU,
    GR2KODU)
AS
SELECT S.KOD, S.ADI,
GR.GR1KODU AS GR1KODU,
GR.GR2KODU AS GR2KODU
FROM STOK S
LEFT JOIN STOK_GR AS GR ON GR.STOKKODU=S.KOD
ORDER BY S.ADI;

yukarıdaki View'in sonucu şu şekilde oluyor haliyle;

KOD--------Stok_adi------GR1KODU-------GR2KODU
1 ---------- Ürün_1-------  1 -------  2
2 ---------- Ürün_1 ------  1 -------  3
3 ---------- Ürün_2 ------  2 -------  4
4 ---------- Ürün_2 ------  2 -------  5

Yani Ürün_1 ve Ürün_2,   2 farklı gruba ait olabiliyor, 
aynı şekilde Cari hesaplarım içinde CARI_VER şeklinde bir View'im var



INPUT Parametrelerim ; T1,T2 : date ; CGRUP, STGRUP : Integer ;
for select
  st.KOD, 
  ft.TARIH , ft.MIKTAR
  from STOK_VER as st
left join
  (select f.STOKKODU, f.TARIH, c.KOD, // Burada CARI yide dahil ediyorum ki sorgulamaya katabileyim
                    sum(MIKTAR) as MIKTAR
                    from FATURA2 f
                    LEFT JOIN CARI_VER C ON c.KOD=f.CARIKODU
                    WHERE f.TARIH>=:T1 AND f.TARIH<=:T2 AND C.GR2KODU=:CGRUP // burda grubu filtreliyorum
                    group by f.STOKKODU, f.TARIH, c.KOD) as ft on ft.STOKKODU=st.KOD
WHERE st.GR2KODU=:STGRUP // burda da istenen stok grubunu filtreliyorum
INTO ..............................
DO
suspend;

Yukarıdaki Stored Procedure ile Hangi stok grubu, hangi cari hesap grubuna kaç adet satılmış onu çekiyorum,
fakat şu an kayıt sayısı 150.000 civarında ve sorgu, yoğun aylarda baya bi yavaşlıyor,
ortalama 10-15 saniye bazen daha uzun sürüyor, bunun hızlanması için daha farklı bir şekilde yazılabilirmi?
Fikirlerinize ihtiyacım var.

Ben View'da tek tablo oluşturup oradan sorgulamayı seçtim, daha farklı nasıl yaparım üzerinde sürekli
çalışıyorum ama sonuç nafile.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#2
Merhaba hocam,
Left join ile bağlantı kurduğunuz o alanlar için index tanımlaması yaptınız mı?
İlk aklıma gelen bu oldu.
Cevapla
#3
(25-08-2016, Saat: 19:31)Cyber Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba hocam,
Left join ile bağlantı kurduğunuz o alanlar için index tanımlaması yaptınız mı?
İlk aklıma gelen bu oldu.

İndex tanımlamaları var, zaten index tanımlaması yapmazsam raporun gelmesi 3-5 dakikayı buluyor Smile sorun kayıt sayısında, 3.500 civarı müşteri kayıtlı 150.000 civarı fatura kaydı var, bereket stokları 150 adet civarında, eğer stoklarda 1.000 leri bulsa rapor yerlerde sürünecek gibi geliyor bana, yıl sonuna kadar sanırım 300.000 kaydı geçecek fatura kayıtları, buna keza müşteri kayıtlarıda artacak, yıl sonunda görücez bakalım nasıl çalışıcak bu sistem.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#4
Hayırlı Cumalar,
Hocam Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol  kullanıyorum ve söylediğiniz gibi durumları kontrol etmek için yazdığım SQL cümlerisini burada test ediyorum ve alt kısımda bana isorgu işlemine ait PLAN SORT veriyor. burada NATURAL ibaresi geçiyor ise bu alanda ya indexleme yapılmamış yada eşleştirmede sıkıntı olduğunu görüp ona göre tekrar bir düzenleme yapıyorum.
İyi Çalışmalar.

Ekran_Al_nt_s.png
Cevapla
#5
(26-08-2016, Saat: 09:01)Cyber Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHayırlı Cumalar,
Hocam Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol  kullanıyorum ve söylediğiniz gibi durumları kontrol etmek için yazdığım SQL cümlerisini burada test ediyorum ve alt kısımda bana isorgu işlemine ait PLAN SORT veriyor. burada NATURAL ibaresi geçiyor ise bu alanda ya indexleme yapılmamış yada eşleştirmede sıkıntı olduğunu görüp ona göre tekrar bir düzenleme yapıyorum.
İyi Çalışmalar.

Ekran_Al_nt_s.png

Selam, Hayırlı Cumalar sizede. Aynen bende IBExpert kullanıyorum, Plan Analizer den bahsediyorsun, oraya bakıyorum index siz alan yok :Smile Sanırım yapı gereği mecburen katlanılacak bir durum bu. Denemelerime hala devam ediyorum.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi