Sto tentando di eseguire una query da ADO.NET utilizzando SQL Server 2008R2. Sto usando un CTE per fornire il paging e l'aggiunta di parametri per @Offset
e @Limit
, che sono entrambi interi.Timeout ADO.NET ma funziona correttamente in SSMS
Sto costruendo una query parametrizzata in base agli input dell'utente. Il risultato finale è questo:
;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)
sto usando pochi, come le clausole che è il motivo per cui ho OPTION RECOMPILE
. Se io dichiaro i parametri tramite SSMS e correre in questo modo:
declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;
ricevo un tempo di risposta molto rapido (meno di 1s). Se provo questo con ADO.NET, tuttavia, ci vorrà per sempre. Ho provato ad aggiungere i parametri con entrambi questi:
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
Se ci sono solo un paio di righe restituite dalla prima query e anche se ho cadere il filtraggio @Offset
e @Limit
, ottengo un tempo di risposta decente. C'è un modo per accelerare l'utilizzo di e?
EDIT: sto passando nel parametro @postcode
(che è una stringa in .NET tramite questo:
cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)
@close voter. Questo non è un dupe. La domanda precedente riguardava la spiegazione di comportamenti diversi con variabili e parametri. I due sono trattati in modo diverso da SQL Server. –
Puoi mostrare il codice in cui passi nel parametro '@ postcode'? –
È sicuramente il timeout SQL? Non c'è alcuna possibilità che il suo timeout provi a ottenere una connessione (ad esempio perché hai ancora un sacco di connessioni aperte quando lo fai) o qualcos'altro? – Chris