2011-10-24 10 views
5

Estoy intentando ejecutar una consulta desde ADO.NET utilizando SQL Server 2008R2. Estoy usando un CTE para proporcionar paginación y agregar parámetros para @Offset y @Limit, que son ambos enteros.Tiempo de espera ADO.NET pero funciona bien en SSMS

Estoy construyendo una consulta parametrizada en función de las entradas del usuario. El resultado final es la siguiente:

;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) 

estoy usando unos pocos como cláusulas que es por eso que tengo OPTION RECOMPILE. Si Declaro los parámetros a través de SSMS y correr así:

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

consigo un tiempo de respuesta muy rápida (menos de 1 segundo). Si intento esto con ADO.NET, sin embargo, lleva una eternidad. He intentado añadir los parámetros con los dos siguientes:

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 

Si sólo hay unas pocas filas devueltas por la primera consulta y aunque me cae el filtrado @Offset y @Limit, consigo un tiempo de respuesta decente. ¿Hay alguna manera de acelerar esto? y ¿usar paginación?

EDIT: Estoy de paso en el parámetro @postcode (que es una cadena de .NET a través de este:

cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode) 
+0

@close voter. Esto no es un engaño. La pregunta anterior trataba sobre la explicación de diferentes comportamientos con variables, no con parámetros. Los dos son tratados de forma diferente por SQL Server. –

+0

¿Puedes mostrar el código donde pasas en el parámetro '@ postcode'? –

+0

¿Definitivamente es el tiempo de espera de SQL? No hay posibilidad de que se agote el tiempo tratando de obtener una conexión (por ejemplo, porque tienes un montón de conexiones abiertas cuando haces esto) o cualquier otra cosa así? – Chris

Respuesta

7

Su código ADO.NET está pasando en un parámetro de a different datatype que el que se está probando en SSMS y que está recibiendo problemas implícitos elenco.

no utilice

cmd.Parameters.AddWithValue("@postcode", normalizedPostcode) 

ya que esto creará automáticamente una nvarchar parámetro y obtendrás conversiones implícitas en tu plan de ejecución, lo que significa que no se puede usar un índice. En su lugar, pase un parámetro creado explícitamente del tipo varchar.

cmd.Parameters.Add("@postcode", SqlDbType.Varchar, 10) 
+0

Excelente consejo. Al ajustar exactamente los parámetros en .NET al DBType se obtiene una respuesta más o menos instantánea. – Echilon

2

1) Para @postcode parámetro please specify the length.

cmd.Parameters.Add("@postcode", SqlDbType.VarChar, 10).Value = str

2) Vuelva a escribir la consulta:

;WITH Results_CTE AS (
    SELECT ld.Key_Field, 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 a 
INNER JOIN list..List_Data b ON a.Key_Field = Key_Field 
WHERE RowNum > @Offset AND RowNum < @Offset + @Limit 
--OPTION (RECOMPILE) 

Nota 1: Asumo que Key_Field es clave primaria (cluster) para List_Data mesa.

Nota 2: Compruebe si tiene un índice en VALUE_2010 y campos de código postal. Si tiene SQL 2008+, puede crear un índice filtrado:

--UNIQUE if Postcode has unique values for VALUE_2010 IS NOT NULL 
CREATE [UNIQUE] INDEX aaa 
ON MySchema.List_Data (Postcode) 
WHERE VALUE_2010 IS NOT NULL 
+0

Esto parece mejorar la velocidad unos pocos milisegundos, pero varía. No puedo lastimar por si acaso. – Echilon

Cuestiones relacionadas