Voglio realizzare tavolo paginazione con questo metodo:Esiste un problema di prestazioni che utilizza Row_Number per implementare il paging delle tabelle in Sql Server 2008?
SET @PageNum = 2;
SET @PageSize = 10;
WITH OrdersRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY OrderDate, OrderID) AS RowNum
,*
FROM dbo.Orders
)
SELECT *
FROM OrdersRN
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1
AND @PageNum * @PageSize
ORDER BY OrderDate ,OrderID;
C'è qualcosa che dovrei essere a conoscenza? La tabella ha milioni di record.
Thx.
EDIT: Dopo aver utilizzato suggerito MAXROWS
metodo per un certo tempo (che funziona davvero molto veloce) ho dovuto tornare alla ROW_NUMBER
metodo a causa della sua maggiore flessibilità. Sono anche molto contento della sua velocità fino ad ora (sto lavorando con View con più di 1 milione di record con 10 colonne). Per utilizzare qualsiasi tipo di domanda che uso seguente modifica:
PROCEDURE [dbo].[PageSelect]
(
@Sql nvarchar(512),
@OrderBy nvarchar(128) = 'Id',
@PageNum int = 1,
@PageSize int = 0
)
AS
BEGIN
SET NOCOUNT ON
Declare @tsql as nvarchar(1024)
Declare @i int, @j int
if (@PageSize <= 0) OR (@PageSize > 10000)
SET @PageSize = 10000 -- never return more then 10K records
SET @i = (@PageNum - 1) * @PageSize + 1
SET @j = @PageNum * @PageSize
SET @tsql =
'WITH MyTableOrViewRN AS
(
SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderBy + ') AS RowNum
,*
FROM MyTableOrView
WHERE ' + @Sql + '
)
SELECT *
FROM MyTableOrViewRN
WHERE RowNum BETWEEN ' + CAST(@i as varchar) + ' AND ' + cast(@j as varchar)
exec(@tsql)
END
Se si utilizza questa procedura assicurarsi u impedito sql injection.
Duplicato esatto: http://stackoverflow.com/questions/1897436/row-number-over-not-fast-enough-with-large-result-set-any-good-solution –
Pony, non sono molto felice con quella risposta, soprattutto perché non menziona nemmeno Row_Number() ..... La domanda è, ancora: sto usando Row_Number().Cosa puoi dirmi delle sue prestazioni rispetto ad altri metodi (quindi, non offrirmi altri metodi) – majkinetor
BTW, Pony Trovo osservazioni come questa molto scortese. Sono sicuro di sapere qual è la buona risposta per la mia domanda, non ho bisogno che tu me lo dica. Tipico amdin BS. – majkinetor