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

---------

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

From: Erol Ozcan (erol-abone@kod.info)
Date: Mon 24 Jan 2005 - 22:29:14 EET


Selamlar,

   Benim önerim veritabanı olarak Postgresql, sorgulama iÅŸlemleri için
de plpgsql ( postgresql in procedure dili ) kullanman.

     4+ milyon satırdan oluÅŸan, gerekli indexler yaratılmış, detaylı
olmayan db tuning yapılmış Postgresql veritabanındaki bir tabloda
karmaşık sql sorgularını bir kaç sn. de ( bazen milisaniye de )
alabiliyorum. Üstelik bu veritabanı yayında ve aynı anda başka işlemler
için de kullanılanıldığını söylemeliyim. Makina konfigürasyonuda biraz
iyi : 2x1 Ghz Intel Xeon , 2 GB Ram, 10000 RPM SCSI disk. BahsettiÄŸin
işlem için daha düşük konf. lu makina yeterli olacaktır.

   Anlattığına göre benim önerebileceÄŸim yöntem aÅŸağıda :

1) Tablo yarat. Örn :

  CREATE TABLE tb_domain_list (
       dml_id INTEGER NOT NULL,
       dml_name VARCHAR( 128 ) NOT NULL,
       dml_create_date TIMESTAMP NOT NULL DEFAULT NOW(),
       CONSTRAINT pk_domain_list_dml_id PRIMARY KEY ( dml_id ),
       CONSTRAINT uq_domain_list_dml_name UNIQUE( dml_name )
);

CREATE UNIQUE INDEX ix_domain_list_dml_name ON tb_domain_list(
dml_name );
CREATE INDEX ix_domain_list_dml_create_date ON tb_domain_list(
dml_create_date );

2) ftp ile aldığın dosyayı parse ettikten sonra kayıt işlemi için
plpgsql procedure çağır. Bu procedure bir kayıt işlemi yapmadan önce
aynı kayıdın tabloda var olup olmadığına bakmalı. Kayıt işlemi biraz
uzun sürer ama sorgulamada çok büyük kazanç getirecektir. Örn :

CREATE FUNCTION pr_insert_domain_name( VARCHAR )
  RETURN INTEGER
...
  SELECT INTO tmp_dml_id
         dml_id
       FROM tb_domain_list
      WHERE dml_name = pi_domain_name;
  IF FOUND THEN
     -- bunu kaydetme zaten kayıtlı
  ELSE
     INSERT INTO ....
  END IF;
....

3) Bundan sonra istediğin tarih aralığında sql sorguları yaparsın ve
oldukça hızlı sonuç alırsın. Örn:

   SELECT * FROM tb_domain_list WHERE CAST( dml_create_date AS DATE ) =
'2005-01-24';

   SELECT * FROM tb_domain_list WHERE CAST( dml_create_date AS DATE )
BETWEEN '2005-01-17' AND '2005-01-24' ;

  Umarım yazdımlarım iÅŸine yarar. Bu arada aldığın domain isimlerini zip
olarak özel mail adresime gönderebilirsen sevinirim.

İyi çalışmalar...
Erol Özcan
http://www.kod.info/

Guray SATICI wrote:

>Simdi ben bu dosyalari alip tum com ve net domain lerinden dusenleri
>toparlamak istiyorum. yani dun kaydi bulunupta bugun olmayan veriler
>gerekiyor bana ...
>Yalniz bu islemin cok zaman alacagini dusunuyorum... Soyleki bir
>sorgunun bile saniye bile tutmamasi gerekiyor. Cunku baya bi kayit var
>ve bu de milyon saniye edicek ...
>Bu durumda farkli cozumlere ihtiyacim var
>
>
>

_______________________________________________
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.