[MSSQL] Verschil SET ROWCOUNT en TOP

Pagina: 1
Acties:

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In een ander topic kwam het verschil tussen SET ROWCOUNT n en SELECT TOP n ter sprake. Ik ging er altijd vanuit de ROWCOUNT op basis van de ongesorteerde resultset was en TOP op basis van de gesorteerde resultset, ik keek echter even in Books Online en las daar het volgende:
If a SELECT statement that includes TOP also has an ORDER BY clause, the rows to be returned are selected from the ordered result set. The entire result set is built in the specified order and the top n rows in the ordered result set are returned.

The other method of limiting the size of a result set is to execute a SET ROWCOUNT n statement before executing a statement. SET ROWCOUNT differs from TOP in these ways:

The SET ROWCOUNT limit applies to building the rows in the result set after an ORDER BY is evaluated. When ORDER BY is specified, the SELECT statement is terminated when n rows have been selected from a set of values that has been sorted according to specified ORDER BY classification.
Hierin staat toch duidelijk dat beide uiteindelijke resultsets wel rekening houden met de ORDER BY clausule. Een testje op de pubs database gaf voor beide statements ook dezelfde resultaten. Kan ik nu niet lezen, of staat hier gewoon dat ze beide hetzelfde doen :? (behalve het feit dat SET ROWCOUNT werkt tot het 'uit' gezet wordt natuurlijk)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 14:52

gorgi_19

Kruimeltjes zijn weer op :9

Top is iig iets sneller, volgens QA, als ik het me goed herinner :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
In een testje wat ik net heb gedaan zijn beide statements even snel volgens het execution plan (hoewel het executionplan wel afwijkt.) bij een resultset van 10000 rows. Vergroot ik de resultset naar 100000 dan is de SET ROWCOUNT variant een stuk sneller (38% vs. 62%). De grootste winst zit hem blijkbaar in het feit dat de SET ROWCOUNT variant een gedeelte van de query parallel uitvoert. Hmm.

Maar ik snap nog niets van wat er in Books Online staat. Er staat zo duidelijk 'het verschil is:' en dan staat er dus hetzelfde.

edit: even op google gezocht: als de kolom in de ORDER BY clausule geen index heeft, dan zal TOP in principe sneller ziijn

[ Voor 12% gewijzigd door P_de_B op 07-06-2006 09:45 ]

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Het zit hem in het volgende stukje:
...
The entire result set is built
...
vs
...
the SELECT statement is terminated when n rows have been selected
...
volgens mij.

ROWCOUNT is blijkbaar lazy ten opzichte van TOP

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Maar beide statements bouwen eerst een gesorteerde tijdelijke resultset van waaruit ze het uiteindelijke resultaat halen. Wat zou hetgeen jij naar voren haalt voor verschil moeten uitmaken?

Oops! Google Chrome could not find www.rijks%20museum.nl


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Ik interpreteerde het als:
Het opbouwen van de resultset stopt bij ROWCOUNT zodra er X rijen inzitten, terwijl TOP eerst de hele resultset opbouwt en dan worden vervolgens alleen de eerste X geretourneerd. Maar goed, tis een interpretatie.

Edit:
En volgens mij wordt de resultset bij een ROWCOUNT gesorteerd opgebouwd, terwijl bij een TOP de gehele resultset wordt opgebouwd en dan gesorteerd (bij het ontbreken van een index).

[ Voor 30% gewijzigd door bigbeng op 07-06-2006 10:02 ]

Pagina: 1