Я пытаюсь выполнить запрос из 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)