ADO Query sorgu hızı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
kerpeten
Üye
Mesajlar: 62
Kayıt: 26 May 2016 01:31

Re: ADO Query sorgu hızı

Mesaj gönderen kerpeten »

Bu iki sorgu arasındaki tek fark UrunID ve UrunAD arasında. Eğer fark buysa süre bu kadar farklı olmamalı. Ancak join varsa ve UrunAD bu joinli dosyadan alınıyorsa bu süre farkı olabilir. Bunun için işletimi ya da işlemleri değiştirerek farklı çözümler gerçekleştirmeniz gerekir. Örneğin sayfalama yapabilirsiniz. Eğer rapor içinse, yani sayfalama yapılamıyorsa UrunAD'ı almayıp en son yazdırırken dosyadan okutabilirsiniz vs...
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

opordace yazdı: 05 Şub 2018 05:07 Merhaba Arkadaşlar,
1.2 milyon kayıtlı bir database den
Select AdisyonID,UrunID from vw_ext_SipSatis_Gecmis' sorgusu ile 8 sn ye DBGrid e yüklüyorum.
Select AdisyonID,UrunAD from vw_ext_SipSatis_Gecmis' sorgusu ile yaklaşık 3 dk sürüyor. urunID integer, UrunAD string, sorgu süresi bu kadar farkeder mi arkadaşlar. UrunAD sorguda yazmadığımda sorgu sonucunu yazdırırken mecbur ürün ismini kullanacağımdan orada hata veriyor, bulunamadı filan diye. Bu sorguyu hızlandırmanın başka bir yolu varmı?
Merhaba,

Öncelikle;
- Kullandığınız database bilgisini paylaşmamışsınız.
- Her iki komut için database sisteminin oluşturduğu çalışma planını paylaşmamışsınız.

Integer ve string bilgileri okuma süresi muhakkak farkeder. Integer için yüksek olasılıkla 4 byte (maksimum 8 byte) veri okumak yeterli iken string için değişken uzunluklarda veriler okunacaktır. Alanlarınızda kayıtlı ortalama 10 karakter veri var ise disk üzerinden 20 byte (utf-8 veri kaydedildi ise bri karakter için 2 byte kullanılabilir) okumak gerekli olabilir.

Ancak sizin yaşadığınız sorunun bu olduğunu düşünmüyorum. Olası sebepler olarak:
1) Eğer "SQL Server Express" sürümünü (ücretsiz sürümünü) kullanıyor iseniz bu durumda RAM kullanım limiti sorunu yaşıyor olabilirsiniz. İlk select çalıştırıldığı zaman SQL Server sorgulama bilgilerini bir sonraki işlemi hızlandırmak için "cache" içine alır. Eğer farkl sorgular sonucu cache için kullanılan veri 1GB limitlerine ulaşır ise akabinde çalıştırılacak komutlar cache yerine disk üzerinden okuma yapılarak yine cache içinde yer açılıp hafızaya kaydediliyor olacaktır.

2) Eğer tablonuzda AdisyonID ve UrunID için indeks oluşturulmuş ancak AdisyonID ve UrunAD için indeks oluşturulmamış ise ilk srogu indeks üzerinde arama yaparak hızlı olarak sonucu çevirebilir iken ikinci sorgu 1.2 milyon kayıdı sıralı olarak tarama yapıyor olabilir.

Bunlar dışında farklı bir sebep olabilir. Tespiti ancak her iki sorgu için oluşturulan "plan" bilgilerini gördükten sonra mümkün olacabilir.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

Cevabınız için teşekkür ederim. SQL Server 2008 Express (ücretsiz sürümünü kullanıyorum evet) Çalışma planı;

ADOQuery1.Connection:=Adoconnection1;
ADOQuery1.Close;
ADOQuery1.sql.clear;
ADOQuery1.SQL.Add('Select AdisyonID,UrunID,BirimFiyat,Adet,UrunToplam,SipSubeID from vw_ext_Sipsatis_Gecmis');
ADOQuery1.open;
Datasource1.DataSet:=ADOQuery1;
DBgrid1.DataSource:=datasource1;

Bu şekilde DBgrid'e aktarıyorum, UrunID yerine UrunAD yazınca süre uzuyor.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

kerpeten yazdı: 06 Şub 2018 02:48 Bu iki sorgu arasındaki tek fark UrunID ve UrunAD arasında. Eğer fark buysa süre bu kadar farklı olmamalı. Ancak join varsa ve UrunAD bu joinli dosyadan alınıyorsa bu süre farkı olabilir. Bunun için işletimi ya da işlemleri değiştirerek farklı çözümler gerçekleştirmeniz gerekir. Örneğin sayfalama yapabilirsiniz. Eğer rapor içinse, yani sayfalama yapılamıyorsa UrunAD'ı almayıp en son yazdırırken dosyadan okutabilirsiniz vs...
Evet aslında sayfalama yapmıyorum, UrunAD alanını kullanmadığımda oluşan sorgu sonucunda table den kayıt okurken UrunAD alanını okuyamıyorum, bunu nasıl yapacağım.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

opordace yazdı: 06 Şub 2018 10:34 Cevabınız için teşekkür ederim. SQL Server 2008 Express (ücretsiz sürümünü kullanıyorum evet) Çalışma planı;

ADOQuery1.Connection:=Adoconnection1;
ADOQuery1.Close;
ADOQuery1.sql.clear;
ADOQuery1.SQL.Add('Select AdisyonID,UrunID,BirimFiyat,Adet,UrunToplam,SipSubeID from vw_ext_Sipsatis_Gecmis');
ADOQuery1.open;
Datasource1.DataSet:=ADOQuery1;
DBgrid1.DataSource:=datasource1;

Bu şekilde DBgrid'e aktarıyorum, UrunID yerine UrunAD yazınca süre uzuyor.
Bu gönderdiğiniz bilgi Delphi içinde bilgiyi nasıl okuduğunuz ile ilgili. Benim bahsettiğim PLAN ise SQL Server Management Studio üzerinde aynı SQL komutunu parametreleri elle yazarak "bana planı göster" şeklinde elde edilecek olan bilgi. İkisi tamamen farklı şeylerdir.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

SQL Server Management Studio üzerinde aynı SQL komutunu parametreleri elle yazdım, çalıştırabiliyorum, ama planı göster nedir bilmiyorum, nasıl yapacağımı da bilmiyorum maalesef
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

SQL Server Management Studio da sql komutunu yazdım, tablo yu açmaya başladı, 15 dk oldu hala bitiremedi, görüntüsü ektedir. Bu bir fikir verirmi size bilmem.
Dosya ekleri
sql.jpg
sql.jpg (2.55 KiB) 2225 kere görüntülendi
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

vw_ext_Sipsatis_Gecmis view için create komutunu paylaşabilir misiniz?
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

ertank yazdı: 06 Şub 2018 10:20 vw_ext_Sipsatis_Gecmis view için create komutunu paylaşabilir misiniz?
Anlamadım maalesef
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

SQL Server Management Studio içinde "vw_ext_Sipsatis_Gecmis" view nesnesini sol taraftaki kısımda bulup üzerinde sağ tuş ile tıklayın.
Menüden "Script View as" -> "CREATE To" -> "New Query Editor Window" seçeneğini seçin.
Kaşınıza gelen sayfa içindeki bilgileri burada paylaşın.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

ertank yazdı: 09 Şub 2018 11:40 SQL Server Management Studio içinde "vw_ext_Sipsatis_Gecmis" view nesnesini sol taraftaki kısımda bulup üzerinde sağ tuş ile tıklayın.
Menüden "Script View as" -> "CREATE To" -> "New Query Editor Window" seçeneğini seçin.
Kaşınıza gelen sayfa içindeki bilgileri burada paylaşın.
Resim
Dosya ekleri
sqlhata.jpg
sqlhata.jpg (1.93 KiB) 2192 kere görüntülendi
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

Dosya eki çok küçük olduğu için gözükmüyor.
Anlayabildiğim kadarıyla bir hata mesajı almışsınız. Bahsettiğim işlem sonucunda karşınıza yeni bir SQL editor gelip içinde

Kod: Tümünü seç

CREATE VIEW vw_ext_Sipsatis_Gecmis
yazan ifadeler olması gerekli.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

Aşağıdaki hatayı veriyor.

scrip Failed for View dbo.vw_ext_Sipsatis_Gecmis (Microsoft.sqlserver.smo)

Addinational İnformation:

Property TextHeader is not avaible for [View dbo.vw_ext_Sipsatis_Gecmis] this propety may not exist for this object, or may not be
retrievable due to insufficient access rights. The text is encrypted.(Microsoft.sqlserver.smo)
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: ADO Query sorgu hızı

Mesaj gönderen ertank »

Database bağlantısı için elinizde tek bir bağlantı bilgisi var ise bu kullanıcının view detay bilgilerine erişim yetkisi yok diye anlıyorum. Eğer kullanıcı adı kullanmadan bağlanıyor iseniz active directory veya windows kullanıcısının yetkisi yok yüksek ihtimalle.

Mümkün ise tam yetkili bir kullanıcı ile aynı işlemi deneyin.

Eğer database yöneticisi var ise her iki komutunuz için (hızlı ve yavaş çalışan) execution plan bilgilerini metin olarak size iletmesini rica edin.
opordace
Üye
Mesajlar: 15
Kayıt: 28 Nis 2015 02:44

Re: ADO Query sorgu hızı

Mesaj gönderen opordace »

ertank yazdı: 11 Şub 2018 08:25 Database bağlantısı için elinizde tek bir bağlantı bilgisi var ise bu kullanıcının view detay bilgilerine erişim yetkisi yok diye anlıyorum. Eğer kullanıcı adı kullanmadan bağlanıyor iseniz active directory veya windows kullanıcısının yetkisi yok yüksek ihtimalle.

Mümkün ise tam yetkili bir kullanıcı ile aynı işlemi deneyin.

Eğer database yöneticisi var ise her iki komutunuz için (hızlı ve yavaş çalışan) execution plan bilgilerini metin olarak size iletmesini rica edin.
Tamam, çok teşekkür ederim. Size başka bir soru sorabilirmiyim. Aşağıda iki ayrı view den iki ayrı sorgu yaptım ve bu sorgularla istediğim sonucu alabiliyorum. 1. Sorgu sonucuna ikinci sorgudaki kullanilanToplam alanını eklemek istiyorum, şart 1. Sorgudaki MainId nin karşısına 2. Sorgudaki MalzemeId aynı olan kayıttaki KullanilanToplam alanını eklesin. İnner join ile yaptım rakamlar bazıları 3 kat bazıları 6 kat fazla gözüküyor, bir yerde yanlışlık yaptım.

ADOQuery2.SQL.Add('Select Sube,MainId,StokEtki,MlzAd,SUM(Case When HareketTip=1 Then MlzAdet*MainCarpan else 0 end) as Çıkan,AVG(Case When HareketTip=0 Then SumStokBirim end) as Ortalama,SUM(Case When HareketTip=0 or HareketTip=5 Then MlzAdet*MainCarpan else 0 end) as Gelen');
ADOQuery2.SQL.Add('from vw_ext_StokHareket');
ADOQuery2.SQL.Add('Where StokEtki=1 and Sube=1 GROUP BY Sube,MlzAd,StokEtki Order BY MlzAd ASC');

ADOQuery4.close;
ADOQuery4.sql.clear;
ADOQuery4.SQL.Add('Select MalzemeId,SUM(KullanilanToplam) as Kullanım from vw_ext_Mlz_Kullanim Where Sube=1 Group By MalzemeId Order By MalzemeId');
ADOQuery4.open;
Cevapla