Тайм-аут ADO.NET, но отлично работает в SSMS

Я пытаюсь выполнить запрос из ADO.NET, используя SQL Server 2008R2. Я использую CTE для разбиения по страницам и добавления параметров для @Offset и @Limit , которые являются целыми числами.

Я создаю параметризованный запрос в зависимости от ввода данных пользователем. Окончательный результат таков:

;WITH Results_CTE AS (
    SELECT  ld.* , ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum  
    FROM list..List_Data ld 
    WHERE VALUE_2010 IS NOT NULL  
    AND  Postcode LIKE @Postcode + '%' 
) SELECT * FROM Results_CTE 
    WHERE RowNum > @Offset AND RowNum < @Offset + @Limit 
OPTION (RECOMPILE) 

Я использую несколько подобных предложений, поэтому у меня есть OPTION RECOMPILE . Если я объявляю параметры через SSMS и выполняю его так:

declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;

я получаю очень быстрое время ответа (менее 1 с). Однако, если я попробую это сделать с ADO.NET, это займет вечность. Я попытался добавить параметры с обоими из них:

cmd.Parameters.AddWithValue("@Offset", startRowIndex) // times out
cmd.Parameters.AddWithValue("@Limit", limit)

cmd.Parameters.Add(New SqlParameter("@Offset", SqlDbType.BigInt)) // also times out
cmd.Parameters.Item("@Offset").Value = startRowIndex
cmd.Parameters.Add(New SqlParameter("@Limit", SqlDbType.BigInt))
cmd.Parameters.Item("@Limit").Value = limit

Если есть только несколько строк, возвращенных первым запросом, но я отбрасываю фильтрацию @Offset и @Limit , Я получаю приличное время отклика. Есть ли способ ускорить это и с помощью разбиения на страницы?

РЕДАКТИРОВАТЬ: я передаю параметр @postcode (который в .NET является строкой через это:

cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)
5
задан Echilon 24 October 2011 в 12:22
поделиться