25-08-2016, Saat: 19:03
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;
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
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.
Ş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.