rowcount y top

17/09/2003 - 09:43 por Alberto | Informe spam
¿Cuál es la diferencia entre las instrucciones RowCount y Top?

Gracias

Preguntas similare

Leer las respuestas

#1 Rubén Vigón
17/09/2003 - 10:11 | Informe spam
[...] SET ROWCOUNT difiere de TOP en estos aspectos:

- El límite SET ROWCOUNT se aplica a la construcción de filas del conjunto de resultados después de
que se evalúe una instrucción ORDER BY. Cuando se especifica ORDER BY, la instrucción SELECT se
termina cuando se hayan seleccionado n filas de un conjunto de valores que se han ordenado según la
clasificación ORDER BY especificada

- La cláusula TOP se aplica a la instrucción SELECT individual en la que se ha especificado. SET
ROWCOUNT permanece activada hasta que se ejecuta otra instrucción SET ROWCOUNT, como, por ejemplo,
SET ROWCOUNT 0 para desactivar la opción

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic
Respuesta Responder a este mensaje
#2 Mariano Alvarez
18/09/2003 - 05:23 | Informe spam
No estoy de acuerdo, (pero mira mi conclusion)

Set rowcount le indica al motor cuantas filas te debe devolver de resultado
o cuantas filas debe afectar en la operacion por lo que el motor luego de
procesar esa cantidad de filas corta y no sigue la instruccion con el resto
de las filas y puede causarte ciertos problemas por ejemplo si tienes
triggers ya que sigue rigiendo el set rowcount. Sin embargo si tienes una
clausula order by se aplica despues del ORDER BY al contrario de lo que dice
la documentacion (que tengo a mano en este momento y es del SQL 7.0 en
ingles) por lo que te devuelve las ultimas filas o las primeras ordenadas
por el campo del ORDER BY

El TOP solo sirve para el SELECT en el cual participa y es practicamente la
misma semantica.

Esto es lo que dice el manual en ingles

"The SET ROWCOUNT limit applies to building the rows in the result set
before an ORDER BY is evaluated. Even if ORDER BY is specified, the SELECT
statement is terminated when n rows have been selected. n rows are selected,
then ordered and returned to the client"

Lo que traducido mas o menos seria:

"El limite SET ROWCOUNT se aplica a la construccion de filas en el conjunto
resultado antes de que un ORDER BY sea evaluado. Incluso, si se especifica
un ORDER BY, la expresion SELECT es terminada cuando han sido seleccionadas
n filas, n filas son seleccionadas, entonces ordenadas y devueltas al
cliente"

Te paso un ejemplo sobre northwind que contradice esto, sobre una columna no
indexada para evitar la posibilidad de que el planificador elija otro plan
si se hace un order by.

Si realizas la prueba del set rowcount con el order by indicado mas abajo
podras comprobar lo que te digo.

Si activas el SET SHOWPLAN_ALL ON en lugar del SET SHOWPLAN_TEXT ON veras
que el plan es el siguiente y que ambos operadores tienen un "EstimateRows"
= 830

Con Set rowcount

StmtText
-
-
|--Sort(ORDER BY:([Orders].[ShipName] ASC))
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))


Con TOP

|--Top(2)
|--Sort(ORDER BY:([Orders].[ShipName] ASC))
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))


El plan usa [Northwind].[dbo].[Orders].[PK_Orders] por que es el indice
clustered.

Tambien lo puedes comprobar si lo ejecutas, ya que veras que te vienen las
dos primeras de TODA LA TABLA ORDENADA.
No hace lo que dice el manual porque no tiene forma de seleccionar las dos
filas ordenadas por el campo "ShipName", a menos que primero ordene toda la
tabla porque "ShipName" no participa de ningun indice.

Ademas es el mismo resultado que usando un TOP

Este deberia ser el resultado si no colocas ORDER BY y esos son precisamente
los datos que deberia ordenar si hace lo que dice el manual.

/*--
select top 2 ShipName from orders
go
ShipName
-
Vins et alcools Chevalier
Toms Spezialitàten


Con TOP ordena y luego aplica el TOP

/*--
select top 2 ShipName from orders order by ShipName
ShipName
-
Alfreds Futterkiste
Alfred's Futterkiste

(2 row(s) affected)


Con Set Rowcount hace lo mismo y contradice el manual !!!!!!!!!!!!!!

/*--
Set rowcount 2
go
select ShipName from orders order by ShipName
ShipName
-
Alfreds Futterkiste
Alfred's Futterkiste

(2 row(s) affected)



CONCLUSION

Aunque no hace lo que dice, en mi humilde opinion, no debes confiarte que lo
que yo digo que hace es lo que siempre va a hacer, ya que no esta
documentado asi. Por lo tanto, mi sugerencia es "NO USAR" SET ROWCOUT y
ORDER BY juntos.



Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Rubén Vigón" wrote in message
news:
[...] SET ROWCOUNT difiere de TOP en estos aspectos:

- El límite SET ROWCOUNT se aplica a la construcción de filas del conjunto


de resultados después de
que se evalúe una instrucción ORDER BY. Cuando se especifica ORDER BY, la


instrucción SELECT se
termina cuando se hayan seleccionado n filas de un conjunto de valores que


se han ordenado según la
clasificación ORDER BY especificada

- La cláusula TOP se aplica a la instrucción SELECT individual en la que


se ha especificado. SET
ROWCOUNT permanece activada hasta que se ejecuta otra instrucción SET


ROWCOUNT, como, por ejemplo,
SET ROWCOUNT 0 para desactivar la opción

Un saludo!

Rubén Vigón
Microsoft MVP Visual Basic


Respuesta Responder a este mensaje
#3 Mariano Alvarez
18/09/2003 - 05:40 | Informe spam
Perdon, si esta documentado.

http://support.microsoft.com/defaul...?scid=http://support.microsoft.com:80/support/kb/articles/Q266/3/32.ASP&NoWebContent=1


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Mariano Alvarez" wrote in message
news:
No estoy de acuerdo, (pero mira mi conclusion)

Set rowcount le indica al motor cuantas filas te debe devolver de


resultado
o cuantas filas debe afectar en la operacion por lo que el motor luego de
procesar esa cantidad de filas corta y no sigue la instruccion con el


resto
de las filas y puede causarte ciertos problemas por ejemplo si tienes
triggers ya que sigue rigiendo el set rowcount. Sin embargo si tienes una
clausula order by se aplica despues del ORDER BY al contrario de lo que


dice
la documentacion (que tengo a mano en este momento y es del SQL 7.0 en
ingles) por lo que te devuelve las ultimas filas o las primeras ordenadas
por el campo del ORDER BY

El TOP solo sirve para el SELECT en el cual participa y es practicamente


la
misma semantica.

Esto es lo que dice el manual en ingles

"The SET ROWCOUNT limit applies to building the rows in the result set
before an ORDER BY is evaluated. Even if ORDER BY is specified, the SELECT
statement is terminated when n rows have been selected. n rows are


selected,
then ordered and returned to the client"

Lo que traducido mas o menos seria:

"El limite SET ROWCOUNT se aplica a la construccion de filas en el


conjunto
resultado antes de que un ORDER BY sea evaluado. Incluso, si se especifica
un ORDER BY, la expresion SELECT es terminada cuando han sido


seleccionadas
n filas, n filas son seleccionadas, entonces ordenadas y devueltas al
cliente"

Te paso un ejemplo sobre northwind que contradice esto, sobre una columna


no
indexada para evitar la posibilidad de que el planificador elija otro plan
si se hace un order by.

Si realizas la prueba del set rowcount con el order by indicado mas abajo
podras comprobar lo que te digo.

Si activas el SET SHOWPLAN_ALL ON en lugar del SET SHOWPLAN_TEXT ON veras
que el plan es el siguiente y que ambos operadores tienen un


"EstimateRows"
= 830

Con Set rowcount

StmtText
-
|--Sort(ORDER BY:([Orders].[ShipName] ASC))
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))


Con TOP

|--Top(2)
|--Sort(ORDER BY:([Orders].[ShipName] ASC))
|--Clustered Index
Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))


El plan usa [Northwind].[dbo].[Orders].[PK_Orders] por que es el indice
clustered.

Tambien lo puedes comprobar si lo ejecutas, ya que veras que te vienen las
dos primeras de TODA LA TABLA ORDENADA.
No hace lo que dice el manual porque no tiene forma de seleccionar las dos
filas ordenadas por el campo "ShipName", a menos que primero ordene toda


la
tabla porque "ShipName" no participa de ningun indice.

Ademas es el mismo resultado que usando un TOP

Este deberia ser el resultado si no colocas ORDER BY y esos son


precisamente
los datos que deberia ordenar si hace lo que dice el manual.

/*--
select top 2 ShipName from orders
go
ShipName
-
Vins et alcools Chevalier
Toms Spezialitàten


Con TOP ordena y luego aplica el TOP

/*--
select top 2 ShipName from orders order by ShipName
ShipName
-
Alfreds Futterkiste
Alfred's Futterkiste

(2 row(s) affected)


Con Set Rowcount hace lo mismo y contradice el manual !!!!!!!!!!!!!!

/*--
Set rowcount 2
go
select ShipName from orders order by ShipName
ShipName
-
Alfreds Futterkiste
Alfred's Futterkiste

(2 row(s) affected)



CONCLUSION

Aunque no hace lo que dice, en mi humilde opinion, no debes confiarte que


lo
que yo digo que hace es lo que siempre va a hacer, ya que no esta
documentado asi. Por lo tanto, mi sugerencia es "NO USAR" SET ROWCOUT y
ORDER BY juntos.



Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Rubén Vigón" wrote in message
news:
> [...] SET ROWCOUNT difiere de TOP en estos aspectos:
>
> - El límite SET ROWCOUNT se aplica a la construcción de filas del


conjunto
de resultados después de
> que se evalúe una instrucción ORDER BY. Cuando se especifica ORDER BY,


la
instrucción SELECT se
> termina cuando se hayan seleccionado n filas de un conjunto de valores


que
se han ordenado según la
> clasificación ORDER BY especificada
>
> - La cláusula TOP se aplica a la instrucción SELECT individual en la que
se ha especificado. SET
> ROWCOUNT permanece activada hasta que se ejecuta otra instrucción SET
ROWCOUNT, como, por ejemplo,
> SET ROWCOUNT 0 para desactivar la opción
>
> Un saludo!
>
> Rubén Vigón
> Microsoft MVP Visual Basic
>
>


Respuesta Responder a este mensaje
#4 Miguel Egea
19/09/2003 - 14:23 | Informe spam
Además de esa diferencia, la más importante es que rowcount no es
recomendada como dicen los books on line en observaciones
/*
Es recomendable que las instrucciones DELETE, INSERT y UPDATE que
actualmente utilizan SET ROWCOUNT se vuelvan a escribir con la sintaxis TOP.
*/
lo que da idea de que quizá sea descontinuada proximamente.


Saludos Cordiales
=Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.

¡Cuida el rendimiento! Evita los cursores
Brigada Anti-Cursores
==

"Mariano Alvarez" escribió en el mensaje
news:#
Perdon, si esta documentado.




http://support.microsoft.com/defaul...?scid=http://support.microsoft.com:
80/support/kb/articles/Q266/3/32.ASP&NoWebContent=1


Jose Mariano Alvarez
Comunidad de base de datos
Grupo de Usuarios Microsoft
www.mug.org.ar


"Mariano Alvarez" wrote in message
news:
> No estoy de acuerdo, (pero mira mi conclusion)
>
> Set rowcount le indica al motor cuantas filas te debe devolver de
resultado
> o cuantas filas debe afectar en la operacion por lo que el motor luego


de
> procesar esa cantidad de filas corta y no sigue la instruccion con el
resto
> de las filas y puede causarte ciertos problemas por ejemplo si tienes
> triggers ya que sigue rigiendo el set rowcount. Sin embargo si tienes


una
> clausula order by se aplica despues del ORDER BY al contrario de lo que
dice
> la documentacion (que tengo a mano en este momento y es del SQL 7.0 en
> ingles) por lo que te devuelve las ultimas filas o las primeras


ordenadas
> por el campo del ORDER BY
>
> El TOP solo sirve para el SELECT en el cual participa y es practicamente
la
> misma semantica.
>
> Esto es lo que dice el manual en ingles
>
> "The SET ROWCOUNT limit applies to building the rows in the result set
> before an ORDER BY is evaluated. Even if ORDER BY is specified, the


SELECT
> statement is terminated when n rows have been selected. n rows are
selected,
> then ordered and returned to the client"
>
> Lo que traducido mas o menos seria:
>
> "El limite SET ROWCOUNT se aplica a la construccion de filas en el
conjunto
> resultado antes de que un ORDER BY sea evaluado. Incluso, si se


especifica
> un ORDER BY, la expresion SELECT es terminada cuando han sido
seleccionadas
> n filas, n filas son seleccionadas, entonces ordenadas y devueltas al
> cliente"
>
> Te paso un ejemplo sobre northwind que contradice esto, sobre una


columna
no
> indexada para evitar la posibilidad de que el planificador elija otro


plan
> si se hace un order by.
>
> Si realizas la prueba del set rowcount con el order by indicado mas


abajo
> podras comprobar lo que te digo.
>
> Si activas el SET SHOWPLAN_ALL ON en lugar del SET SHOWPLAN_TEXT ON


veras
> que el plan es el siguiente y que ambos operadores tienen un
"EstimateRows"
> = 830
>
> Con Set rowcount
>
> StmtText

> -
> |--Sort(ORDER BY:([Orders].[ShipName] ASC))
> |--Clustered Index
> Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))
>
>
> Con TOP
>
> |--Top(2)
> |--Sort(ORDER BY:([Orders].[ShipName] ASC))
> |--Clustered Index
> Scan(OBJECT:([Northwind].[dbo].[Orders].[PK_Orders]))
>
>
> El plan usa [Northwind].[dbo].[Orders].[PK_Orders] por que es el indice
> clustered.
>
> Tambien lo puedes comprobar si lo ejecutas, ya que veras que te vienen


las
> dos primeras de TODA LA TABLA ORDENADA.
> No hace lo que dice el manual porque no tiene forma de seleccionar las


dos
> filas ordenadas por el campo "ShipName", a menos que primero ordene toda
la
> tabla porque "ShipName" no participa de ningun indice.
>
> Ademas es el mismo resultado que usando un TOP
>
> Este deberia ser el resultado si no colocas ORDER BY y esos son
precisamente
> los datos que deberia ordenar si hace lo que dice el manual.
>
> /*--
> select top 2 ShipName from orders
> go
> ShipName
> -
> Vins et alcools Chevalier
> Toms Spezialitàten
>
>
> Con TOP ordena y luego aplica el TOP
>
> /*--
> select top 2 ShipName from orders order by ShipName
> ShipName
> -
> Alfreds Futterkiste
> Alfred's Futterkiste
>
> (2 row(s) affected)
>
>
> Con Set Rowcount hace lo mismo y contradice el manual !!!!!!!!!!!!!!
>
> /*--
> Set rowcount 2
> go
> select ShipName from orders order by ShipName
> ShipName
> -
> Alfreds Futterkiste
> Alfred's Futterkiste
>
> (2 row(s) affected)
>
>
>
> CONCLUSION
>
> Aunque no hace lo que dice, en mi humilde opinion, no debes confiarte


que
lo
> que yo digo que hace es lo que siempre va a hacer, ya que no esta
> documentado asi. Por lo tanto, mi sugerencia es "NO USAR" SET ROWCOUT y
> ORDER BY juntos.
>
>
>
> Jose Mariano Alvarez
> Comunidad de base de datos
> Grupo de Usuarios Microsoft
> www.mug.org.ar
>
>
> "Rubén Vigón" wrote in message
> news:
> > [...] SET ROWCOUNT difiere de TOP en estos aspectos:
> >
> > - El límite SET ROWCOUNT se aplica a la construcción de filas del
conjunto
> de resultados después de
> > que se evalúe una instrucción ORDER BY. Cuando se especifica ORDER BY,
la
> instrucción SELECT se
> > termina cuando se hayan seleccionado n filas de un conjunto de valores
que
> se han ordenado según la
> > clasificación ORDER BY especificada
> >
> > - La cláusula TOP se aplica a la instrucción SELECT individual en la


que
> se ha especificado. SET
> > ROWCOUNT permanece activada hasta que se ejecuta otra instrucción SET
> ROWCOUNT, como, por ejemplo,
> > SET ROWCOUNT 0 para desactivar la opción
> >
> > Un saludo!
> >
> > Rubén Vigón
> > Microsoft MVP Visual Basic
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida