Uykusu gelen trigger

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Uykusu gelen trigger

Mesaj gönderen mrtblt »

Arkadaslar soyle bi trigger im var

Kod: Tümünü seç

begin
 update lks_items
 set kalan = (select coalesce(sum(amount*carpan), 0) from lks_stkhar where  kod = lks_items.kod);
end
ben lks_items tablosuna 160 civarinda kayit aktariyorum, bu aktarmayi yaparken triggerde goruldugu uzere herbir kayit eklendiginde icerisinde 2500 civarinda kayit bulunan lks_stkhar tablosunda ilgili alana gore toplama yapiyorum.

Trigger ilk basladiginda aktarilan kayit basina hiz fena degil (progress bar ile aktarilan kayitlari gorebiliyorum) ama sonlara dogru uzellikle 100 kayit civarindan sonra yavasliyor, yavasliyooor, yavasliyoooor, yavasliyooooor.

Bu kayit sayilari bayagi arttiginda sanirim aksamdan aksamdan aktarimi calistirip sabaha kontrol etmem gerekecek.

Benim sorum su,

Madem basta hizli bi sekilde kayitleri donderebiliyorken sonlara dogru neden birim kayit basina islem cok yavasliyor. Sanirim bi hafiza problemi var. Yani bi sekilde muhtemelen bastaki islemin sonuclarida hafizada bi yerde kaliyor. Buda hafizayi sisiriyor dogal olarak. Her kayit yapildiktan sonra hafizanin bi sekilde bosaltilmasi lazim ama nasil.
Bu benim yorumum, sizlerinde yorumlarini bekliyorum
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

commitreating yapıyormusun posttan sonra?

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Kod: Tümünü seç

    dm.lks_items.FieldByName('ozel_kod').asstring    := dm.ado_items.FieldByName('specode').asstring;
    dm.lks_items.post;
    dm.lks_items.Transaction.CommitRetaining;
Evet aynen yapiyorum bu sekilde ama degisen bisey yok. ayni sekilde devam
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Hocam aktarma modülü üzerinde çalışırken aynı sorunu yaşamış birisi olarak, MSSQL'de en hızlı aktarımın bulk insert olduğunu öğrendim ama kullanamadım. Zira öğrendiğimde aktarım sorunumu halletmiştim :) . Bulk insert konusu FireBird için de geçerli olabilir.

-Kendi çözümümde ise önce,
alter table [tabloadi] disable trigger [triggeradi]
kodu ile tüm kayıt alan tablolarda trigger'larımı kapattım.
-Kayıtlarımı aktardım ve standart hızında geçti.
-Yazdığım SQL cümlesi ile trigger'ın yapması gereken işi tüm kayıtlar için yaptırdım ve;
-alter table [tabloadi] enable trigger [triggeradi] kodu ile de triggerlarımı tekrar aktif hale getirdim.

Eğer bulk insert olayı yoksa sana tavsiyem trigger'ları pasifleştrip aktarma yapman olacak. SQL Server için durum bu, belki aynı durum FB içinde geçerli olabilir. İyi çalışmalar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
1. bu işlem için hangi trigeri kullanıyorsunuz?
2. where kısmında

Kod: Tümünü seç

where  kod = lks_items.kod
dediğiniz zaman
lks_items tablosunda kayıt sayısı artınca yavaşlama normaldir. çünkü bu ifade ile lks_items tablosundaki tüm kayıtlar update edilir.
bence triger olarak before insert kullanmalısınız ve where kısmınıda şöyle değiştirin.

Kod: Tümünü seç

where  kod = new.kod
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

abi daha denemedim dedigin seyi ama cok kibarsin bunu belirtmeden gecmek istemiyorum.

Su her cevabin basindaki s.a. beni bitiriyor. Yazdigin cevaplarladan, cok yardimsever ve yumusak huylu oldugun kanisi olusuyor bende.

E tabi boyle guzel bir insanin guzelligini neye borclu oldugunu tahmin etmek zor degil

a.s ;)
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

aslan arkadasim senin bahsttigin sekilde yaptim degisen bisey olmadi.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Okuduklarıma göre, CommitRetaining mevcut transaction içeriğinii herzaman aktif tuttuğu için birçok gereksiz bilgide serverda aktif kalır. Hatta başka transactionlarıda birçok bilgiyi silmemesine neden olur. Ve zaman geçtikçe bunlar birikmeye başlar. Buda performans sorunlarına yol açar.
CommitRetaining yerine Commit yapıp bir dene istersen.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
sanırım sorunun kaynağını buldum.
insert yaparken update yapıyorsun.
before insert trigerinı şöyle değiştir.

Kod: Tümünü seç

begin
select coalesce(sum(amount*carpan), 0) from lks_stkhar where  kod = new.kod
into new.kalan
end;
bide bunu dene...
olmazsa programa bir memo koy ve yavaşlamanın hangi aşamada gerçekleştiğini bulmak için execsql den önce ve sonra memoya tarih ve saati(yanında kaydın bilgileride olabilir) ekle..
bu yavaşlamanın neden kaynaklandığı hakkında bilgi verebilir.
belki commit ederken bekliyordur..
kolay gelsin.

Not: iltifatların için teşekkür ederim. :oops:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Sevgili aslan dedigin gibi yaptim ve basdondurucu bir hizda aktarimi sagladim ama tum kalan degerleri 0 dondu :)

Ayrica sevgili undefined commitretaining yerine commit yazinca sanirim tablo kapatiliyor ve dongu icerisinde tabloyu surekli yeniden acmak gerekiyor.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

en azından sıkıntını trigerda olduğu kesinleşti...
peki hangi trigera yazdın.
before insert olması lazım
trigerin tam kodunu gönderebilirsmisin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

İlk başta sorulacak soruyu sormadım aslında.
Her işlem sonunda commit yapman şartmı ?
Hem bu şekilde aktarım yaparken yarıda kesilme olduğu zaman veri bütünlüğü bozulmayacakmı ?
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

Tamamını okumadım ama bize verdiğiniz bilgiler biraz eksik.

Öncelikle Trigger hangi tablo üzerinde? ve Ne Trigger'ı?
Ayrıca neden COALESCE kullanıyorsunuz? Buna gerek var mı? Eğer hareket gören bir item ise, illa ki bir sayı bir değer dönecektir, bu durumda neden COALESCE'ye ihtiyacınız doğuyor? İlgili tablolarınızdaki indeks mantıklarınız ve indeksleriniz nedir?

Biraz daha tablo ve indeks yapılarınızı verirseniz bu trigger'ı Şimşek hızına çıkarabiliriz merak etmeyin !...

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Triggerin yapisi su sekilde


Kod: Tümünü seç

CREATE TRIGGER LKS_ITEMS_AI0 FOR LKS_ITEMS
ACTIVE AFTER INSERT POSITION 0
AS
begin
 update lks_items
 set kalan = (select coalesce(sum(amount*carpan), 0) from lks_stkhar where  kod = lks_items.kod); 
end
^
talolar ise asagidaki gibi
CREATE TABLE LKS_STKHAR (
LOGREF INTEGER,
KOD CHAR(10),
STOK_ADI CHAR(50),
TR_CODE CHAR(25),
TARIH DATE,
INVOICE_NO CHAR(10),
CLIENT CHAR(40),
AMOUNT INTEGER,
PRICE NUMERIC(15,2),
TOTAL NUMERIC(15,2),
VAT NUMERIC(15,2),
VATAMNT NUMERIC(15,2),
VATMATRAH NUMERIC(15,2),
SATIRNET NUMERIC(15,2),
CARPAN INTEGER
);
CREATE TABLE LKS_ITEMS (
LOG_REF INTEGER,
KOD CHAR(10),
TANIM CHAR(50),
OZEL_KOD CHAR(10),
SATIS_FIY NUMERIC(15,2),
ALIS_FIY NUMERIC(15,2),
GIRIS INTEGER,
CIKIS INTEGER,
KALAN INTEGER
);
Index lerimizde su sekildedir
CREATE UNIQUE INDEX LKS_ITEMS_IDX1 ON LKS_ITEMS (KOD);
CREATE INDEX LKS_STKHAR_IDX1 ON LKS_STKHAR (TARIH, KOD);
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

aslangeri yazdı: before insert trigerinı şöyle değiştir.

Kod: Tümünü seç

begin
select coalesce(sum(amount*carpan), 0) from lks_stkhar where  kod = new.kod
into new.kalan
end;
Sevgili aslan dedigin gibi yaptim ve basdondurucu bir hizda aktarimi sagladim ama tum kalan degerleri 0 dondu
aslangeri yazdı: peki hangi trigeri yaptın
before insert olması lazım
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla