Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
FB Sp içinde Select
#21
(22-01-2019, Saat: 17:05)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bendr @klavye hocamin dedigi gibi biliyorum.. view'lere çok sık kullanılan bir select bloğu diyebiliyoeuz diye biliyorum..

Bu arada sp deki tarih filtresi haricinde sql kodlarinin aynisi hocam hic bir fark yok.. hatta indexleri de selectin icindekicgroup lara gore duzenledim. Fakat celeron cpu lu pc lerde cidden 5 6 sn gibi uzun surede data getiriyor..

Select icerisindeki "sum" ile toplam aldiginiz alanlarida indexleyip denermisiniz.
Cevapla
#22
Sanırım ne demek istediğimi anlatamadım. Üçüncü SELECT ifadeniz aşağıdaki gibi:

for select GTAR as SATTARIHI, 'GİDER' as SATTIPI, GCIKKASA as SATKUL, round(sum(GTUTAR), 2) as TOP
     from GIDER
    where (GTAR between :TAR1 and :TAR2)
    group by SATTARIHI, SATTIPI, SATKUL
    --union all
    into :SATTARIHI, :SATTIPI, :SATKUL, :TOP

Burada SATTARIHI, SATTIPI, SATKUL isimli alanlar gruplamaya tabii tutulmuş ancak SELECT ifadesi içinde, GTAR ve GCIKKASA alanları yalın olarak kullanılmış. (Min, Max, Avg, Sum vb ile değil). Bu Firebird yoksa SANAL ALAN İSİMLERİ ile GROUP BY 'mı yapıyor ?? Normal durumda, tablo içinde gruplamada kullandığınız alanların haricindeki alanları bir birleştirme fonksiyonuna tabii tutmalısınız, aksi durumun hata vermesi gerekir. Ama bu aralar çok anormal şeyler görüyorum. Şaşırmayacağım..

Ayrıca, burada yine garip bir mantıksal problem var. Bana izah edebilirseniz memnun olurum. Yukarıdaki cümleden anladığımı yazayım:

Gider tablosunda GTAR alanı belirli tarih arasında olan kayıtları seç. Herhangi bir kısıt olmadığı için buradan birden fazla result dönebilir (Tabii sizin veritabanını nasıl tasarladığınızı bilemiyorum). Bu durumda, yukarıdaki for ifadesi bir CURSOR gibi davranıyor ve gelen tüm resultset içinde dönüyor. (5 kayıt var ise 5 defa dönecek demektir.) Peki eğer durum bu şekilde ise oradaki INTO ifadesi problemli çalışmıyor mu ? Her zaman 5nci kaydın bilgileri dolmuş olacak ilgili değişkenlerin içine.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#23
(22-01-2019, Saat: 17:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Sanırım ne demek istediğimi anlatamadım. Üçüncü SELECT ifadeniz aşağıdaki gibi:

for select GTAR as SATTARIHI, 'GİDER' as SATTIPI, GCIKKASA as SATKUL, round(sum(GTUTAR), 2) as TOP
     from GIDER
    where (GTAR between :TAR1 and :TAR2)
    group by SATTARIHI, SATTIPI, SATKUL
    --union all
    into :SATTARIHI, :SATTIPI, :SATKUL, :TOP

Burada SATTARIHI, SATTIPI, SATKUL isimli alanlar gruplamaya tabii tutulmuş ancak SELECT ifadesi içinde, GTAR ve GCIKKASA alanları yalın olarak kullanılmış. (Min, Max, Avg, Sum vb ile değil). Bu Firebird yoksa SANAL ALAN İSİMLERİ ile GROUP BY 'mı yapıyor ?? Normal durumda, tablo içinde gruplamada kullandığınız alanların haricindeki alanları bir birleştirme fonksiyonuna tabii tutmalısınız, aksi durumun hata vermesi gerekir. Ama bu aralar çok anormal şeyler görüyorum. Şaşırmayacağım..

Ayrıca, burada yine garip bir mantıksal problem var. Bana izah edebilirseniz memnun olurum. Yukarıdaki cümleden anladığımı yazayım:

Gider tablosunda GTAR alanı belirli tarih arasında olan kayıtları seç. Herhangi bir kısıt olmadığı için buradan birden fazla result dönebilir (Tabii sizin veritabanını nasıl tasarladığınızı bilemiyorum). Bu durumda, yukarıdaki for ifadesi bir CURSOR gibi davranıyor ve gelen tüm resultset içinde dönüyor. (5 kayıt var ise 5 defa dönecek demektir.) Peki eğer durum bu şekilde ise oradaki INTO ifadesi problemli çalışmıyor mu ? Her zaman 5nci kaydın bilgileri dolmuş olacak ilgili değişkenlerin içine.

Merhaba @Tuğrul HELVACI hocam,
- GTAR as SATTARIHI diyerek SATTARIHI alani gerkcekte gtar dir . SATTARIHI gordugun yerleri gtar olarak alani olarak algila dendigi icin sorun olusmuyor. Yoksa select icerisinde tanimlanan alanin eger bir isleme tabi tutulmazsa (sum vb.) group by da tanımlanmasini mecburi tutar.
-Oradaki For ifadesi select icerisindeki sorgu sonucu olusan veriler icerisinde tek tek dolasiyor ve her satir verisindeki olusan degerleri into ile belirlenmis degiskenlere atar.
Cevapla
#24
@klavye doğrudur fiziksel tabloya işlenmez düzeltme için teşekkürler. İstenen şekilde bağlantıları hazır olarak gelen görüntü diyelim, bu yüzden daha hızlı gelmesi doğaldır.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#25
@klavye hocam aciklamis fb de aorun olmuyor yani bi alias i alan adı yerine kullanabiliyoruz fb de..

Gtarin oldugu gider tablosunda ise, giderler turuluyor.. x kasasi gunde yaptigi giderler toplanip tek satir halinda cikti veriyor.. ama y kasasini ayri satirda goateriyie.. grouo by onun icin tasarlandi.
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#26
(22-01-2019, Saat: 17:56)klavye Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-01-2019, Saat: 17:34)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Sanırım ne demek istediğimi anlatamadım. Üçüncü SELECT ifadeniz aşağıdaki gibi:

for select GTAR as SATTARIHI, 'GİDER' as SATTIPI, GCIKKASA as SATKUL, round(sum(GTUTAR), 2) as TOP
     from GIDER
    where (GTAR between :TAR1 and :TAR2)
    group by SATTARIHI, SATTIPI, SATKUL
    --union all
    into :SATTARIHI, :SATTIPI, :SATKUL, :TOP

Burada SATTARIHI, SATTIPI, SATKUL isimli alanlar gruplamaya tabii tutulmuş ancak SELECT ifadesi içinde, GTAR ve GCIKKASA alanları yalın olarak kullanılmış. (Min, Max, Avg, Sum vb ile değil). Bu Firebird yoksa SANAL ALAN İSİMLERİ ile GROUP BY 'mı yapıyor ?? Normal durumda, tablo içinde gruplamada kullandığınız alanların haricindeki alanları bir birleştirme fonksiyonuna tabii tutmalısınız, aksi durumun hata vermesi gerekir. Ama bu aralar çok anormal şeyler görüyorum. Şaşırmayacağım..

Ayrıca, burada yine garip bir mantıksal problem var. Bana izah edebilirseniz memnun olurum. Yukarıdaki cümleden anladığımı yazayım:

Gider tablosunda GTAR alanı belirli tarih arasında olan kayıtları seç. Herhangi bir kısıt olmadığı için buradan birden fazla result dönebilir (Tabii sizin veritabanını nasıl tasarladığınızı bilemiyorum). Bu durumda, yukarıdaki for ifadesi bir CURSOR gibi davranıyor ve gelen tüm resultset içinde dönüyor. (5 kayıt var ise 5 defa dönecek demektir.) Peki eğer durum bu şekilde ise oradaki INTO ifadesi problemli çalışmıyor mu ? Her zaman 5nci kaydın bilgileri dolmuş olacak ilgili değişkenlerin içine.

Merhaba @Tuğrul HELVACI hocam,
- GTAR as SATTARIHI diyerek SATTARIHI alani gerkcekte gtar dir . SATTARIHI gordugun yerleri gtar olarak alani olarak algila dendigi icin sorun olusmuyor. Yoksa select icerisinde tanimlanan alanin eger bir isleme tabi tutulmazsa (sum vb.) group by da tanımlanmasini mecburi tutar.
-Oradaki For ifadesi select icerisindeki sorgu sonucu olusan veriler icerisinde tek tek dolasiyor ve her satir verisindeki olusan degerleri into ile belirlenmis degiskenlere atar.

Merhaba, GTAR as SATTARIHI demek; fiziksel ismi GTAR olan alanın adının sanal olarak SATTARIHI olarak kullanılıyor olmasından başka bir anlam ifade etmez. Dolayısı ile GTAR isimli alana hiç bir Agg. fonksiyonu ile işlem yapılmamıştır. Normal bir RDBMS'de GROUP BY 'da olmayan bu alanlar için hata almalıydınız. Ya da yine normal bir RDBMS'de tabloda fiziksel olarak bulunmayan alanlara göre GROUP BY kullanamamalıydınız.

Söylemek istediğim budur. Ayrıca deneme imkanım yok ama, sizin dediğiniz gibi "sorgu sonucu oluşan veriler içinde dolaşıp, değerleri into'da belirtilmiş değişkenlere atıyor" ise, yine tam da dediğim gibi problemli bir kullanım bu. 5 satır data'da for ile dolaşıp into'da belirtilen değişkenlere değer atıyor ise örnek olarak; bu değişkenlerin içinde her zaman 5nci satırdaki kaydın değerleri olur. Çünkü değişkenler bir tane, sürekli üstüne yazar. Bu durumda, arkadaşın CURSOR yani FOR kullanmaması gerekir istediğini elde etmek için. Ayrıca CURSOR'lar her dilde yavaştırlar.

 Bana kalırsa performans elde etmesi için, ilgili SELECT'leri UNION ile birleştirip; birleşen bu set üzerinden SUM/MAX(hangisi gerekiyor ise) ile nihai değerleri elde etmelidir.

Umarım şimdi ne demek istediğim daha net anlaşılmıştır.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#27
(23-01-2019, Saat: 08:53)Tuğrul HELVACI Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(22-01-2019, Saat: 17:56)klavye Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Merhaba @Tuğrul HELVACI hocam,
- GTAR as SATTARIHI diyerek SATTARIHI alani gerkcekte gtar dir . SATTARIHI gordugun yerleri gtar olarak alani olarak algila dendigi icin sorun olusmuyor. Yoksa select icerisinde tanimlanan alanin eger bir isleme tabi tutulmazsa (sum vb.) group by da tanımlanmasini mecburi tutar.
-Oradaki For ifadesi select icerisindeki sorgu sonucu olusan veriler icerisinde tek tek dolasiyor ve her satir verisindeki olusan degerleri into ile belirlenmis degiskenlere atar.

Merhaba, GTAR as SATTARIHI demek; fiziksel ismi GTAR olan alanın adının sanal olarak SATTARIHI olarak kullanılıyor olmasından başka bir anlam ifade etmez. Dolayısı ile GTAR isimli alana hiç bir Agg. fonksiyonu ile işlem yapılmamıştır. Normal bir RDBMS'de GROUP BY 'da olmayan bu alanlar için hata almalıydınız. Ya da yine normal bir RDBMS'de tabloda fiziksel olarak bulunmayan alanlara göre GROUP BY kullanamamalıydınız.

Söylemek istediğim budur. Ayrıca deneme imkanım yok ama, sizin dediğiniz gibi "sorgu sonucu oluşan veriler içinde dolaşıp, değerleri into'da belirtilmiş değişkenlere atıyor" ise, yine tam da dediğim gibi problemli bir kullanım bu. 5 satır data'da for ile dolaşıp into'da belirtilen değişkenlere değer atıyor ise örnek olarak; bu değişkenlerin içinde her zaman 5nci satırdaki kaydın değerleri olur. Çünkü değişkenler bir tane, sürekli üstüne yazar. Bu durumda, arkadaşın CURSOR yani FOR kullanmaması gerekir istediğini elde etmek için. Ayrıca CURSOR'lar her dilde yavaştırlar.

 Bana kalırsa performans elde etmesi için, ilgili SELECT'leri UNION ile birleştirip; birleşen bu set üzerinden SUM/MAX(hangisi gerekiyor ise) ile nihai değerleri elde etmelidir.

Umarım şimdi ne demek istediğim daha net anlaşılmıştır.

@Tuğrul HELVACI  Hocam GTAR as SATTARIHI olayını bazi dblerle denemeler yaptim. mysql,oracle desteklemiyor. postgresql,sqllite,firebird destekliyor. Sanırım standart sql bu yapiyi desteklemiyor.

Diğer madde 
for kullanımında SUSPEND kullanıldıgı icin her satirdan sonra degiskenlere atanan veriler procedure cagiran programa gonderiliyor. Yeni satira gecince onu da degiskenlere atiyor. Sonra degisken degerlerini cagiran programa gonderiyor. Kabaca anlatimla bu sekilde calisiyor diye biliyorum ben.
Cevapla
#28
Biraz açıklayayım Select'leri
Günde 1000 den fazla kaydın olduğu bir tablom var. 4 yıl da,4000*365=1.460.000 kayıttan bahsediyoruz.
Satfirmaid 2 olanlar satış iadesi olanları raporluyor.. 2 olmayanlar ve + olanlar ise satışları, 2 olmayanlar ve SFATTOPLAM <> SFATANATUTAR olanlar iskonto yapılmış olan satışları gösteriyor ve bunları raporluyor..

create or alter view KASA_GOSTER (
   SATTARIHI,
   SATTIPI,
   SATKUL,
   TOP)
as
select SATTARIHI, SATTIPI, SATKUL, round(sum(SATGENELTOP), 2) as TOP
from SBASLIK
where SATFIRMAID <> 2
group by SATTARIHI, SATTIPI, SATKUL
union all
select SATTARIHI, SATTIPI, SATKUL, round(sum(SATGENELTOP), 2) as TOP
from SBASLIK
where SATFIRMAID = 2
group by SATTARIHI, SATTIPI, SATKUL
union all
select GTAR as SATTARIHI, 'GİDER' as SATTIPI, GCIKKASA as SATKUL, round(sum(GTUTAR), 2) as TOP
from GIDER
group by SATTARIHI, SATTIPI, SATKUL
union all
select SFATTAR as SATTARIHI, 'İSKONTO' as SATTIPI, SATKUL as SATKUL, round(sum(SFATTOPLAM - SFATANATUTAR), 2) as TOP
from SFATDETAY
left join SBASLIK on SFATDETAY.SFATBASID = SBASLIK.SATFATNO
where SFATTOPLAM <> SFATANATUTAR and
     SFATTOPLAM > 0
group by SFATTAR, SATTIPI, SATKUL
order by 1, 3; 


Ek Dosyalar Resimler
       
// Bilgi paylaştıkça çoğalır.. 

Cevapla
#29
Selamlar,

Performans ile ilgili bir sıkıntı yaşadığınızı düşünüyorsanız, nasıl hızlandırabileceğiniz ile ilgili eğitim videoları hazırlamıştık. Onları izlemenizi tavsiye ederim, orada bir çok performans artırıcı püf noktalarından bahsetmiştim. Kendi reklamım gibi oldu ama gördüğüm kadarıyla şu anda arkadaşlarımızın ihtiyaçları var.

Özellikle 1. ve 2. Hafta anlatılan konuları iyi izler ve uygularsanız performans sıkıntılarınızı aşarsınız.

Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Firebird ile aynı server içindeki iki ayrı database deki tablolar arasında select serkansirin001@gmail.com 6 330 03-09-2019, Saat: 01:05
Son Yorum: mcuyan
  Select bolumunde parametre kullanmak klavye 15 2.770 16-03-2017, Saat: 15:58
Son Yorum: esistem



Konuyu Okuyanlar: 1 Ziyaretçi