Firedac Update Çok Yavaş (Çözüldü)
-
Delphi, FireDac ile veritabanı işleminde update işlemi 10 saniyeyi falan buluyor. Dev Express Grid yapısı varmış altında, ordan otomatik bağlıymış firedac' a.
Ben de tam hakim değilim konuya da mysql workbench ve php ile aynı sorgu 1 saniyenin altında sürüyor.
Acaba neden kaynaklanıyor olabilir ? Bildiğiniz kronik bir problemi var mıydı bunların ?
Yaklaşık 505 bin data var ve data sayısı arttıkça daha da yavaşlıyor. Tek tablodan işlem yapılıyor, id' ye göre update ediliyor. Join falan kullanılmıyor.
-
Bence sayfalama yapmadan bütün veriyi çekip onun ilk 100 kaydını gösteriyorsun
-
cxgridin grid modunu false yapıp bir dene yine bir yavaşlık var ise normal dbgrid nesnesine bağlayıp test et
-
HolyOne bunu yazdı
Bence sayfalama yapmadan bütün veriyi çekip onun ilk 100 kaydını gösteriyorsun
Bunun update e ne gibi etkisi oluyor delphi de? Bu arada galiba oyleymis, yarin tam ogrenirim hocam. Kodu ben tasarlamadim
@masteryoda yarin kodlara bakinca denicem hocam onerilerini tesekkur ederim
ozgunlu tarafından 21/Mar/16 17:38 tarihinde düzenlenmiştir -
dataset open ile fetchall farklı çalışır select sql inde lazım olmayan fieldlar varsa onları yazma select * from yerine select field1,field2 from table where field1=---- gibi olsun
where şartında çok kullandığın field varsa ona index tanımlaman performans sağlar. -
Devexpress gridview hepsini ram' e çekiyormuş, sonra update olunca hangisinde olduğunu bilmediğinden her seferinde tekrar komple çekiyormuş datayı tablodan.
O yüzdenmiş yavaşlık, Grid Mode diye birşeyi var. Onu true yapın demiş. Onu true yapınca parça parça çekiyor, sıkıntı gitti ama bu sefer de sorting, grouping, filtering gibi özelliklerden feragat etmek zorunda kaldım.
Ama asıl mesele şu ki; grid mode false iken (yani update 10 saniye iken) aynı satır üzerinde 2 kere işlem yapabiliyordum, şimdi onu true yapınca aynı satırda iki kere işlem yapınca 2. yi yapamıyorum. İlla başka bi satıra tıklamam gerekiyor.
Acaba sebebi ne olabilir ? @HolyOne @masteryoda @tümdelphiciler :(
Debug ettim, metoda girmiyor anasını satiyim. Ama diyelim ki o satırda güncelleme yaptım sonra başka satıra bastım ama hiç birşey yapmadım. Sonra geri döndüm güncelleme yaptım, o zaman çalışıyor.
Ama ve lakin, o satırda güncelleme yaptım diyelim, sonra tekrar bastım güncellemeye yine değiştirdim, 2. yaptığımı yapmıyor. Metoda gelip atlıyor debug da. Yokmuş gibi davranıyor :@
Acaba dedim yavaş yazıyor da lock olduğundan mı yapmıyor, sleep koydum araya 3-5 saniye ama sonuç değişmedi.
ozgunlu tarafından 22/Mar/16 15:51 tarihinde düzenlenmiştir -
Adam böyle demiş, niye böyle saçma bir çalışma mantığı var anlamış değilim.... neyse şu smartrefresh olayı ben de yemedi. Bunu 9 yıl önce yazmış, altına yorum yazmaya ya da başlık açmaya utanıyorum :(
The ExpressDataController (the data processing core of our components) supports different data processing modes. When it is in default data loading mode (.DataController.DataModeController.GridMode = False), it loads the entire amount of data into memory. This obviously requires significant time for huge amounts of data. Editing data in your GridView or updating its underlying dataset from external modules forces the dataset to send a DataChanged notification to all its listeners (linked data controls). When the DataController receives such a notification, it reloads ALL records from the underlying dataset. This is by design, because it's impossible to determine which particular records have been modified.
In your situation, you can activate the DataController.DataModeController.SmartRefresh option of your GridView. This way, the DataController reloads only the modified record when posting changes. However, this works only if your modify data via the corresponding GridView. Editing data from outside the GridView still requires you to reload all records.
Another solution is to switch the DataController to grid mode, when it works as the standard TDBGrid. I recommend that you first refer to the ExpressQuantumGrid's documentation for detailed information about its data processing modes, their advantages and requirements. In particular, read the "Grid Mode" topic.
If you wish to use grid mode, try using the techniques described in the following Knowledge Base article:
"How to implement features specific to the default loading mode when the View (Data Controller) works in grid mode"
Article ID: A133 (https://www.devexpress.com/kb=A133)Thanks,
Sergehttps://www.devexpress.com/Support/Center/Question/Details/B92991
-
datacontroller-options-dcoimmediatepost bunu true yapıp denermisin birde daha açık yazarsan tam olarak yapmak istediğini örnek gride tutar diye bir alanın var sen bu alana 15 yazıp entera bastığında güncellemiyormu ne yapıyor.
-
masteryoda bunu yazdı
datacontroller-options-dcoimmediatepost bunu true yapıp denermisin birde daha açık yazarsan tam olarak yapmak istediğini örnek gride tutar diye bir alanın var sen bu alana 15 yazıp entera bastığında güncellemiyormu ne yapıyor.
yok hocam, menüden birşey seçip slider ile durumunu değiştiriyorum, ilk seferde değiştiriyor ikincisinde değiştirmiyor. ikincisinde değiştirebilmesi için önce başka rowa tıklayıp sonra geri tıklamam gerekiyor.
-
Bir örnek olsa daha rahat anlaşılırdı. böyle şu demek çok zor.
-
masteryoda bunu yazdı
Bir örnek olsa daha rahat anlaşılırdı. böyle şu demek çok zor.
hocam onu çözdüm. Şimdi şöyle bir sıkıntı var, ben TFDQuery' i refresh ediyordum her insertion ya da delete işleminden sonra ama bu tüm tabloyu re-fetch ettiğinden oralarda da hayvan gibi yavaşlıyor.
Bu devexpress abimizin Grid Mode True' sunda bu insertion ve deletion işlemlerini GridTable' a nasıl yansıtabilirim ?
Edit: Soru içinde soru gibi oldu ama :/
ozgunlu tarafından 24/Mar/16 17:19 tarihinde düzenlenmiştir