Firebird geçici tablo ile daha hızlı rapor alıyor. ancak....

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
sen
Üye
Mesajlar: 34
Kayıt: 04 Tem 2003 12:33
Konum: Ankara

Firebird geçici tablo ile daha hızlı rapor alıyor. ancak....

Mesaj gönderen sen » 10 Ara 2005 03:02

sa.
yazdığımız küçük bir cari-kasa takip prg.da karmaşık raporlar isteniyor. Yana doğru açılan raporlar (FastReport un DBCross1 nu kullanmamıza rağmen) veya bir sütuna farklı sütundan farklı verilerin gözükmesinin istenmesi gibi vs. vs. gerçekten hem raporun yapısı itibariyle hemde verilerin alınması itibariyle karmaşık raporlar isteniyor.

Firebird dosya yapısı şöyle; yoğunluk tek tabloda (VERILER). yani bütün veriler bu tabloda tutuluyor. diğer tablolar yardımcı (BANKALAR , SUBELER, ILLER vb.). Bu yaklaşım (Tek tablo) verileri idare ve rapor almada bana daha kullanışlı gibi geldi.

Şimdi ; ilk başta dosya açıldıktan hemen sonra VERILER dosyasının birebir kopyası geçici olarak oluşturuluyor VERILER_GECICI gibi.

Rapor alınırken ise 2 adım uygulanıyor.
1. INSERT ile veriler VERILER tablosundan kabaca bir filtrelemeye tabi tutularak geçici dosyaya aktarılıyor . gerek varsa başka SQL komutları ayrı ayrı işletilerek gerekli veriler bu dosyaya aktarılıyor.
2.bu kabaca verilerden de asıl alınması gereken raporlar alınıyor.
bu işlem bana iki avantaşı var 1.rapor örneğin 100.000 kayıttan master detail rapor alacak iken 20.000 kayıtdan rapor almış oluyor. 2. farklı alanlarda bulunan verileri istediğim alanlara aktarıyorum.

bu yöntemi hız olarak denedim.gerçekten çok hızlı 2 aşamalı olsa dahi.

şimdi siz dostlara 2 sorum var.

1. bu rapor alama mandığı sizce nasıl
2. geçici dosya prg den çıkarken silinmesi gerekiyor bu ileride problem olurmu. geçici dosya yerine view e benzer ama tablo yapılı bir çözüm bulunabilir mi. (bu arada view işimi görmüyor)
ayrıca zamanla dosya boyutu büyüyor (COMMIT etmiyorum ama azda olsa büyüyor).

konuyu kabaca anlatmaya çalıştım. dağınık oldu ise kusuruma bakmayın.
herkese saygılar......

Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 12:48
Konum: İstanbul

Mesaj gönderen rsimsek » 10 Ara 2005 07:50

Geçici dosyayı Veritabanı üzerinde oluşturmanız sonradan silseniz de pek uygun sayılmaz. Zamanla gereksiz yere şişmesine sebep olur. Bu dosya sadece raporlama amaçlı ise Query ile seçip çekebilir yada MemTable kullanabilirsiniz. Kayıt sayısı fazla değilse MemTable daha perfomanslı olabilir :wink:
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

Mesaj gönderen Hakan Can » 14 Ara 2005 12:55

Anladığım kadarıyla geçici tablo dediğin aslında fiziksel bir tablo ve rapor alırken bu tablodan query'lerle raporlar alıyorsun.

Bence mantığın çok güzel. Aynen dediğin gibi bu yöntemle raporlar oldukça hızlanır.

Ancak eğer direk tek bir seferde yapabiliyorsan STORED PROCEDURE veya VIEW (Pek yeterli olmayabilir) kullanmayı deneyebilirsin. Zira STORED PROCEDURE'larda parametre kullanarak döndüreceğin sonucu küçültebiliyor ve çok daha kısa sürede istediğin rapora ulaşabiliyorsun. Tabloyu şişirme, silme, kayıt ilave etme gibi zaman alacak işlemlerden de kurtulmuş oluyorsun.

Ben benzer durumlarda genelde her ikisini de kullanıyordum.
Önce ara tablonun içini boşaltıyordum eğer boş değilse veya ne olur ne olmaz diye. (DELETE FROM XXXX)
Sonra daha önce yazdığım STORED PROCEDURE veya VIEW'la direk INSERT INTO yapıyordum. (INSERT INTO XXXX SELECT * FROM MYSTOREDPROC(3, 'GENEL') veya INSERT INTO XXXX SELECT * FROM MYVIEW)
Rapor alma işlemi bittikten sonra gerekirse tablonun içini boşaltıyordum. (DELETE FROM XXXX)

Tabi bu verdiğim örnek daha ziyade FireBird içindi. Eğer başka bir veritabanı kullanıyorsanız örneğin MS SQL, STORED PROCEDURE yerine STORED FUNCTION kullanmalısınız.

İyi çalışmalar.

Cevapla