2009-07-22 2 views
1

Я бегу запрос непосредственно, это тривиально в природе:набора данных раз в то время запрос выполняется немедленно

SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobId = 36963 

Когда я запускаю это из студии управления запрос не даже взять второй. Когда я запускаю его из адаптера таблицы, он отключается. Я исправил это несколько раз, но исправление нелепо. Если я удалю адаптер таблицы из моего xsd-файла и заново создам его, время запроса будет соответствовать времени в студии управления примерно на два дня, но я должен перераспределить, что является asinine.

Любое понимание того, что может быть причиной этого, будет с благодарностью оценено. Я видел еще один вопрос об этом, но решение, связанное с набором arithabort до запроса, не имело для меня эффекта.

Редактировать: Мне было предложено показать код для вызова запроса. Теперь это происходит, когда я вхожу в свой файл XSD и просто делать данные предварительного просмотра, а также, но для ясности здесь:

using (TEAMSConnection connection = new TEAMSConnection()) 
{ 
    connection.OpenConnection(); 

    _JobDetailsDAO jobDetailDao= new _JobDetailsDAO(connection); 
    return jobDetailDao.GetUnloadedJobDetailsByJobId(jobId); 

} 

При выбытии связи соединение с базой данных закрывается. используя следующую строку кода:

if (_DBConnection != null && _DBConnection.State == ConnectionState.Open) 
    _DBConnection.Close();  

Edit2: Я побежал след и здесь заданные параметры, которые в настоящее время набор

набор QUOTED_IDENTIFIER на набор ARITHABORT от набор numeric_roundabort от набор ANSI_WARNINGS на набор ANSI_PADDING на набор ANSI_NULLS на множестве CONCAT_NULL_YIELDS_NULL на набор CURSOR_CLOSE_ON_COMMIT от набор implicit_transactions от заданного языка us_english набор DateFormat MDY набор DATEFIRST 7 установленный уровень изоляции транзакций чтения совершено

Я пошел и добавил, что в запросе, который я генерируемой в студии управления и по-прежнему бежал в менее чем за секунду. Я даже скопировал запрос точно так же, как в трассировке.

exec sp_executesql N'SELECT * FROM [dbo].[vwUnloadedJobDetailsWithData] WHERE JobID = @JobId',N'@JobId int',@JobId=36963 

, и это еще меньше, чем второе время возврата. Я очень смущен.

Спасибо, Джош

+0

Похоже, что вы не закрываете свои подключения к db, но сложно точно знать, что происходит, потому что вы не делили код C#. –

+0

Извините, у меня мало кода для обмена ..... насколько они закрыты, они определенно закрываются. Я отправлю свой запрос и обработку соединения вокруг этого запроса, если вы считаете, что это поможет. – joshlrogers

ответ

0

скорее всего scenarion, почему это будет происходить разница в настройках SET между SSMS и ADO.NET. эта разница вызывает (повторное) построение планов выполнения, которые могут оказаться не оптимальными.

+0

Я добавил параметры набора, вы видите что-нибудь, что вызывает какие-либо идеи? – joshlrogers

0

Хорошо, я не смог найти решение, которое позволило бы мне использовать набор данных, поэтому я прямо пошел на использование SqlDataAdapter в коде вместо использования автоматически созданных табличных адаптеров.

В соответствии с трассировкой он выполняет тот же запрос, но до сих пор он работает. Это может произойти не через два дня, но пока это работает.

0

Просто пытайтесь думать громко: Возможно, существует блокировка, вызванная другим процессом/человеком? Есть ли кто-нибудь, кто обновляет одну и ту же строку одновременно? Есть ли кто-нибудь, кто открывает таблицу из студии управления или Query Analyzer с помощью функции «Открыть таблицу» и играет с фильтрами? Попробуйте посмотреть на замки с помощью sp_who2

0

Некоторых мыслей:

То, что я назвал бы параметр нюхаю для хранимой процедуры. Попробуйте OPTION (RECOMPILE) намек, поэтому отправленная SQL выглядит следующим образом:

exec sp_executesql 
    N'SELECT * 
     FROM [dbo].[vwUnloadedJobDetailsWithData] 
     WHERE JobID = @JobId 
     OPTION (RECOMPILE)', 
    N'@JobId int', 
    @JobId=36963 

Объяснение: Когда план запроса производится и в кэше, может быть плохим, атипичная значение. Say JobID обычно очень избирательный, но для этого одного исполнения это не так. Когда вы выполняете запрос, следующий план кэшированного плана неверен для следующего выборочного JobId. План будет перекомпилирован по разным причинам, но значение перекомпиляции имеет значение.

В противном случае, каков точный тип данных Jobid? Если это smallint, то столбец будет преобразован в int в параметризованном запросе. При использовании константы она будет маленькой. Убедитесь, что тип определен правильно: это имеет значение в коде SQL.

Смежные вопросы