sentencia - select top sql server ejemplos
¿Por qué usar Select Top 100 Percent? (9)
Entiendo que antes de SQL Server 2005 , podría "engañar" a SQL Server para permitir el uso de una orden en una definición de vista, también incluir TOP 100 PERCENT
en la cláusula SELECT . Pero he visto otro código que heredé que usa SELECT TOP 100 PERCENT
... dentro de sentencias de SQL dinámico (utilizado en ADO en aplicaciones ASP.NET , etc.). Hay alguna razón para esto? ¿No es el resultado lo mismo que no incluir el TOP 100 PERCENT
?
... permite el uso de un ORDER BY en una definición de vista.
Esa no es una buena idea. Una vista nunca debe tener un ORDER BY definido.
Una ORDEN POR tiene un impacto en el rendimiento. Usar una vista significa que la ORDEN POR aparecerá en el plan de explicación. Si tiene una consulta donde la vista se une a cualquier cosa en la consulta inmediata, o se hace referencia en una vista en línea (CTE / factorización de subconsulta), ORDER BY siempre se ejecuta antes de la final ORDER BY (suponiendo que se haya definido). No es beneficioso ordenar filas que no sean el resultado final establecido cuando la consulta no utiliza TOP (o LIMIT para MySQL / Postgres).
Considerar:
CREATE VIEW my_view AS
SELECT i.item_id,
i.item_description,
it.item_type_description
FROM ITEMS i
JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
ORDER BY i.item_description
...
SELECT t.item_id,
t.item_description,
t.item_type_description
FROM my_view t
ORDER BY t.item_type_description
... es el equivalente a usar:
SELECT t.item_id,
t.item_description,
t.item_type_description
FROM (SELECT i.item_id,
i.item_description,
it.item_type_description
FROM ITEMS i
JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
ORDER BY i.item_description) t
ORDER BY t.item_type_description
Esto es malo porque:
- El ejemplo es ordenar la lista inicialmente por la descripción del artículo, y luego se reordena según la descripción del tipo de artículo. Se trata de recursos desperdiciados en el primer orden: ejecutar como es no significa que se esté ejecutando:
ORDER BY item_type_description, item_description
- No es obvio por qué se ordena la vista debido a la encapsulación. Esto no significa que deba crear vistas múltiples con diferentes órdenes de clasificación ...
He visto otro código que he heredado que usa SELECT TOP 100 PERCENT
La razón de esto es simple: Enterprise Manager solía tratar de ser útil y formatear su código para incluir esto para usted. No tenía sentido tratar de eliminarlo, ya que realmente no dolía nada y la próxima vez que fueras a cambiarlo, EM lo insertaría nuevamente.
Fue utilizado para " materialización intermedia (búsqueda de Google) "
Buen artículo: Adam Machanic: Explorando los secretos de la materialización intermedia
Incluso creó un MS Connect para que pueda hacerse de una manera más limpia
Mi punto de vista es "no intrínsecamente malo", pero no lo use a menos que esté 100% seguro. El problema es que funciona solo en el momento en que lo haces y probablemente no más tarde (nivel de parche, esquema, índice, recuentos de filas, etc.) ...
Ejemplo trabajado
Esto puede fallar porque no sabes en qué orden se evalúan las cosas
SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100
Y esto también puede fallar porque
SELECT foo
FROM
(SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar
WHERE
CAST(foo AS int) > 100
Sin embargo, esto no ocurrió en SQL Server 2000. La consulta interna se evalúa y se almacena en la cola de impresión:
SELECT foo
FROM
(SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar
WHERE
CAST(foo AS int) > 100
Tenga en cuenta que esto todavía funciona en SQL Server 2005
SELECT TOP 2000000000 ... ORDER BY...
No hay razón más que indiferencia, supongo.
Tales cadenas de consulta generalmente se generan mediante una herramienta de consulta gráfica. El usuario se une a algunas tablas, agrega un filtro, un orden de clasificación y prueba los resultados. Dado que el usuario puede querer guardar la consulta como una vista, la herramienta agrega un TOP 100 PERCENT. En este caso, sin embargo, el usuario copia el SQL en su código, parametriza la cláusula WHERE y lo oculta todo en una capa de acceso a datos. Fuera de la vista, fuera de la vista.
Por favor, intente lo siguiente, espero que funcione para usted.
SELECT TOP
( SELECT COUNT(foo)
From MyTable
WHERE ISNUMERIC (foo) = 1) *
FROM bar WITH(NOLOCK)
ORDER BY foo
WHERE CAST(foo AS int) > 100
)
Si no hay una cláusula ORDER BY
, entonces TOP 100 PERCENT
es redundante. (Como mencionas, este fue el ''truco'' con vistas)
[Esperemos que el optimizador optimice esto.]
Solo prueba esto, lo explica más o menos en sí mismo. No puede crear una vista con un ORDER BY, excepto si ...
CREATE VIEW v_Test
AS
SELECT name
FROM sysobjects
ORDER BY name
GO
Msg 1033, nivel 15, estado 1, procedimiento TestView, línea 5 La cláusula ORDER BY no es válida en vistas, funciones en línea, tablas derivadas, subconsultas y expresiones de tablas comunes, a menos que también se especifique TOP, OFFSET o FOR XML.
Supongo que puede usar una variable en el resultado, pero aparte de obtener la pieza ORDER BY en una vista, no verá un beneficio indicando implícitamente "TOP 100 PERCENT":
declare @t int
set @t=100
select top (@t) percent * from tableOf
TOP (100) PERCENT no tiene ningún sentido en las versiones recientes de SQL Server y el procesador de consultas lo ignora (junto con el ORDER BY correspondiente, en el caso de una definición de vista o una tabla derivada).
Estás en lo cierto de que alguna vez se podía usar como un truco, pero incluso entonces no era confiable. Lamentablemente, algunas de las herramientas gráficas de Microsoft ponen esta cláusula sin sentido.
En cuanto a por qué esto podría aparecer en SQL dinámico, no tengo idea. Tiene razón en que no hay ninguna razón para ello, y el resultado es el mismo sin él (y nuevamente, en el caso de una definición de vista o una tabla derivada, sin las cláusulas TOP y ORDER BY).