Re: [Linux-programlama] A Fark B (SQL)

---------

New Message Reply About this list Date view Thread view Subject view Author view Attachment view

From: Ali AVCI (mozaik@hotpop.com)
Date: Tue 25 Jan 2005 - 11:56:00 EET


Tablo tasarýmýnýza katýlýyorum.

Ancak kullanýmýnda SQL veri tabanýnda bulunan iki tablonun "merge"
algoritmalarýn kullanýlmasý daha uygun gelir bana.
Önereceðim ilaveler:
1. domainler tablosuna domain_adi ile bir index kurdurun
1.1. domainler tablosunun pk alanýna tarih_aktivasyon ilave edilebilir.
// bir domain bellli bir tarihte kalktýðý gibi ayný domain üç vakte
kadar tekrar yayýna baþlayabilir.
1.2. domainler tablosunda aþaðýdaki yaklaþýmý uygun görürseniz,
cf_aktif, tmp_kontrol ve domain_uzantý gereksiz hale gelebilir.

2. yeni_domain (domain_adi varchar(??)) adýnda bir table
2.1.. üzerinde domain_adina göre bir index
2.2.. yeni domain'e yeni alýnan dosyalar üzerine yazýlsýn

3. merge algoritmasý biraz karmaþýk olmalý ancak temelinde her iki
tablodan bir cursor açýp tarama yolu ile gidilmeli.
biraz tarzanca olacak ama...

open cursor eski as select * from domainler where tarih_deaktivason is
null order by domain_adi
open cursor yeni as select * from yeni_domain order by domain_adi
while not (eski.eof or yeni.eof ) do // koþul hatalý olabilir ama amaç
her iki cursor'da da bilgi olduðu müddetçe...
    if eski.domain_adi > yeni.domain_adi
       eski.deactive et.
       eski.ilerlet
    if eski.domain_adi < yeni.domain_adi
       eskiye yeni domain ekle.
        yeni.ilerlet
    if eski.domain_adi = yeni.domain_adi
       eski.ilerlet
       yeni.ilerlet
end
while not eski.eof
    eski.deactive et
    eski.ilerlet
while not yeni.eof
    eskiye.yeni domain ekle
    yeni.ilerlet

bence yukardaki iþlem iþlemciyi ve diski en az yoran sistem olur.
daha az yormak için yeni_domainleri veri tabanýna atmadan sýralý text
dosyadan okumak olabilir.

Umarým faydalý olur.
- Ali AVCI

Çaðatay Tengiz wrote:

> Bence daha farklı tasarım ve tek tablo ile Firebird'de bu iÅ?
> çözülebilir.
>
> Tablo yapısı
>
> create domainler (
> domain_adi varchar(50) --bir domain en fazla kac karakter olabilir?
> ,domain_uzanti varchar(20)
> ,ck_aktif smallint
> ,tarih_aktivasyon date --listeye girdiÄ?i tarih
> ,tarih_deaktivasyon date --listeden düÅ?tüÄ?ü tarih
> ,tmp_kontrol smallint
> ,constraint pk_domainler primary key (domain_adi, domain_uzanti))
>
> Bu tablo C yerine server'da doldurulmalıdır. Bunun için bir sql
> cümleciÄ?i, bir stored prosedüre ile sonlandırıcı bir sql
> cümleciÄ?i yeterli
>
> Ä°lk önce tüm kayıtların deaktive olduÄ?unu varsayalım :
>
> update domainler set ck_aktif = 0;
>
> Stored prosedür tabloya kayıtları ekleyeceÄ?iz, son sql cümleciÄ?i
> ile de kayıtların son durumunu belirleyeceÄ?iz.
>
> create procedure domain_ekle (
> domain_adi varchar(50)
> , domain_uzanti varchar(20)
> )
> as
> begin
>
> /*
> Ã?ncelikle kaydı tabloya insert etmeyi deneyelim. EÄ?er primary key
> hatası verirse, bu kayıt tabloda zaten var demektir o zaman aktif
> durumunu 1 yapalım
>
> EÄ?er pk hatası vermezse yoktur demektir, o zaman kayıt eklenir
> zaten.
>
> Firebird'de hata kontrolü begin-end blokları içinde olmalı
> */
>
> begin
> insert into domainler
> (domain_adi, domain_uzanti, ck_aktif, aktivasyon_tarih)
> values
> (:domain_adi, :domain_uzanti, 1, current_date);
> when sqlcode -803 do --Burada primary key hatasını yakalıyoruz.
> update domainler set ck_aktif = 1;
> where domain_adi = :domain_adi
> and domain_uzanti = :domain_uzanti;
> /* burada Å?u kontrol de yapılabir :
> select tarih_deaktivasyon from domainler
> where domain_adi = :domain_adi
> and domain_uzanti = :domain_uzanti
> into :tmp_tarih;
> if (:tmp_tarih is not null) then
> update domainler set
> ck_aktif = 1
> , tarih_deaktivasyon = null
> , tarih_aktivasyon = current_date
> where domain_adi = :domain_adi
> and domain_uzanti = :domain_uzanti;
> else
> update domainler set
> ck_aktif = 1
> where domain_adi = :domain_adi
> and domain_uzanti = :domain_uzanti;
> */
> end
> end
>
> Å?imdi program içersinde bir for-next döngüsü ile text dosyadan
> okunan deÄ?erler ile bu prosedür çaÄ?rılır. Döngü bittikten
> sonra tabloda olmayan kayıtların ck_aktif deÄ?eri 0 olacaktır bu
> durumda son sql cümleciÄ?imiz Å?u olacaktır :
>
> update domainler set tarih_deaktivasyon = current_date where ck_aktif = 0
>
> Ben olsam böyle çözerdim ama hız konusunda bir test yapamadım.
> Ama sonuçta daha hızlı bir çözüm olabilir diye düÅ?ünüyorum.
> �ünkü Firebird için 300-400 MB veri çerez.. :)
>
> Selamlar, iyi çalıÅ?malar.
>
> Ã?aÄ?atay Tengiz
>
>
> Guray SATICI wrote:
>
>> On Tue, 25 Jan 2005 08:47:31 +0200, Serdar KÃ?YLÃ?
>> <serdarkoylu@fisek.com.tr> wrote:
>>
>>> Biraz da konu daÄ?ıldı gibi. En baÅ?ından, bana Å?u kaynaktan Å?u
>>> veriler
>>> geliyor, bu verileri Å?öyle veritabanına alıyorum vs. gibi sürecin
>>> tamamını anlatabilirseniz, size daha faydalı olabiliriz sanıyorum..
>>
>>
>>
>> Konuyu bastan anlatiyorum hocam. Mevcut olan bir FTP hesabi sayesinde
>> com.zone.tgz, net.zone.tgz ve
>> digerlerinin bulundugu dosyalari sistemime aliyorum. Bu dosyalar dunya
>> uzerinde mevcut olan tum domain lerin listesini iceriyor.
>> Sonra bu dosyalari acip
>> cat dosya_ismi | grep NS | cut -d " " -f 1 > son_hali
>> sort -u son_hali > en_son_hali
>>
>> komutlari ile suzuyorum. en_son_hali dosyasinin icerigi bildigimiz
>> domain ler olarak kaliyor.
>> Her satirda domain ler mevcut. Bu suzme islemi ile 2.5 GB boyutunda
>> olan com.zone dosyam 400 MB boyutuna dusuyor. Ayni sekilde 1 GB kusur
>> olan net.zone dosyam ise 70 MB a iniyor. Buraya kadar hatali bir sey
>> olmadigini saniyorum.
>>
>> Bundan sonra C ile bu dosyalari satir satir okuyup veritabanina
>> atiyorum. Su an Mysql e kayit yapabiliyorum. Ayni zamanda C++ bir
>> uygulama ile de Firebird a conn. olup gerekli veri aktarimini
>> yapabiliyorum.
>>
>> Bu FTP den cektigim tgz dosyalari gunluk olarak yenileniyor ve ben gun
>> icerisinde tekrar bu dosyalari cekip ayni surecten gecirmeyi
>> planliyorum.
>> Bu sayede 12 saat (atiyorum) once mevcut olan kayit ile su an cektigim
>> ve yenilenmis kayitlar arasindaki farklari bulmak istiyorum.
>>
>> 12 saat once var olan bir kayit, su an cektigim yeni veriler arasinda
>> mevcut degilse bu domain kapatilma surecini girmistir diyorum. Benim
>> icin bu domain ler onemli (A/B kumesi elemanlari). Tabiki yeni gelen
>> veriler arasinda yeni domain ler mevcut olacaktir. Ama bu benim isimi
>> gormeyecek (B/A kumesi elemanlari). Ayni zamanda 12 saat once de
>> mevcut olup simdi de mevcut olan domain ler olacaktir. (Bu da A
>> kesisim B kumesi elemanlari)
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Linux-programlama mailing list
>> Linux-programlama@liste.linux.org.tr
>> http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Linux-programlama mailing list
>Linux-programlama@liste.linux.org.tr
>http://liste.linux.org.tr/mailman/listinfo/linux-programlama
>
>

_______________________________________________
Linux-programlama mailing list
Linux-programlama@liste.linux.org.tr
http://liste.linux.org.tr/mailman/listinfo/linux-programlama


New Message Reply About this list Date view Thread view Subject view Author view Attachment view

---------

Bu arsiv hypermail 2.1.2 tarafindan uretilmistir.