15

Mam kilka pytań w kontekście starsze row_number (SQL Server 2008) i nowszych OFFSET + FETCH (SQL Server 2012) mechanizm stronicowania świadczone przez SQL Server 2012.Jakie są różnice między starszą wersją wiersza() i nowszą stroną paginacji opartą na protokole OFFSET + FETCH w programie SQL Server?

  1. Jakie są ograniczenia z ROW_NUMBER() ?
  2. Czy OFFSET + FETCH jest lepszym zamiennikiem dla row_number()?
  3. Czy są jakieś przypadki użycia, które mogą być wystarczające tylko za pomocą jednego, a nie drugiego?
  4. Czy są jakieś różnice w wydajności między nimi? Jeśli tak, który z nich jest zalecany?

Dzięki.

+2

Czy sprawdzałeś w pobliżu? Zobacz tę dość wyczerpującą odpowiedź: http://dba.stackexchange.com/questions/30210/why-are-there-execution-plan-differences-between-offset-fetch-and-the-old-st –

Odpowiedz

13

Użycie ROW_NUMBER() działa dobrze - to po prostu więcej pracy niż to konieczne; musisz napisać "szkielet" CTE wokół rzeczywistego zapytania, dodać kolumnę ROW_NUMBER() do zestawu wyjściowego, a następnie filtrować na tym.

Dzięki nowej OFFSET/FETCH jest prostsza - i tak, jest to również lepsze wydajności, jak te dwa linki mogą pokazać:

Więc ogólnie: Jeśli "Ponownie przy użyciu SQL Server 2012 - wtedy powinieneś zdecydowanie użyć OFFSET/FETCH zamiast ROW_NUMBER() dla stronicowania

+0

To wygląda całkiem szczerze , ale zastanawiam się, w jaki sposób mogę zmusić EF do używania zestawów z serwerem 2012 sql? –

1

według ten artykuł 3 technika przywoływania porównaj i spowodować wykresie jest przydatna, aby wybrać metodę przywoływania

Sql Server 2012 Paging Methods

wszystkie metody stronicowania w liczbie mały rekord działać dobrze, ale kiedy rośnie liczba rekordu po czasach różnica bet weena metody wydaje się bezpośrednio