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
büyük tabloların listelenme biçimi
Re: büyük tabloların listelenme biçimi
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.
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.
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;
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.
Re: büyük tabloların listelenme biçimi
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.
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.
Re: büyük tabloların listelenme biçimi
s.a.
tablodaki kayıt sayını bulmak için select * from xxx yazılmaz. 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.
tablodaki kayıt sayını bulmak için select * from xxx yazılmaz.
Kod: Tümünü seç
select count(*) from XXXXXXX
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: büyük tabloların listelenme biçimi
teşekkür ederim
hemen kullandım çok iyi oldu bu bilgi
hemen kullandım çok iyi oldu bu bilgi
Re: büyük tabloların listelenme biçimi
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
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
Re: büyük tabloların listelenme biçimi
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.
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.