Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Database update uzun sürmesi
#1
Merhaba, 

ListViewdeki verileri Mysql databaseye update işlemi için alttaki kodları kullanıyorum; ListViewde yaklaşık 250 - 300 kayıt var.
Fakat update işlemi çok uzun sürüyor neredeyse 40 - 50 saniye bu sorun neden kaynaklanıyor olabilir?


       
         var
          J: Integer;
          FDQ: TFDQuery;
        begin
          ListView1.BeginUpdate;
          FDGUIxWaitCursor.ScreenCursor := gcrNone;
          FDQ := TFDQuery.Create(Nil);
          FDQ.Disablecontrols;
          try
            for J := 0 to ListView1.Items.Count - 1 do
            begin
              ListView1.Items[J].Data['Must'] := ListView1.Items[J].Index; // yeni Sıra no
              FDQ.Connection := FDConnection;
              FDQ.Active := False;
              FDQ.Close;
              FDQ.SQL.Clear;
              FDQ.SQL.Add('Update Liste Set Must=:Must Where Id=:Id');
              FDQ.ParamByName('Id').AsInteger := ListView1.Items[J].Data['Id'].AsInteger;
              FDQ.ParamByName('Must').AsInteger := ListView1.Items[J].Data['Must'].AsInteger;
              FDQ.ExecSQL;
            end;
          finally
            ListView1.EndUpdate;
            FDQ.Free;
            FDQ.Enablecontrols;
            FDGUIxWaitCursor.ScreenCursor := gcrNone;
          end;
Cevapla
#2
(30-04-2021, Saat: 18:42)Mete Adlı Kullanıcıdan Alıntı: Merhaba, 

ListViewdeki verileri Mysql databaseye update işlemi için alttaki kodları kullanıyorum; ListViewde yaklaşık 250 - 300 kayıt var.
Fakat update işlemi çok uzun sürüyor neredeyse 40 - 50 saniye bu sorun neden kaynaklanıyor olabilir?


       
         var
          J: Integer;
          FDQ: TFDQuery;
        begin
          ListView1.BeginUpdate;
          FDGUIxWaitCursor.ScreenCursor := gcrNone;
          FDQ := TFDQuery.Create(Nil);
          FDQ.Disablecontrols;
          try
            for J := 0 to ListView1.Items.Count - 1 do
            begin
              ListView1.Items[J].Data['Must'] := ListView1.Items[J].Index; // yeni Sıra no
              FDQ.Connection := FDConnection;
              FDQ.Active := False;
              FDQ.Close;
              FDQ.SQL.Clear;
              FDQ.SQL.Add('Update Liste Set Must=:Must Where Id=:Id');
              FDQ.ParamByName('Id').AsInteger := ListView1.Items[J].Data['Id'].AsInteger;
              FDQ.ParamByName('Must').AsInteger := ListView1.Items[J].Data['Must'].AsInteger;
              FDQ.ExecSQL;
            end;
          finally
            ListView1.EndUpdate;
            FDQ.Free;
            FDQ.Enablecontrols;
            FDGUIxWaitCursor.ScreenCursor := gcrNone;
          end;
For döngüsünden ;

 FDQ.Connection := FDConnection;
 FDQ.Active := False;
 FDQ.SQL.Clear;
 FDQ.SQL.Add('Update Liste Set Must=:Must Where Id=:Id');

Bu alanları çıkarıp üst tarafa at her seferinde mevcut sorgulamayı silip tekrar yazmasına gerek yok yine her seferinde connection ataması yapmana da gerek yok tek seferde yapman yeterli işlem zaten çalışacak.
Cevapla
#3
birde bu şekilde deneyınız..............


for J := 0 to ListView1.Items.Count - 1 do
begin

ListView1.Items[J].Data['Must'] := ListView1.Items[J].Index;

QUery1.DisableControls ;
QUery1.close;
QUery1.prepare;
QUery1.SQL.Add('Update Liste Set Must=:Must Where Id=:Id');
QUery1.ParamByName('Id').AsInteger := ListView1.Items[J].Data['Id'].AsInteger;
QUery1.ParamByName('Must').AsInteger := ListView1.Items[J].Data['Must'].AsInteger;
QUery1.unPrepare;
QUery1.ExecSQL;
QUery1.EnableControls;

end;
Cevapla
#4
Update işlemi sırasında program (40 - 50 saniye) donuyordu. Donma sorunu çözmek için THread kullandım ve donma sorunu çözüldü.
Fakat bu seferde 5 - 10 saniye sonra tekrar update yapmak istediğimde aşağıdaki hatayı almaya başladım.

Hata:
First chance exception at $00007FFD7EFCD3C8. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'. Process ListeControl.exe (11600)



Bilgisayara ortak kullanım için (Mysql - Appserv-x64-9.3.0) programı ile database kurdum;
Normalde sadece tek bilgisayara databaseyi Create ederek kullandığımda donma sorunu olmuyor. bu sorunu nasıl çözebilirim?  Sad


Kodlar:
procedure THreadListUpdate.Execute; // sıra no update
var
  I: Integer;
  FDQ: TFDQuery;
begin
  inherited;
  FDQ := TFDQuery.Create(Nil);
  MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  try
    for I := 0 to MainForm.ListView1.Items.Count - 1 do
    begin
      FDQ.Connection := MainForm.FDConnection;
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update Liste Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Id').AsInteger := MainForm.ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ParamByName('Mus').AsInteger := MainForm.ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.Free;
    MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  end;
end;
Cevapla
#5
(01-05-2021, Saat: 14:56)Mete Adlı Kullanıcıdan Alıntı: Update işlemi sırasında program (40 - 50 saniye) donuyordu. Donma sorunu çözmek için THread kullandım ve donma sorunu çözüldü.
Fakat bu seferde 5 - 10 saniye sonra tekrar update yapmak istediğimde aşağıdaki hatayı almaya başladım.

Hata:
First chance exception at $00007FFD7EFCD3C8. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'. Process ListeControl.exe (11600)



Bilgisayara ortak kullanım için (Mysql - Appserv-x64-9.3.0) programı ile database kurdum;
Normalde sadece tek bilgisayara databaseyi Create ederek kullandığımda donma sorunu olmuyor. bu sorunu nasıl çözebilirim?  Sad


Kodlar:
procedure THreadListUpdate.Execute; // sıra no update
var
  I: Integer;
  FDQ: TFDQuery;
begin
  inherited;
  FDQ := TFDQuery.Create(Nil);
  MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  try
    for I := 0 to MainForm.ListView1.Items.Count - 1 do
    begin
      FDQ.Connection := MainForm.FDConnection;
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update Liste Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Id').AsInteger := MainForm.ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ParamByName('Mus').AsInteger := MainForm.ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.Free;
    MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  end;
end;

Arkadaşlar Veritabanına direkt olarak yapılan bağlantılarda özellikle Listview kullanımında performans beklemeyin! Bu konuda yeterince tecrübeliyim ve buna dayanarak size önerim projenize göre farklı alternatif çözümler geliştirin derim... 

Ya da illa bu şekilde kullanmak zorundaysanız SQL sorgularınızı kontrol edin ve bu noktada performansı artırıcı sorgulamalar yazın. Yoksa öyle 250-300 kayıdı çekip Listview'de filan listeleme işinden verim almanız mümkün değil. Özellikle yüksek kapasiteli tablolarda kesin sorun yaşarsınız. THRead filan da kurtarmaz sizi!

Mesela;

SELECT * FROM uyeler WHERE kullaniciadi = 'Tamer' AND sifre = '1234' LIMIT 1

Bu sorguda kullanıcı adı ve şifreye sahip yalnızca 1 kullanıcı olacağı aşikardır.  O halde 50 bin kayıtlı bir tabloda “Tamer” isimli kullanıcı diyelim ki 10 bininci sırada bulunduğunda geriye kalan 40 bin satırın aranmasına gerek yoktur. Bunun için sorgunun sonuna sadece LIMIT 1 komutunu eklemekle Listview'de listelenmesini istediğiniz kayıtların database tarafında çok daha  hızlı çekilmesini sağlamış olursunuz. 

Yani SQL tarafında gerekli optimizasyonları yaparak hızı artırabilirsiniz. Ancak dediğim gibi Listview bileşeni özellikle direkt veritabanı bağlantısıyla çekilen yüksek kapasiteli verileri listelemede sıkıntılı olur.
Ne ekersen onu biçersin!  Idea
Cevapla
#6
(01-05-2021, Saat: 17:19)tmrksmt Adlı Kullanıcıdan Alıntı:
(01-05-2021, Saat: 14:56)Mete Adlı Kullanıcıdan Alıntı: Update işlemi sırasında program (40 - 50 saniye) donuyordu. Donma sorunu çözmek için THread kullandım ve donma sorunu çözüldü.
Fakat bu seferde 5 - 10 saniye sonra tekrar update yapmak istediğimde aşağıdaki hatayı almaya başladım.

Hata:
First chance exception at $00007FFD7EFCD3C8. Exception class $C0000005 with message 'c0000005 ACCESS_VIOLATION'. Process ListeControl.exe (11600)



Bilgisayara ortak kullanım için (Mysql - Appserv-x64-9.3.0) programı ile database kurdum;
Normalde sadece tek bilgisayara databaseyi Create ederek kullandığımda donma sorunu olmuyor. bu sorunu nasıl çözebilirim?  Sad


Kodlar:
procedure THreadListUpdate.Execute; // sıra no update
var
  I: Integer;
  FDQ: TFDQuery;
begin
  inherited;
  FDQ := TFDQuery.Create(Nil);
  MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  try
    for I := 0 to MainForm.ListView1.Items.Count - 1 do
    begin
      FDQ.Connection := MainForm.FDConnection;
      FDQ.Active := False;
      FDQ.Close;
      FDQ.SQL.Clear;
      FDQ.SQL.Add('Update Liste Set Must=:Mus Where Id=:Id');
      FDQ.ParamByName('Id').AsInteger := MainForm.ListView1.Items[I].Data['Id'].AsInteger;
      FDQ.ParamByName('Mus').AsInteger := MainForm.ListView1.Items[I].Data['Must'].AsInteger;
      FDQ.ExecSQL;
    end;
  finally
    FDQ.Free;
    MainForm.FDGUIxWaitCursor.ScreenCursor := gcrNone;
  end;
end;

Arkadaşlar Veritabanına direkt olarak yapılan bağlantılarda özellikle Listview kullanımında performans beklemeyin! Bu konuda yeterince tecrübeliyim ve buna dayanarak size önerim projenize göre farklı alternatif çözümler geliştirin derim... 

Ya da illa bu şekilde kullanmak zorundaysanız SQL sorgularınızı kontrol edin ve bu noktada performansı artırıcı sorgulamalar yazın. Yoksa öyle 250-300 kayıdı çekip Listview'de filan listeleme işinden verim almanız mümkün değil. Özellikle yüksek kapasiteli tablolarda kesin sorun yaşarsınız. THRead filan da kurtarmaz sizi!

Mesela;

SELECT * FROM uyeler WHERE kullaniciadi = 'Tamer' AND sifre = '1234' LIMIT 1

Bu sorguda kullanıcı adı ve şifreye sahip yalnızca 1 kullanıcı olacağı aşikardır.  O halde 50 bin kayıtlı bir tabloda “Tamer” isimli kullanıcı diyelim ki 10 bininci sırada bulunduğunda geriye kalan 40 bin satırın aranmasına gerek yoktur. Bunun için sorgunun sonuna sadece LIMIT 1 komutunu eklemekle Listview'de listelenmesini istediğiniz kayıtların database tarafında çok daha  hızlı çekilmesini sağlamış olursunuz. 

Yani SQL tarafında gerekli optimizasyonları yaparak hızı artırabilirsiniz. Ancak dediğim gibi Listview bileşeni özellikle direkt veritabanı bağlantısıyla çekilen yüksek kapasiteli verileri listelemede sıkıntılı olur.


Gerçekten güzel bir makale olmuş özellikle "LIMIT 1" mantığı; 

Fakat ListViewde kayıt ekleme silme gibi durumlarından bu yöntemi kullanmam imkansız. 
Garip olan ListViewde maksimum 300 kayıt varken sıra numaralarını güncellemek yaklaşık 50 saniyede sürmesi çok saçma.
Cevapla
#7
(01-05-2021, Saat: 17:48)Mete Adlı Kullanıcıdan Alıntı:
(01-05-2021, Saat: 17:19)tmrksmt Adlı Kullanıcıdan Alıntı: Arkadaşlar Veritabanına direkt olarak yapılan bağlantılarda özellikle Listview kullanımında performans beklemeyin! Bu konuda yeterince tecrübeliyim ve buna dayanarak size önerim projenize göre farklı alternatif çözümler geliştirin derim... 

Ya da illa bu şekilde kullanmak zorundaysanız SQL sorgularınızı kontrol edin ve bu noktada performansı artırıcı sorgulamalar yazın. Yoksa öyle 250-300 kayıdı çekip Listview'de filan listeleme işinden verim almanız mümkün değil. Özellikle yüksek kapasiteli tablolarda kesin sorun yaşarsınız. THRead filan da kurtarmaz sizi!

Mesela;

SELECT * FROM uyeler WHERE kullaniciadi = 'Tamer' AND sifre = '1234' LIMIT 1

Bu sorguda kullanıcı adı ve şifreye sahip yalnızca 1 kullanıcı olacağı aşikardır.  O halde 50 bin kayıtlı bir tabloda “Tamer” isimli kullanıcı diyelim ki 10 bininci sırada bulunduğunda geriye kalan 40 bin satırın aranmasına gerek yoktur. Bunun için sorgunun sonuna sadece LIMIT 1 komutunu eklemekle Listview'de listelenmesini istediğiniz kayıtların database tarafında çok daha  hızlı çekilmesini sağlamış olursunuz. 

Yani SQL tarafında gerekli optimizasyonları yaparak hızı artırabilirsiniz. Ancak dediğim gibi Listview bileşeni özellikle direkt veritabanı bağlantısıyla çekilen yüksek kapasiteli verileri listelemede sıkıntılı olur.


Gerçekten güzel bir makale olmuş özellikle "LIMIT 1" mantığı; 

Fakat ListViewde kayıt ekleme silme gibi durumlarından bu yöntemi kullanmam imkansız. 
Garip olan ListViewde maksimum 300 kayıt varken sıra numaralarını güncellemek yaklaşık 50 saniyede sürmesi çok saçma.

Haklısın ama inan öyle saçma şeylerle karşılaştım ki! Mesela aynı projem 15 yıllık Core2 PC'de gayet hızlı listeleme yapıyorken, Celeron J1900 işlemcili dokunmatik PC'de gözle görülür şekilde yavaş listeliyordu! Düşün ki üzerinde 1.5 yıl uğraştığım projeyi bile sırf bu yüzden değiştirmek zorunda kaldım. O noktadan sonra artık hiçbir projemde veritabanına direkt bağlantı yapmıyorum. Hele Mobil de asla!
Ne ekersen onu biçersin!  Idea
Cevapla
#8
(01-05-2021, Saat: 17:48)Mete Adlı Kullanıcıdan Alıntı: ...
Garip olan ListViewde maksimum 300 kayıt varken sıra numaralarını güncellemek yaklaşık 50 saniyede sürmesi çok saçma.

Merhaba.  

* Listview'den okuma yapıp SQL ile güncelleme yaparken ilk mesajınızda yaptığınız döngü içerisinde unutulmuş Connection Aç/Kapa kazasını gidermişseniz eğer, buna rağmen gecikmenin sebebi Index sayınızdaki fazlalık olasılığına bahse girerdim. ( bağlantı hızı açısında normal şartlarda olmak kaydıyla ) Bu sonuca şundan ulaşıyorum, tek bilgisayarda sıfırdan üretilmiş tabloda yavaşlık hissetmediğinizi bildirmişsiniz.

* SELECT hızlı olsun diye çok sayıda index tanımlanmışsa, bu defa Insert/Update olayında bu indexler baştan üretilir/düzenlenir. Bu da yavaşlık olarak döner.

* Projelerimde ben de ListView kullanıyorum. Kesinlikle yavaşlık yaşamıyorum. Listeleme aşamasında ListView için BeginUpdate/EndUpdate bloğuna aldığınızda salt liste girişi yapılır o kadar. Paint vs olmayacağından sıralı okumadan doğası dışında öte bir yavaşlık hissedilmez.

* Sayfalama mantığı da güderseniz ( bahsi daha önce geçmişti ) tadından yenmez diyecek kadar performans alırsınız.

İllüzyonu kurmak için strateji...
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#9
Big Grin 
Ortak database kullanarak bir program geliştiriyorum. Daha önceleri PC'ye Create ederek kullandığım hiç bir databasede sorun yaşamamıştım.


Sorunu buldum, kesinlikle kodlamadan kaynaklı değil. (Mysql - Appserv-x64-9.3.0) ile bilgisayara ağ kurdum ve faklı PC'lerden bağlantı kurulacak.
phpMyAdmin Database Manager Version 4.9.1 ile "Liste" adındaki databseyi sildim ve yeniden oluşturdum. 
Yaklaşık 10 kayıt varken update işlemi çok yavaş değildi. Fakat kayıt sayısı 100 ve üzeri olunca aynı saçmalık başladı.

Sorun kesinlikle (Mysql - Appserv-x64-9.3.0)  ile kurduğum databaseden kaynaklanıyor; Bende mysql databaseyi iyi bir şey sanırdım  Idea   çözüm için ne yapabilirim?
Cevapla
#10
(01-05-2021, Saat: 21:59)Mete Adlı Kullanıcıdan Alıntı: Ortak database kullanarak bir program geliştiriyorum. Daha önceleri PC'ye Create ederek kullandığım hiç bir databasede sorun yaşamamıştım.


Sorunu buldum, kesinlikle kodlamadan kaynaklı değil. (Mysql - Appserv-x64-9.3.0) ile bilgisayara ağ kurdum ve faklı PC'lerden bağlantı kurulacak.
phpMyAdmin Database Manager Version 4.9.1 ile "Liste" adındaki databseyi sildim ve yeniden oluşturdum. 
Yaklaşık 10 kayıt varken update işlemi çok yavaş değildi. Fakat kayıt sayısı 100 ve üzeri olunca aynı saçmalık başladı.

Sorun kesinlikle (Mysql - Appserv-x64-9.3.0)  ile kurduğum databaseden kaynaklanıyor; Bende mysql databaseyi iyi bir şey sanırdım  Idea   çözüm için ne yapabilirim?

Merhaba

Firebird x64 kurup Firebird ile yolunuza devam edebilirsiniz.
Örnek php bağlantı :
try {

$host = "firebird:dbname=127.0.0.1:C:\AppServ\www\dosya\db\data.FDB";
$password = 'masterkey';
$username = 'SYSDBA';
 
$db = new PDO($host, $username, $password);

}catch(PDOException $e) {
echo $e->getMessage();
}
Genelde ingilizce klavye ile ileti gönderiyorum.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  database dosyalarını listeleme akuyumcu63 5 511 09-07-2021, Saat: 16:18
Son Yorum: akuyumcu63
  Database ile haberleşme Atomkarınca 3 790 08-03-2021, Saat: 22:23
Son Yorum: tmrksmt
  tablo son kayda update yapmak sadikacar60 3 919 09-02-2021, Saat: 10:23
Son Yorum: adelphiforumz
  Çoklu update Nese 3 749 16-11-2020, Saat: 12:27
Son Yorum: mcuyan
  SQlite Update Hatası Ali YILDIRIM 0 1.142 03-06-2019, Saat: 11:31
Son Yorum: Ali YILDIRIM



Konuyu Okuyanlar: 1 Ziyaretçi