2010-12-01 26 views
5

VB6'da bir ADO kayıt kümesini doldururken bir sorunla karşılaşıyorum. Sorgu (SQLServer 2008'e isabet), yalnızca SSMS kullanarak çalıştırdığımda çalıştırmak için yaklaşık 1 saniye sürer. Sonuç kümesi küçük olduğunda iyi çalışır, ancak birkaç yüz kayıt olduğunda, uzun bir zaman alır. 800+ kayıtların geri yüklenmesi yaklaşık 5 dakika sürer (sorgu SSMS'de sadece 1 saniye sürer) ve 6000+ 20 dakikadan fazla zaman alır. Komut zaman aşımını arttırarak istisnayı "düzelttim", ancak daha fazla zaman gerektiren gerçek sorgu gibi görünmediğinden daha hızlı çalışmanın bir yolu olup olmadığını merak ediyordum. Sonuçları sıkıştırmak gibi bir şey bu kadar uzun sürmez. Kayıt kümesi aşağıdaki gibi açılır: Bir birleşik kutuyu doldurmak için kullanılan 3 sütunu döndürür. Veriler birleşik kutuyu doldurmak için kullanılan 3 sütunu döndürür.VB6'da bir ADO zaman aşımı sorununu çözme

GÜNCELLEME: SQL Profiler'ı çalıştırdım ve istemci makinesindeki örnekler daha fazla okuma yapıyor ve SSMS'deki sorgular için her iki metriğe göre 100 kat daha fazla zaman alıyor. Sorgunun metni hem SSMS hem de istemci makine için profiler'e göre aynıdır, bu yüzden farklı bir yürütme planı kullanması gerektiğini düşünmüyorum. Ağ kütüphanesi veya Sağlayıcı bunun üzerinde herhangi bir etkiye sahip olabilir mi?

Profiler istatistikleri: istemci uygulamadan

  • : 7041720 59458 ms süre, 3900 satır sayımları SSMS itibaren
  • , okur: 30802 okur 238 ms süresi, 3900 satır
sayar

Farklı bir yürütme planı kullanıyor gibi görünüyor, ancak sorgu tam olarak aynı ve istemcinin farklı fr kullanıyorsa, yürütme planını nasıl kontrol edeceğimi bilmiyorum om SSMS'de neyin gösterildiğini.

+0

"Veri için Şifreleme Kullan" ı kaldırmayı denediniz mi? – Andomar

+0

Hayır, ancak bu gerçekten uygun bir seçenek değil. Bu bir istemci uygulamasıdır. –

+1

Aramaları profillemeyi denediniz mi ve [yürütme planlarına bakmak] (http://stackoverflow.com/questions/3831644/why-does-a-database-query-only-go-slow-in-the-application/ 3831685 # 3831685) Bunu doğrulamak kesinlikle bir parametre koklama sorunu değil mi? –

cevap

3

800+ records requires about 5 minutes = sorgulama sorunu. senin yürütme planına

görünüm: beklenen sonuç kümesini üretmek değil,

SET SHOWPLAN_ALL ON

sonra sorgu çalıştırmak, ama nasıl veritabanı üzerinde bir exceution planı: SSMS yılında

çalıştırmak verilerinizi alıyor. Çoğu kötü sorgu genellikle tablo taramasıdır (tablodaki her satırda yavaş olana bakın), yani StmtText sütununda "SCAN" sözcüğünü arayın. Endeksin bu tabloda neden kullanılmadığını anlamaya çalışın (isim "SCAN" sözcüğü ile orada olacaktır). Birden çok tabloya katılırsanız ve birden fazla SCAN'ın önce en büyük tablolara konsantre olmasını sağlayın.

Daha fazla bilgi için bu, alabileceğiniz en iyi "genel" yardımdır.

sorunuzu okuyunca DÜZENLEME
, sana satırlar arttırdıkça her zaman hızlı SSMS gelen olursa olsun satırları ama yavaş VB den demek olmadığından emin değilim.O ise durum bu kontrol edin: http://www.google.com/search?q=sql+server+fast+from+ssms+slow+from+application&hl=en&num=100&lr=&ft=i&cr=&safe=images

gibi bir şey olabilir: Bağlantı ayarları için koklama parametre veya tutarsız bağlantı parametreleri (ANSI null, ARITHABORT, vs)

, SSMS gelen ve VB6 bu çalıştırmayı deneyin (sonuç kümesinde eklemek) ve herhangi bir fark olup olmadığını görmek:

SELECT SESSIONPROPERTY ('ANSI_NULLS') --Specifies whether the SQL-92 compliant behavior of equals (=) and not equal to (<>) against null values is applied. 
             --1 = ON 
             --0 = OFF 

SELECT SESSIONPROPERTY ('ANSI_PADDING') --Controls the way the column stores values shorter than the defined size of the column, and the way the column stores values that have trailing blanks in character and binary data. 
             --1 = ON 
             --0 = OFF 

SELECT SESSIONPROPERTY ('ANSI_WARNINGS') --Specifies whether the SQL-92 standard behavior of raising error messages or warnings for certain conditions, including divide-by-zero and arithmetic overflow, is applied. 
             --1 = ON 
             --0 = OFF 

SELECT SESSIONPROPERTY ('ARITHABORT') -- Determines whether a query is ended when an overflow or a divide-by-zero error occurs during query execution. 
             --1 = ON 
             --0 = OFF 

SELECT SESSIONPROPERTY ('CONCAT_NULL_YIELDS_NULL') --Controls whether concatenation results are treated as null or empty string values. 
                --1 = ON 
                --0 = OFF 

SELECT SESSIONPROPERTY ('NUMERIC_ROUNDABORT') --Specifies whether error messages and warnings are generated when rounding in an expression causes a loss of precision. 
               --1 = ON 
               --0 = OFF 

SELECT SESSIONPROPERTY ('QUOTED_IDENTIFIER') --Specifies whether SQL-92 rules about how to use quotation marks to delimit identifiers and literal strings are to be followed. 
              --1 = ON 
              --0 = OFF 

yapmak böylece VB6 bağlantı ayarlarını) görebilirsiniz (sevdiği sorgusu:

SELECT 
    col1, col2 
     ,SESSIONPROPERTY ('ARITHABORT') AS ARITHABORT 
     ,SESSIONPROPERTY ('ANSI_WARNINGS') AS ANSI_WARNINGS 
    FROM ... 
+0

Orijinal gönderi başına, sorgu SSMS'de bir saniyenin altında çalışır. Sorgunun metni tam olarak aynıdır (SQL Profiler ile onaylanmıştır). İcra planına baktım ve iyi görünüyor. Tüm indeksler kullanılıyor. –

+0

Gerçekten de, oturum özelliklerini, performansı etkileyebileceğinden karşılaştırmaya değer, en azından AD0 sorgusunu, bir ARITHABORT ON –

+0

yayınladıktan sonra deneyin. Bu, arithabort özelliğiydi. Yardım için teşekkürler. –