Saltar al contenido

¿Por qué ORDER BY no pertenece a una Vista?

Después de de esta larga selección de información pudimos resolver este apuro que suelen tener ciertos de nuestros usuarios. Te regalamos la solución y esperamos servirte de gran apoyo.

Solución:

(Vistas indexadas a un lado, por supuesto).

Una vista no se materializa: los datos no se almacenan, entonces, ¿cómo podrían ordenarse? Una vista es como un procedimiento almacenado que solo contiene un SELECT sin parámetros… no contiene datos, solo contiene la definición de la consulta. Dado que las diferentes referencias a la vista pueden necesitar datos ordenados de diferentes maneras, la forma en que hace esto, al igual que seleccionar de una tabla, que también es una colección de filas sin ordenar, por definición, es incluir el orden en la consulta externa .

También para dar una pequeña idea de la historia. Tú podrías nunca poner ORDER BY en una vista, sin incluir también TOP. Y en este caso el ORDER BY dictó qué filas fueron incluidas por TOP, no cómo se presentarían. Dio la casualidad de que en SQL Server 2000, si TOP era 100 PERCENT o some number >= number of rows in the table, el optimizador era bastante simplista y terminó produciendo un plan con una ordenación que coincidía con el TOP/ORDER BY. Pero este comportamiento fue nunca garantizado o documentado: solo se basó en la observación, lo cual es un mal hábito. Cuando salió SQL Server 2005, este comportamiento comenzó a “romperse” debido a los cambios en el optimizador que llevaron a que se usaran diferentes planes y operadores, entre otras cosas, el TOP / ORDER BY sería ignorado por completo si fuera TOP 100 PERCENT. Algunos clientes se quejaron tanto de esto que Microsoft emitió un indicador de seguimiento para restablecer el comportamiento anterior. No voy a decirle cuál es la bandera porque no quiero que la use y quiero asegurarme de que la intención sea correcta; si desea un orden de clasificación predecible, use ORDER BY en la consulta externa.

Para resumir y también para aclarar un punto que hiciste: Microsoft no lo hizo retirar cualquier cosa. Mejoraron el producto y, como efecto secundario, este comportamiento indocumentado y no garantizado se volvió menos confiable. En general, creo que el producto es mejor por ello.

Si se permitió ordenar una vista, ¿cuál debería ser el orden del resultado aquí?

CREATE VIEW dbo.V1
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number ASC

GO

CREATE VIEW dbo.V2
AS
  SELECT number
  FROM   SomeTable
  ORDER  BY number DESC

GO

SELECT *
FROM   dbo.V1
       JOIN dbo.V2
         ON V1.number = V2.number 

una posibilidad es evitar clasificaciones conflictivas: si la vista se clasifica por un orden y la selección en esa vista se clasifica por otro orden (sin conocer la clasificación de la vista), puede haber un impacto en el rendimiento. Por lo tanto, es más seguro dejar el requisito de clasificación al usuario.

otra razón, la clasificación tiene un costo de rendimiento, entonces, ¿por qué penalizar a todos los usuarios de la vista, cuando solo algunos usuarios necesitan la clasificación?

Aquí tienes las comentarios y calificaciones

Tienes la posibilidad mostrar este escrito si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *