büyük tabloların listelenme biçimi

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
hakan1970
Üye
Mesajlar: 44
Kayıt: 07 May 2009 02:37

büyük tabloların listelenme biçimi

Mesaj gönderen hakan1970 »

Server tabanlı bir veri tabanı sistemine alışmaya çalışıyorum

bir sorum olucak
MDB ile çalışırken tabloda kayıt sayısı makul sayıları pek geçmediğinde yazılım içinde grit ile oluşturulan ana listelerde tüm tablo okunacak şekilde bağlantı yapıyordum
Ancak firebird de olaki çok büyük veri tabloları ile ilişkili bir ana listede bunu yapmak test ettim performans sorunu yaratıyor
Liste ekranı rahatsız edici sürede açılıyor filan
Bu tabi anlamakta zorluk çekmediğim bir durum
Şimdi siz ne yapıyorsunu onu öğrenmek istedim
Yani internet siteleri gibi verileri sayfa sayfamı çağırıp listeliyorsunuz yoksa hepsini birdenmi

yani bağlantı sql i şöylemi
select * from firmalar

yoksa
select first 10 SKIP 20 * from firmalar


aslında ikincisi olması gerektiğine ben ikna oldum biraz deneme yaparak ama profesyonel ler nasıl yapıyor merak ediyorum
heralde hepisi listele demek mantıklı değil
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: büyük tabloların listelenme biçimi

Mesaj gönderen emin_as »

Kayıtları açarken önceden kullanıcıdan bir kriter istemek önemldir. Örnegin sadece belirli üreticiye ait stokların getirilmesi gibi, eger bu tür ön ekranlar hazırlanırsa, kullanıcı kendine en uygun kayıt sınırlamasını yapacaktır. Fatura gibi kayıtlar için son 2 aylık kayıtlar varsayılan olarak getirilebilir.

Kullanılan bileşenlerin de etkisi önemlidir. Bazı bileşen setleri kendileri gruplama ve filtreleme yaptıkları için, bağlandıklarında tüm kayıtları veritabanından yüklemeye çalışıyorlar. Bu bileşenlerin bu özelliklerinin kapatılmasının da faydası olur. Örnegin cxGrid de, datacontroller bölümünde gridmode true yapılarak, bu özellik kapatılabilir.

SQL hazırlanırken select * from stok gibi tüm kayıtlar degil, sadece gerekli olanlar listelenmelidir. Örnegin: select kod, adi, devirtarih from stok . Gereksiz bilgilerin yüklememesi de hızlanma sağlayacaktır.

Son olarak sayfalama yapılabilir. Kayıtlar 100 luk listeler halinde getirilebilir. Ekrana combobox koyup, oradan seçtigin sayfadaki kayıtları listeleyebilirsin. 100 luk listeler yapacaksan, önce kayıt sayısını ögrenirsin. Daha sonra gelen sayıyı 100 e bölüp, sayfa sayısını hesaplarsın. Daha sonra sql ile istediğin sayfadaki kayıtları getirebilirsin.

select * from stok rows 1 to 100
Rows un kullanımı daha rahattır, sql in sonuna eklendiği için rahatlıkla düzenleyebilirsin. Eski firebird sürümlerinde desteklenmiyor olabilir.

Kod: Tümünü seç

procedure TFrom1.SQLSayfaDegistirr;
var
   i : integer;
begin
   // kayitlarda düzeneleme varsa buraya kaydet bölümü koymalısın.
   if ibdataset1.state in [dsEdit,dsInsert] then ibdataset1.Post;
   i:=combobox1.itemdindex*100+1; 
   ibdataset1.Active:=false;
   ibdataset1.selectsql.Text:=Format(' select * from stok where tur = 15  rows %d to %d ',[intTostr(i),intToStr(i+100)]);
   ibdataset1.Active:=True;  
end;
Yazdıgım programda deneme amacıyla veritanina 13 bin ana kayıt ve 100 bin tane de detay kaydı işlemiştim. Bu 100 bin detay kaydın her birinde jpg resim var. Dosya büyüklüğü yaklaşık 3 gb ve ilk açıldıgında 200-300 ms içinde kayıt giriş ekranı görünüyor. Dosyada ilerleme başlayınca önce yavaşlama olmuyor, ama zamanla hafıza şişmeye başlıyor, çünkü yeni kayıtlar için hafıza yer ayrılırken, artık windowsa bellek yetersiz gelmeye başlıyor. Görev yöneticisinden de bu durum rahatlıkla izlenebiliyor.

Genelde müşterilerin bu kadar büyük veritabanına ulaşması sözkonusu olmadığı için herhangi bir ek düzenlemeyi programa koymadım, ama gerekirse, yukarıdakine benzer bir sayfalama koyacagım. Tabii bu tür sayfalama yaparken toplam, kaç kaydın olduğunu da göstermek gerekir. Toplam: 3.000 kayıt veya sayfa: 3/22 gibi bilgilendirici bir yazının da faydası olur.
hakan1970
Üye
Mesajlar: 44
Kayıt: 07 May 2009 02:37

Re: büyük tabloların listelenme biçimi

Mesaj gönderen hakan1970 »

Teşekkür ederim yardımınız için
en sonunda belirttiğiniz toplam kayıt sayısını belirtme benimde fark ettiğim bir sorun
sayfa sayfa getirmek gerekse bile toplam kayıt belirtilmek zorunda bunuda bulmak için yine * form xxxx gibi bir sql i çalıştırmak gerek
en azından benim bildiğim yollar ile bu lazım sonrada kayıt sayısı her dilin kendi yolları ile alınır
Şimdi sormak istediğim şu
firebird de tablodaki kayıt sayısını öğrenmenin bir sql kodu varmı
sadece kayıt sayısını döndürecek

Bu kayıt sayısını klasik yöntemlerle bulmak çok kolay ama ben çok büyük tablolarda bunu yapmak istemiyorum çünkü açılış hızı sorunu yaratacak yine.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: büyük tabloların listelenme biçimi

Mesaj gönderen aslangeri »

s.a.
tablodaki kayıt sayını bulmak için select * from xxx yazılmaz.

Kod: Tümünü seç

select count(*) from XXXXXXX
yazılır. gelen tablodaki kayıt sayısıdır. eğer belirlediğimiz kriterlere uyan kayıtların sayısı alınmak istenirse where koşuluda eklenir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
hakan1970
Üye
Mesajlar: 44
Kayıt: 07 May 2009 02:37

Re: büyük tabloların listelenme biçimi

Mesaj gönderen hakan1970 »

teşekkür ederim
hemen kullandım çok iyi oldu bu bilgi
hakan1970
Üye
Mesajlar: 44
Kayıt: 07 May 2009 02:37

Re: büyük tabloların listelenme biçimi

Mesaj gönderen hakan1970 »

yukarıdaki öneride verilen firs ve skip e alternatif rows yöntemi ile bir şey sorucam
select * from stok rows 1 to 100

sql inde 1 to 100 heralde 1inci kayıttan 100 üncü kayıta kadar listele demek olsa gerek dimi
yoksa şumu
1 inci kayıttan sonraki 100 kaydı listele
yani arada 10 tanesi silinmişse 1 den 110 kadar listeler

to 100 den ilk i olduğunu tahmin ediyorum
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: büyük tabloların listelenme biçimi

Mesaj gönderen emin_as »

select * from stok where tur = 'DAYANIKLI' order by devir_adet desc rows 50 to 100;

Dayanıklı tüketim stoklarının devir adedine (desc nedeniyle büyükten küçüğe ) göre sıralanmış listesinin 50 den 100 unceye kadar olanları getirir. Eger 40 tane stok varsa, liste boş gelecektir. Eğer 80 tane kayıt varsa, listede 30 tane stok olacaktır.

SQL için aradan silme veya başka birşeyin anlamı yok, burada verilen rakamlar kayıt noları degil, sql sonucu ortaya çıkan listedeki sıraya göredir. Farklı sıralamalarda yapabilirsin, rows dönen sonuc üzerinde işlem yapar.

select personid, maas from person order by 2 desc rows 1 to 5

Maaşı en büyük 5 kişinin kaydını getirir.

select personid, maas from person rows 1 to 5

personid ye göre sıralanmış ilk 5 personelin kaydını getirir.
Cevapla