Почему я получаю сообщение об ошибке «Истекло время ожидания» при выполнении этого запроса? - PullRequest
0 голосов
/ 03 мая 2009

Я выполняю этот запрос на SQL Server 2008 с использованием ODBC. Если я удалю последнюю часть (ИЛИ li.DATEGENERATED> = (...))), я не получу сообщение об ошибке ... но могу запустить ее в SSMS.

SELECT COUNT(*) FROM dbo.POITEMST li
 WHERE (? IS NULL OR li.DATEGENERATED >= ?)
   AND (? IS NULL OR (li.DATEGENERATED >= (
    SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?)))

Вот как я настраиваю параметры

DbParameter startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);

startDateParam = cmd.CreateParameter();
startDateParam.ParameterName = "StartDate";
startDateParam.Value = (StartDate.HasValue ? (object)StartDate.Value : (object)(new DateTime(1753, 2, 2)));
cmd.Parameters.Add(startDateParam);

DbParameter startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);

startPoParam = cmd.CreateParameter();
startPoParam.ParameterName = "StartPO";
startPoParam.DbType = DbType.String;
startPoParam.Value = (string.IsNullOrEmpty(StartPurchaseOrder) ? (object)DBNull.Value : (object)StartPurchaseOrder);
cmd.Parameters.Add(startPoParam);

РЕДАКТИРОВАТЬ: эти даты только там, потому что я пытался выяснить это ... он проходил в DBNull раньше, если не было даты начала.

Ответы [ 4 ]

1 голос
/ 19 мая 2009

Разделяй и властвуй. Начните с T-SQL с жестко заданными значениями, как NULL, так и ненулевыми. Начните с самого простого запроса и постройте, проверяя план запроса на каждом шаге. Вы можете обнаружить, что у вас проблемы с индексированием и т. Д. Устраните это, а затем вернитесь к коду.

Действительно сложно много помочь с простым запросом без дополнительной информации о схеме - макеты таблиц, индексы и т. Д.

0 голосов
/ 07 сентября 2009

Выполните следующие действия:

  1. Рефакторинг запроса
  2. Превратить в хранимую процедуру
  3. Создание индексов по соответствующим столбцам

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

0 голосов
/ 19 мая 2009

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

SELECT COUNT(*) FROM dbo.POITEMST li
WHERE li.DATEGENERATED >= ISNULL(?,'1753-02-02')
AND li.DATEGENERATED >= ISNULL((SELECT MAX(t.DATEGENERATED) FROM dbo.POITEMST t WHERE t.PONUM = ?), '1753-02-02')

Объединение сравнения с нулем с ИЛИ выглядит как часть проблемы.

Надеюсь, это поможет,

Bill

0 голосов
/ 03 мая 2009

Сколько времени потребовалось для запуска в ssms? Если вы можете выполнить запрос с включенным планом выполнения (меню запросов, план выполнения - не предполагаемый.) Если есть проблема с индексом, это должно сообщить вам на панели плана выполнения.

Можете ли вы или ваш dba запустить SQL profiler; и захватите то, что фактически передается на сервер sql, чтобы подтвердить, что оно соответствует ожидаемому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...