Estoy seleccionando algunas filas de una función con valores de tabla pero he encontrado una inexplicable diferencia de rendimiento masivo al colocar SELECCIONAR SUPERIOR en la consulta.Diferencia de rendimiento masivo SQL usando SELECCIONAR SUPERIOR x incluso cuando x es mucho más alto que las filas seleccionadas
SELECT col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
tarda más de 5 o 6 minutos en completarse.
Sin embargo
SELECT TOP 6000 col1, col2, col3 etc
FROM dbo.some_table_function
WHERE col1 = @parameter
--ORDER BY col1
completa en aproximadamente 4 o 5 segundos.
Esto no me sorprendería si el conjunto de datos devueltos fuera enorme, pero la consulta en particular implicó devuelve ~ 5000 filas de 200,000.
Por lo tanto, en ambos casos, toda la tabla se procesa, ya que SQL Server continúa hasta el final en busca de 6000 filas que nunca alcanzará. ¿Por qué la diferencia masiva entonces? ¿Esto tiene algo que ver con la forma en que SQL Server asigna espacio en anticipación del tamaño del conjunto de resultados (el TOP 6000 por lo tanto le da un requisito bajo que se asigna más fácilmente en la memoria)? ¿Alguien más ha sido testigo de algo como esto?
Gracias
¿Has mirado los planes de consulta? ¿Hay una diferencia? –
Simplemente curioso, ¿qué pasa con el rendimiento si dices SELECCIONAR EL 100 POR CIENTO ...? –
Supongo que tiene algunas estadísticas que arrojan el optimizador de consultas fuera de kelter. El optimizador puede, por ejemplo, decidir utilizar un escaneo de tabla en lugar de una búsqueda de índice si cree que hay muy pocas filas en una tabla. Por qué esto no afecta la consulta SUPERIOR que no sé, pero examine los planes de ejecución. Estos le muestran lo que hace el servidor, y eso explicará por qué uno es lento. También le mostrará el número estimado y real de filas. Si algunas estimaciones están lejos, actualice las estadísticas y vuelva a intentarlo. :) –