tekrar merhaba
Hakan Can arkadaşımın dediği gibi testi yüksek kayıt sayılı tablolarda yapmak daha doğru.
Kayıt sayısı arttıkça daha fazla işlem yapılacaktır tabiki.
Bilgisayarımda yüklü demo versiyon Firebird Development studio adlı bir programın query analyzer formu var.
Bu formu kullanarak bazı testler yaptım.
Elimde yüksek kayıt sayılı tablo olmadığı için önce tek ID alanı olan bir tablo yaptım.
Tabloya kayıtları bir sp kullanarak ekledim:
Kod: Tümünü seç
CREATE PROCEDURE SAYIURET (ILK Integer,
SON Integer,
ARALIK Integer)
returns (ID Integer)
AS
begin
ID=:ILK;
WHILE ((:ID<=:SON) and (:ARALIK>0)) DO
BEGIN
SUSPEND;
ID=:ID+:ARALIK;
END
end
Bu sp'yi aşağıdaki gibi birkaç defa (farklı aralıklarla) çalıştırdım:
Kod: Tümünü seç
INSERT INTO TESTTBL (ID) SELECT ID FROM SAYIURET(120001,150000,3)
yukarıdaki komut 2şer aralıklı olarak 120001'den 150000 e kadar sayıları tabloya ekliyor.
Bu teknikle 165668 kayıtlık bir tablo hazırladım.
Daha sonra bu testtbl içinde olmayan kayıtları bulmak için aşağıdaki komutlu çalıştırdım:
Kod: Tümünü seç
SELECT * FROM SAYDIR(1,500000) WHERE NOT EXISTS(SELECT * FROM TESTTBL WHERE SAYI=ID)
Bu komutun çalıştırılması kullandığım analyzere göre 110ms sürdü. Ancak kaçtane kayıt olduğunu gridden tektek sayarak bulmak zor olacaktı

Onun için şöyle bir komutu çalıştırdım
Kod: Tümünü seç
SELECT count(*) FROM SAYDIR(1,500000) WHERE NOT EXISTS(SELECT * FROM TESTTBL WHERE SAYI=ID)
bu komut ile tabloda 1..500000 arasında 334332 olmayan sayı kaydı olduğunu buldum.
Ancak bu komutun çalışması diğerinden oldukça uzun sürdü:5453ms
Evet bu şekilde sp ile yüksek kayıtlı tablolarda test sonuçlarını elde etmiş oldum.
Sonra aynı sonuçları hakancan arkadaşın sp kullanmadan yapma yöntemine göre deneyeyim dedim.
Komutu çalıştırdım ve biriki dakika bekledikten sonra bu formu doldurmaya devam ettim.
Halen komut sonlanmadı ne yazıkki
Benim aldığım sonuca göre sp kullanmak oldukça uygun görünüyor.
Yalnız test ettiğim ve burada söylemek istediğim bir unsur daha var.
Subquery içinde yüksek kayıtsayılı sonuç döndüren sp kullanmanın firebird içinde çok büyük performans kaybına sebep olduğunu gördüm.
Yukarıdaki testi testtbl gibi normal bir tablo yerine sonuç döndüren SAYIURET sp'sini kullandığımız zaman anormal derecede uzun sürede
sonuç alınıyor. Bunu ilk denediğimde birkaç dakikada sonuç almıştım. Birsonraki denememde bilgisayarı kapatarak ancak durdurabildim:)
Yani şu an için subquery içinde uzun kayıtsayılı değer döndüren sp kullanmaktan kaçınmanızı tavsiye ederim. Belki bir firebird'in
yazılım hatası da olabilir.