sorgularım çok yavaş. neden?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

sorgularım çok yavaş. neden?

Mesaj gönderen nitro »

s.a.
veritabanım firebird.
her tabloda autoinc alanlar var. ama extra bi indexleme diye bişey yok.
(gerçi sorunun indexlemeden kaynaklandığına kanaat getirsem index koyarım ama).
forumda yavaş sorgu diye arama yaptım ama çıkan tüm sonuçlarda insanlar çok kayıtta yavaşlamadan söz etmişler.
ama benim sorgular kayıtlar azken bile yavaş. mesela bir sorgu var
(kodları yanımdaa değil o nedenle veremiyorum). 5 dakikaya bitiyor.
tahmini şöyle birşey:

Kod: Tümünü seç

 select gelisfiyat1,gelisfiyat2, satisfiyat1, satisfiyat2,
 (select birimfiyat from stokhar sh1 where  sh1.stokno=s.stokno 
and carino='101' and harno=(select max(harno) from stokhar sh2 where sh1.stokno=sh2.stokno
)) 
from stokkart s where stokno='10002'
gdb dosyamın boyutu daha 955kb ama yukardaki sorgu (tabi orjinali biraz daha karışık. ama sorgu bir stokğun fiyatlarını, o cariye en son hangi fiyattan işlem yapıldığını, ortalama satış fiyatını, ortalama alış fiyatını falan buluyor)
işte bu sorgu 3 dakika makineyi kilitliyor. sorun index olayından mı kaynaklanıyor acaba. yoksa querynin satırlarını delphiden göndermesem de txt dosyasından falan mı göndersem? bir de şöyle bir durum var. ben denemek için for döngüleri içinde birsürü kayıt girdim. gdb nin boyutu 2.2mb oldu. program o veritabanını bir daha açmadı. program açılırken bilgisayar kitleniyor. ctrl+alt+del'e bastığımıda firebirdserver'ın cpu kullanımının %99 olduğunu görüyorum. nerde yanlış yapıyorum?
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7603
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

a.s.

sorguda geçen alanların hepsi indeksli değil mi? stokno,carino, harno alanları...

Bir de IB Expert gibi toolla dene. Bakalım hız nasıl olacak. Firebird ve 5 dk ifadeleri aynı kelime de geçmemeli bence :)

KONU DIŞI : Prensip olarak alan isimlerini büyük harf ve okunaklı vermek bana daha güzel geliyor. STOK_NO, CARI_NO, HAREKET_NO gibi.

Kolay gelsin.
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

cümlenin yavaş çalışması normal, iki tane içiçe sorgu var. Şu şekilde daha hızlı çalışacaktır tahminimce:

Kod: Tümünü seç

 select gelisfiyat1,gelisfiyat2, satisfiyat1, satisfiyat2, 
(select top 1 birimfiyat from stokhar sh1 where  sh1.stokno=s.stokno and carino='101' 
  order by harno desc)
from stokkart s
 where stokno='10002'
Daha farklı bir çözümü de vardır ama şimdilik bu geldi benim aklıma
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

hocam indexliden kastınız nedir tam anlayamıyorum.
yani sonuçta o alanlar autoinc ve bir kaydın başka bir eşi yok.
forumda indexleme diye arama yaptım ama bişey de bulamadım.
bu işe başlarken makaleler okudum, yardım aldım ama çok garip bişey ki kimse bana indexlemenin nasıl olacağını anlatmadı. fahrettin abinin sunularında hatta bi konu geçiyordum. indexlemenin gücünü belirten grafikler vardı. ama tyasarım ortamında uygulayamadım ya da bulamadım o olayları.
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

teşekkürler. bu top olayı bana çok mantıklı geldi. ama indexleme ile ilgili kafamda hala doru işaretleri var. :(
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

sql olarak

Kod: Tümünü seç

CREATE INDEX NDX_1 ON TABLO1 (ALAN1); 
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

hocam index leme hız kazanmak içindir.
mesela,
id leri 1,2,3.. 10 olan 10 tane kayıt olsun.
sen sql sorgunda where id = 3 dediğin zaman sql önce tablonun ortasındakine yani 5. kayda bakar. where deki kayıt daha küçükce yine tablo yu ilk kayıt ile 5. kayıt arasına böler. ama index kullanmazsan sql ilk kayıttan itibaren teker teker kayıtları geçer. ve seninin aradığın kayıt ilk kayda ne kadar uzaksa o kadar beklersin.
DeveloperToolKit

..::|YeşilMavi|::..
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

hocam bu CREATE INDEX olayını ibexpertte nerden giricez acaba?
PK yazan alanı işaretleyerek mi yapıcaz acaba?
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

hocam olayı inceledim. anladım çok teşekkürler. mevcut tablo üzerinde işlem yapılabilmesi çok güzel. tabloları baştan oluşturmak zorunda kalmayacağım. :)
peki autoinc alanım için hem primarykey atamam hem de index oluşturmam mı gerekli. yoksa sadece index oluştursam yeterli olacak mı?
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

PrimaryKey alan için index oluşturmana gerek yok.
çünkü;
PrimaryKey = Index + Unique
DeveloperToolKit

..::|YeşilMavi|::..
Cevapla