2016-02-10 1 views
1

Я знаю, что вы можете использовать ROW_NUMER(), чтобы получить номер строки, а затем выполнить WHERE на по результатам, как показано here:эффективно извлекать диапазон строк из отборного с ORDER BY заявление

USE AdventureWorks2012; 
GO 
WITH OrderedOrders AS 
(
    SELECT SalesOrderID, OrderDate, 
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber 
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60; 

Однако, это будет первым сортировать все данные и только потом извлекать ряд строк.

Поскольку можно найти k-й член отсортированного массива: How to find the kth largest element in an unsorted array of length n in O(n)?, я надеюсь, он также будет возможен в SQL.

+0

он находится в SQL Server 2012+ – Lamak

+0

@Lamak Что значит? это если я использую вышеупомянутый синтаксис? что, если я делаю вложенный «SELECT» вместо 'WITH'? – Mugen

+1

https://www.mssqltips.com/sqlservertip/2420/sql-server-2012-server-side-paging/ – mohan111

ответ

0

Сорта можно избежать с индексом на OrderDate:

CREATE INDEX IX_SalesOrderHeader_OrderDate ON Sales.SalesOrderHeader(OrderDate); 

Упорядоченного сканирование этого индекса будет выполняться до тех пор, указанный верхний ROW_NUMBER() предел не достигается, ограничивая сканирование до этого числа строк. ROW_NUMBER() значения, меньшие, чем указанный диапазон, будут отброшены из результатов.

Как и любой метод разбиения на страницы на основе множества в SQL, где существует полезный индекс упорядочения, производительность во многом будет зависеть от количества строк, которые необходимо пропустить и вернуть.

+0

Ну, на самом деле в моем случае заказ по-динамичен и может также содержать несколько столбцов или значений агрегации, на которые я хотел бы заказать – Mugen

+0

@Mugen, индексы необходимы, чтобы избежать сортировки для 'ROW_NUMBER()'. В случае вычисляемых значений потребуется сортировка. –

Смежные вопросы