1

Konu: Sql Insert hızlandırmak

Merhabalar!

Bu yöntemi biliyordum, ama bu kadar fark edeceğini bilmiyordum. Bu nedenle paylaşayım dedim:

Eski bir programımın veritabanını Vfp'dan Postgresql'e geçiriyorum.
Vfp'dan bir import yaparken, 75.000 satırlık bir tabloda (8 sütün) epey beklemek zorunda kaldım. Merak ettim ve süreyi ölçtüm: 252 saniye.
Bildiğimiz klasik yöntemle çalıyordum:

Scan
    Insert Into Table (field1, field2, field3) Values (?H.f1, ?H.f2. ?H.f3)
Endscan

Birkaç kes 4 dak. ve 12 saniye beklemek zorunda kaldıkdan sonra, ister istemz yöntemi değiştirmek zorunda kaldım. Sonuç: süreyi 1:43 saniye düşürebildim. Yani %60 bir kazan elde edebildim.

Visual Fox Pro
cSql = "Insert into Table  (field1, field2, field3) Values "

Scan
  cSatir = "("
  cSatir = cSatir + Alltrim(str(H.f1)) + ","
  cSatir = cSatir + Alltrim(str(H.f2)) + ","
  cSatir = cSatir + Alltrim(str(H.f3)) + "),"
  cSql = cSql + cSatir
Endscan
nLng = LEN(cSQL)
cSQL = LEFT(cSQL, nLng -1) + ";"
nAntw =  SQLEXEC(nSQL, cSQL)
IF nAntw != 1
    AERROR(ErrorArray)
    MESSAGEBOX(ErrorArray(2))
    RETURN FALSE
ENDIF
Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

2

Re: Sql Insert hızlandırmak

Mehmet ( Abi ) smile ;

Paylaşım için teşekkürler.

Bu arada PostgreSQL den memnun musun? smile

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3 Son düzenleyen, Mehmet K (26.04.2012 13:31:53)

Re: Sql Insert hızlandırmak

Uğur, sana çok kızgınım smile
Mutlu mutlu kendi yağımda kavuruluyordum ... geldin bu huzurlu dünyama PostgreSQL'i attın.
O kadar çok beğendimki, bırak yeni projeleri, başka işim gücüm yokmuş gibi birde eski projeleri PostgreSql'e adapte etmeye kalkıyorum.
Sana kızdığımı ifade etmişmiydim? smile

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

4

Re: Sql Insert hızlandırmak

Bu sureleri gorunce hayir:)

Ben SQL server'a 1,200,000+ kaydi (ama 7 sutun) 33 sn'de insert ediyorum (text delimited dosyadan Jet OLEDB ile okunursa, VFPOLEDB ile foxtan okuyunca 24 sn). Sahidim Timucin:)

Not: Muhakkak PostgreSQL'de de benzer 'bulk copy' secenekleri vardir. Yoksa 75000 kayit icin 1-2 dk'la hayat gecmez.

5

Re: Sql Insert hızlandırmak

Bulk copy duydum, ama hiç kullanmadım.
Bir bakayım ...

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

6 Son düzenleyen, Mehmet K (26.04.2012 18:48:06)

Re: Sql Insert hızlandırmak

Çetin, evet, öyle daha hızlandı: 5 saniye smile
Ama benim için birkaç dezanvatajı var:

1. Vfp COPY komutu ile csv yaratırken nasıl "yyyy-mm-dd" formatında tarih yaratıldığını bulamadım.
Bu nedenle csv dosyasını FRWRITE ile yaratmak zorunda kaldım. Herneyse ...

2. Postgresql COPY komutu yetkisiz kullanıcı olarak kullanamiyorum. İllaki yetkili kullanıcı olmak zorundayım. Programın içinden  farklı yetkilerle çalışmak ama işime gelmiyor.

Bu nedenle bu komutu kullanamiyorum. Ama aklımın bir köşesinde bulunsun. Uyarı için teşekkürler.

Eklenti: import toplam 5 saniye sürdü.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

7

Re: Sql Insert hızlandırmak

1) Set date YMD

Ikisinin de neden gerektigini anlamadim. Tarih tarihtir. Neden CSV ihityacin olsun ki. Mutlaka PostgreSQL'in de .Net icin SqlBulkCopy benzeri bir destegi vardir.  Dogrudan VFP dbf'ten PostgreSQL'e bulk.

8

Re: Sql Insert hızlandırmak

Mehmet,
Dikkat et, daha dun PostgreSQL'e bakarken aptalca birseyle karsilastim.

create table "Kullanicigiris" ... diye yaratilmis tabloda sorguyu:

... from "Kullanicigiris"

seklinde yapman gerekiyor. Yoksa relation doesn't exist gibi hata veriyor. " identifier olarak kullanilir da, yaratirken kullanilinca tablo adinin (ve kolon vs adlarinin) parcasi olarak kabul edilmesi cok garip. Baslamadan iyice sogudum PostgreSQL'e.

9

Re: Sql Insert hızlandırmak

Üstat Selam;

Ben tam anlamadım söylediğini. "kullanicigiris" [çift tırnak]  karakterini tablonun adı gibi mi görüyor?!

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

10

Re: Sql Insert hızlandırmak

evet o tirnaklari yaratirken kullandiysan hep kullanmak zorundasin. Arti yaratirken nasil yazdiysan tam olarak oyle yazmak zorundasin.

create table "KullaniciGiris" ...

select ... from "KullaniciGiris" - OK
select ... from "Kullanicigiris" - Hata
select ... from KullaniciGiris - Hata

11

Re: Sql Insert hızlandırmak

Merhaba Çetin

Cevabım biraz gecikmeli oldu; ilkönce senin verdiğin ipuçları bir değerlendirmeye çalışdım.
SET DATE YMD : 100 sene düşünmüş olsaydım aklıma gelmezdi smile
Komutu elbette biliyorum. Ama onu bu problem için kullanmak .... shame on me!

Direk dbf'den PostgreSql için bir araç bulamadım. Elbette bakmak-görmek nuans farkı burda bir rol oynamış olabilir, ama sanki öyle birşey yok.
http://www.postgresql.org/docs/9.1/static/sql-copy.html
FORMAT: Selects the data format to be read or written: text, csv (Comma Separated Values), or binary. The default is text.
Bu nedenle ben zaten denemelerimde csv seçmişdim.

Diğer konu (büyük/küçük/tırnak vs.):
Hem Windows hem Linux ortamında test ettim. Fark etmiyor.
Ama MySQL'de fark ediyor. MySQL Windows ortamında table isimleri küçük harf olarak yaratıyor, ama Linux ortamında senin yazdığına müdahele etmiyor ve "Kullanici" yerine "kUllanici" yazarsan, "table does not exists" diyor.
Ama bu PostgreSql'de söz konusu değil. Sen testlerini hangi işletim sistemi ile yaptın?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

12

Re: Sql Insert hızlandırmak

Windows

13

Re: Sql Insert hızlandırmak

İlginç.
Emin olmak için birde pgAdmin programı ile denedim. Oda fark etmedi.
Benimki WindowsXP ve bende PostgresSQL 32bit kurulu.
Sende?

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.

14

Re: Sql Insert hızlandırmak

Mehmet ( Abi )

Bu arada ne kadar işine yarar; tam olarak emin değilim.

Birde aşağıdaki linkleri incele istersen :

http://sourceforge.net/projects/pgdbf/

http://pgdbf.sourceforge.net/

Sevgiler ...

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

15

Re: Sql Insert hızlandırmak

Ya Mehmet beni ugrastirma. Ben C# ile denedim. Windows 7 64. 64/32 fark etmemesi lazim, fark ediyorsa o da sorun. C# case sensitive, o aciklama olabilir ama sacma olur, select cumlesi oldugu gibi cift tirnakta.

16

Re: Sql Insert hızlandırmak

arkadaşlar, sorum çok kötü ise özür dilerim.
PostgresSQL ile sqlserver2008 aynı işi yapmıyor mu ?
o zaman neden PostgresSQL ? zaten sqlserver2008in limitleri çok yüksek, o limitler data ile doluyorsa da çok ucuz

VFP9 SP2

17

Re: Sql Insert hızlandırmak

Kabaca ayni isi yapiyor:) Ikisi de SQL database ve VFP'ye kiyasla cok yuksek limitlere sahip olduklarindan "ayni".

PostgreSQL open source ve ucretsiz + windows disi platformlarda da calisiyor (mesela bir linux serverda calisiyor olabilirdi).

SQL limitleri hakkinda haklisin. Yeteri kadar yuksek. Ben eskiden onu geciyorsan parasini da odemen gereken birseyler var elinde diyordum. Simdi ise para kismini bir kenara birakiyorum, onu geciyorsan zaten VFP ve SQL grubu bir veritabani kullanmiyorsundur diye dusunuyorum:) Zaman gectikce isler degisiyor, gelisiyor. Adamlar artik acik acik, Oracle'in gunleri sayili diye makale yazabiliyorlar (SQL server icin de gecerli). Ama tabii onlar VFP kullananlar icin farazi seyler.

VFP kullaninca, limit derdin yoksa, windows platformunda SQL server bir numara.

18 Son düzenleyen, ugurlu2001 (30.04.2012 14:29:46)

Re: Sql Insert hızlandırmak

Kesinlikle aynı işi yapıyorlar smile

* PostgreSQL tamamen ücretsiz. Yani Veri boyutun .... GB ı aştı / Bu lisans ile en çok şu kadar RAM/CPU kullanırsın / Bu işletim sisteminde aynıanda ... Kullanıcı limiti var vs vs  artık şu sürümü kullanmak zorundasın. gibi bir derdin yok.

* Platform bağımsız : Linux / Windows / Mac OsX / Solarix / FreeBSD

Mehmet özellikle "open source" u sevdiği için / Anti MS olduğu için ve bende PostgreSQL in methini çok duyduğumdan tavsiye etmiştim.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

19

Re: Sql Insert hızlandırmak

VFP kullaninca, limit derdin yoksa, windows platformunda SQL server bir numara.

Çetin Üstat bu konuda çok haklı!

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

20

Re: Sql Insert hızlandırmak

cetinbasoz yazdı:

Ya Mehmet beni ugrastirma.


Yok canım, uğraşma zaten.  smile
O büyük, küçük harf benim için bir sorun değil. Zaten bir sorun olsada: MySQL'den ona dikkat etmeye alışkınım.
COPY komut ile bu kadar hızlı import etmesi çok hoşuma gitti. Hint için teşekkür.
Ama hiç kullanırmıyım? Sanmam. Daha evvel dediğim gibi: sen ve ben çok farklı lig'lerde oynuyoruz. Sen veritabanlarının boyutlarını GB ile beyan ediyorsunz, ben MB ile.
Sen import ederken 100 binlerce satır import ediyorsun, ben 10 binlerce.

Bir projenin bitmesi için 3 seçenek vardır: hızlı, ucuz, iyi. Bu seçeneklerden iki tanesini seçiniz.