voy a salir en un miembro aquí y se supone que tiene una gran cantidad de filas donde ID = 1.
Si no se , por favor corrigeme.
Una posible razón de que SQL Server está procesando su consulta lenta es que se ve en la consulta y se va:
hmm, me pregunto lo que va a pasar para ese parámetro.
¿va a ser 1? donde tengo alrededor de un montón de filas?
o tal vez 1742, en la que tengo sólo 3
Sólo que no sé, lo mejor hacer un recorrido de tabla para asegurarse de producir un plan de ejecución que cubrirá todas mis bases
Si una columna, o un conjunto de columnas, tiene baja selectividad (es decir, el número de valores únicos es mucho menor que el número de filas), SQL Server algunas veces revertirá a un tablescan o similar, solo para obtener todas las filas de manera determinista.
Al menos esa ha sido mi experiencia. En particular, he visto el mismo comportamiento cuando selecciono el rango de fechas en tablas con datos de tiempo determinado, haciendo un WHERE dt <= @dt AND dt >= @dt
para obtener todas las filas donde @dt está dentro de un período de tiempo en esa fila, revierte a un escaneo de tabla, y luego, cuando coloco la fecha real en el SQL como literal, se ejecuta mucho más rápido.
El problema aquí es la selectividad, SQL Server no sabe cómo atender mejor todos los escenarios al construir un plan de ejecución para su declaración, por lo que tratará de adivinar.
Intente agregar una sugerencia de consulta para especificar valor típico de para el parámetro, es decir.:
sp_executesql "select * from tablesView where Id = @Id option (optimize for (@id = 1742))", N"@Id int", @Id=1
¿Tiene una gran cantidad de filas con el ID = 1? –
@Lasse, incluso si tengo 50 registros, la diferencia es enorme. al igual que 0 segundos frente a 10 segundos, una cosa es seleccionar * de la tabla, generalmente es una vista con muchas combinaciones. – WhoIsNinja
¿Cuál es el tipo de datos pasado para '@ id'? Puede tener un yeso implícito impidiendo el uso de un índice. –