Пейджинг через Большой стол в sql 2005 - PullRequest
2 голосов
/ 10 июня 2009

У меня есть таблица с 15 столбцами и 6,5 миллионами записей. Мне нужно получить доступ к этой таблице со стороны C # с помощью подкачки. Я написал SP, но получение данных занимает около 1,30 минут. вот мой сохраненный процесс -

Create Proc demo
(
@startRowIndex int,
@maximumRows int
)
AS

DECLARE @first_id int, @startRow int

SET @startRowIndex =  (@startRowIndex - 1)  * @maximumRows

IF @startRowIndex = 0 
SET @startRowIndex = 1

SET ROWCOUNT @startRowIndex

SELECT @first_id = RecordID FROM edd_business_listings_05282009 ORDER BY RecordID

PRINT @first_id

SET ROWCOUNT @maximumRows

SELECT * FROM edd_business_listings_05282009 WHERE 
RecordID >= @first_id 
ORDER BY RecordID

SET ROWCOUNT 0

Кто-нибудь знает способ сделать это быстрее?

Ответы [ 6 ]

2 голосов
/ 10 июня 2009

Может ли ваше приложение отправить последний RecIDID?

Сделайте работу интерфейса сильнее.

Создание демонстрации Proc (@startRowID int, @maximumRows int) AS

SET ROWCOUNT @ MaximumRows

SELECT * FROM edd_business_listings_05282009 ГДЕ RecordID> @startRowID ORDER BY RecordID

SET ROWCOUNT 0

1 голос
/ 10 июня 2009

Лучшее решение будет сильно зависеть от

1. как часто данные меняются

2. как часто вызывается sproc и насколько глубоко пользователь будет печатать страницу и

3. Какую задержку (если есть) вы можете принять в актуальном состоянии заказа.

Часто в бэкэнде веб-сайта ваши пользователи используют только первые несколько страниц, но бот Google может захлопнуть ваши глубокие страницы и, следовательно, захлопнуть ваш процессор. Обычно хорошо поддерживать это оперативное упорядочение только до определенной точки (например, использовать row_number () для первых нескольких сотен или тысяч строк), а затем переключаться на денормализованный список упорядочения, который обновляется в течение некоторого интервала (возможно, ежечасно).

1 голос
/ 10 июня 2009

ОК, конечно, вот мое предположение:

Create Proc demo ( @startRowIndex int, @maximumRows int ) AS
DECLARE @first_id int, @startRow int
SET @startRowIndex = (@startRowIndex - 1) * @maximumRows

IF @startRowIndex = 0 SET @startRowIndex = 1

SELECT TOP (@maximuRows)
 {'all columns except N'}
 FROM (
    Select *, ROW_NUMBER() Over(Order by RecordID) as N
     from edd_business_listings_05282009
    ) As t
 WHERE N >= @startRowIndex
 ORDER BY RecordID
1 голос
/ 10 июня 2009

Попробуйте использовать ROW_NUMBER в SQL 2005: http://www.4guysfromrolla.com/webtech/010406-1.shtml

Такая процедура поможет:

CREATE PROCEDURE dbo.GetListingPaged
(
    @StartRowIndex int,
    @MaximumRows int
)
AS
    SELECT
        RecordID,
        Field2 -- Not *
    FROM
    (
    SELECT
        RecordID,
        Field2 -- Not *
        ROW_NUMBER() OVER (ORDER BY RecordID) AS RowRank
    FROM edd_business_listings_05282009
    ) AS ListingWithRowNumbers
    WHERE
        RowRank > @StartRowIndex
    AND
        RowRank <= (@StartRowIndex + @MaximumRows)

GO
0 голосов
/ 10 июня 2009

Попробуйте поместить индекс в столбец RecordId. Я думаю, что происходит то, что вы выполняете сканирование всей таблицы до того, как число строк будет на месте, чтобы Sql мог заказать все. Если у вас уже есть индекс, проблема заключается в чем-то еще. Я сделал этот же запрос для таблиц с удвоенным количеством записей, и мое время выполнения никогда не превышало 2 секунд.

Использование ROWCOUNT или Row_Number () должно технически выполнить ту же самую задачу с точки зрения производительности, но я бы использовал Row_Number (), поскольку это более современный способ сделать это, и установка rowcount идет с гораздо большей сложностью, чем Row_Number (), которую я не попадет.

0 голосов
/ 10 июня 2009

Если вы используете SQL Server 2005, тогда вы можете попробовать

SELECT  field1, field2, fieldN
FROM     (SELECT ROW_NUMBER() OVER (ORDER BY RecordID) AS Row,
             field1, field2, fieldN FROM edd_business_listings_05282009)
            AS ListingsWithRowNumbers
WHERE  Row >= @startRowIndex AND Row <= @startRowIndex + @maximumRows

Но в любом случае попробуйте переосмыслить эту архитектуру. Какая польза для отображения миллионов записей (даже разбитых на страницы) в пользовательском интерфейсе? Вы можете попытаться ограничить количество записей и сначала запросить только подмножество ...

...