Какой самый эффективный способ распечатывания больших объемов данных в SQL Server 2000? - PullRequest
0 голосов
/ 07 января 2011

Если у меня есть запрос с большим количеством информации (что-то вроде пары представлений, каждое из которых затрагивает несколько таблиц, а многие таблицы имеют десятки тысяч строк), и мне просто нужно получить 10 записей из него в показать пользователю, каков наилучший способ с точки зрения производительности извлекать эти записи, все еще поддерживая SQL Server 2000? Когда я могу использовать SQL Server 2005, ROW_NUMBER кажется очевидным выбором (поправьте меня, если я ошибаюсь), но что делать в 2000 году?

1 Ответ

0 голосов
/ 07 января 2011

У Грега Гамильтона есть статья , в которой SET ROWCOUNT и SELECT вводятся в переменную, чтобы избежать необходимости ссылаться на ненужные строки, с довольно привлекательной производительностью. Результаты. Тем не менее, MSDN говорит

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

Но затем он продолжает говорить

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

Если инструкция SELECT возвращает более одной строки, а переменная ссылается на нескалярное выражение, переменной присваивается значение, возвращаемое для выражения в последней строке набора результатов.

Указывает, что в этом случае все в порядке (верно?)

Грег заканчивает этим:

CREATE  PROCEDURE [dbo].[usp_PageResults_NAI] 
(
    @startRowIndex int,
    @maximumRows int
)
AS

DECLARE @first_id int, @startRow int

-- A check can be added to make sure @startRowIndex isn't > count(1)
-- from employees before doing any actual work unless it is guaranteed
-- the caller won't do that

-- Get the first employeeID for our page of records
SET ROWCOUNT @startRowIndex
SELECT @first_id = employeeID FROM employees ORDER BY employeeid

-- Now, set the row count to MaximumRows and get
-- all records >= @first_id
SET ROWCOUNT @maximumRows

SELECT e.*, d.name as DepartmentName 
FROM employees e
   INNER JOIN Departments D ON
       e.DepartmentID = d.DepartmentID
WHERE employeeid >= @first_id
ORDER BY e.EmployeeID

SET ROWCOUNT 0

GO 

Этот метод предполагает, что у вас есть уникальный идентификатор для заказа, я не думаю, что вы можете использовать этот метод как есть при сортировке, скажем, неуникального столбца DateTime.

...