Próbuję uruchomić kwerendę z ADO.NET przy użyciu SQL Server 2008R2. Używam CTE, aby zapewnić stronicowanie i dodawanie parametrów dla @Offset
i @Limit
, które są obie liczby całkowite.Limit czasu ADO.NET ale działa poprawnie w SSMS
Buduję sparametryzowane zapytanie w zależności od danych wejściowych użytkownika. Wyjście końcowe to:
;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)
Używam kilka jak klauzul, dlatego mam OPTION RECOMPILE
. Jeśli oświadczam parametrów za pośrednictwem SSMS i uruchomić tak:
declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;
uzyskać bardzo szybki czas reakcji (mniej niż 1 s). Jeśli jednak spróbuję tego z ADO.NET, zajmie to na zawsze. Próbowałem dodając parametry z obu z nich:
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
Jeśli istnieją tylko kilka wierszy zwracanych przez pierwszego zapytania choć i upuść filtrowanie @Offset
i @Limit
, ja dostać przyzwoity czas reakcji. Czy jest jakiś sposób, aby przyspieszyć ten proces przy użyciu stronicowania?
EDIT: Jestem przekazując w parametrze @postcode
(który jest ciągiem w .NET poprzez to:
cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)
@ Zamknij wyborcę. To nie jest dupe. Poprzednie pytanie dotyczyło wyjaśniania różnych zachowań za pomocą zmiennych, a nie parametrów. Oba są traktowane inaczej przez SQL Server. –
Czy możesz pokazać kod, w którym przekazujesz parametr '@ postcode'? –
Czy to na pewno limit czasu SQL? Nie ma żadnej możliwości, aby jego limit czasu próbował nawiązać połączenie (np. Ponieważ masz wiele połączeń otwartych wciąż, gdy to robisz) lub coś podobnego? – Chris