Я пытаюсь выполнить запрос из 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
, я получаю приличное время ответа. Есть ли способ, которым я могу ускорить это и использовать пейджинг?
EDIT: я передаю параметр @postcode
(который является строкой в .NET через это:
cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)