2010-12-01 1 views
5

У меня возникает проблема при заполнении набора записей ADO в VB6. Запрос (поражение SQLServer 2008) занимает около 1 секунды для запуска, когда я запускаю его с помощью SSMS. Он отлично работает, когда результирующий набор невелик, но когда ему требуется несколько сотен записей, это занимает много времени. Для 800+ записей требуется около 5 минут для возврата (запрос по-прежнему занимает 1 секунду в SSMS), а 6000+ занимает более 20 минут. Я «исправил» исключение, увеличив тайм-аут команды, но мне было интересно, есть ли способ заставить его работать быстрее, поскольку он, похоже, не является фактическим запросом, для которого требуется так много времени. Что-то вроде сжатия результатов, так что это не займет столько времени. Набор записей открывается следующим образом:Устранение ошибки тайм-аута ADO в VB6

myConnection.CommandTimeout = 2000 
myConnection.ConnectionString = "Provider=SQLOLEDB;" & _ 
     "Initial Catalog=DB_NAME;" & _ 
     "Data Source=SERVER_NAME" & _ 
     "Network Library=DBMSSOCN;" & _ 
     "User ID=USER_NAME;" & _ 
     "Password=PASSWORD;" & _ 
     "Use Encryption for Data=True;" 
myConnection.Open 

myRecordSet.Open STORED_PROC_QUERY_STRING, myConnection, adOpenStatic, adLockReadOnly 
Set myRecordSet.ActiveConnection = Nothing 

myConnection.Close 

Данные возвращают 3 столбца, используемые для заполнения поля со списком.

UPDATE: Я запустил SQL Profiler, и экземпляры с клиентской машины делают больше чтений и занимают больше времени в 100 раз, чем оба показателя для запросов в SSMS. Текст запроса одинаковый для SSMS и клиентской машины в соответствии с профилировщиком, поэтому я не думаю, что он должен использовать другой план выполнения. Может ли сетевая библиотека или Провайдер повлиять на это?

статистика Profiler:

  • Из клиентского приложения: 7041720 читает, длительность 59458 мс, 3900 строк подсчитывает
  • От SSMS: 30802 читает, 238 мс длительность, 3900 строк подсчитывает

Похоже, что он использует другой план выполнения, но запрос точно такой же, и я не уверен, как проверить план выполнения, который клиент может использовать, если он отличается от fr om, что показано в SSMS.

+0

Вы пытались удалить «Использовать шифрование для данных»? – Andomar 2010-12-01 19:42:27

+0

Нет, но это не действительно доступный вариант. Это клиентское приложение. – 2010-12-01 20:12:19

ответ

3

800+ records requires about 5 minutes = проблема с запросом.

взгляд на ваш план выполнения:

В SSMS, запустите:

SET SHOWPLAN_ALL ON

затем запустить запрос, он не будет производить ожидаемый набор результатов, но план exceution от того, как базы данных извлекает ваши данные. Большинство плохих запросов обычно сканируют таблицу (посмотрите на каждую строку в таблице, которая медленная), поэтому ищите слово «SCAN» в столбце StmtText. Попытайтесь выяснить, почему индекс не используется в этой таблице (имя будет там под словом «SCAN»). Если вы объединяетесь в несколько таблиц и имеете несколько SCAN, сначала сосредоточитесь на крупнейших таблицах.

Без дополнительной информации это лучшая «общая» помощь, которую вы можете получить.

EDIT
Прочитав ваш вопрос, я не уверен, что если вы имеете в виду, что всегда быстро от SSMS независимо от строки, но медленно из VB по мере увеличения рядов.Если это так, проверить это: http://www.google.com/search?q=sql+server+fast+from+ssms+slow+from+application&hl=en&num=100&lr=&ft=i&cr=&safe=images

может быть что-то вроде: параметра нюхает или непоследовательные параметры соединения (ANSI нулей, ARITHABORT и т.д.)

для настройки подключения, попробуйте запустить их из SSMS и из VB6 (добавить их в наборе результатов) и посмотреть, есть ли какие-либо различия:

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 

сделать ваш запрос как (так что вы можете увидеть настройки подключения в VB6):

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