Самый быстрый SQL-запрос выбора для разбиения на таблицы ASP .NET? - PullRequest
4 голосов
/ 02 июня 2009

Какой самый быстрый способ выбора диапазона строк, скажем, от 4.200.000 до 4.200.050, с использованием SQL 2005? Предположим, у меня есть 10 миллионов строк.

В своих собственных проектах я использую следующий подход, но я не уверен, что это лучший метод

select * from
(
    select 
        Column1, Column2, Column3
        RowNumber = row_number() over (order by ID asc) 
    from 
        tblLogs
    where
        Column4 = @Column4 and Column5 = @Column5
    ) as tempTable
where tempTable.RowNumber >= @StartIndex and tempTable.RowNumber <= @EndIndex

С приведенным выше кодом мне хочется сказать, что tempTable будет большой таблицей с одним столбцом, содержащим все мои идентификаторы.

Есть ли что-нибудь быстрее?

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

Ответы [ 4 ]

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

Эта статья на SQLServerCentral превосходна:
SQL Server 2005 Paging - Святой Грааль

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

Я заметил, что у вас много строк, добавление индексов в Column4 и Column5 значительно увеличит производительность, если еще не добавлено.

Мне показалась интересной следующая статья: Функции ранжирования и производительность в SQL Server 2005

Я дам вам понять, как улучшить его в соответствии со статьей, если это возможно. Я сам проверил их решения, и это работает.

Если вы ожидаете подкачки в ASP.NET, мне также будет очень интересна следующая статья Скотта Митчелла: Настраиваемая подкачка в ASP.NET 2.0 с SQL Server 2005

Он использовал их метод в моем коде, и он прекрасно работает. Вот пример кода TSQL:

    SELECT ROWNUM, COLUMN1, COLUMN2, COLUMN3
    FROM (
    SELECT COLUMN1, COLUMN2, COLUMN3,
    ROW_NUMBER() OVER(ORDER BY ID) AS ROWNUM
            FROM TABLE1
    WHERE COLUMN4 = @X AND COLUMN5 = @Y
    ) AS TABLE2
WHERE ROWNUM BETWEEN @startRowIndex AND (@startRowIndex + @maximumRows) - 1

Предлагаю прочитать статью 4guysfromrolla для получения дополнительной информации.

Удачи

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

Хорошо. Это моя последняя мысль об этой проблеме.

Для больших проектов с таблицами, содержащими 10 миллионов или более строк, я буду использовать этот подход:

  select * from
  (
        select 
        myTable.*, 
        RowNumber = row_number() over (order by myTable.ID asc) 
    from 
        myTable
        where
                myCondition
  ) as tempTable
  where tempTable.RowNumber >= @StartIndex and tempTable.RowNumber <= @EndIndex
  • для разбиения на страницы ASP .NET Я буду использовать SELECT ниже, который работает очень быстро для первых 100 000 строк, 10 000 страниц с 10 строками на страницу, но со страницы 10.000 до бесконечности запрос будет работать медленнее и медленнее, очень медленнее. Никто не захочет просматривать страницу 10.001 !!

  • Для подсчета количества страниц и количества строк, которые выполняют myCondition из SELECT выше, я сделаю специальный TABLE, который будет иметь только одну строку и один столбец, в этом столбце я буду хранить число строк. Каждый раз, когда я добавляю, изменяю или удаляю строку из myTable, я буду обновлять это двоеточие на основе myCondition, добавляя или уменьшая его на значение 1. Цель этого состоит в том, чтобы быстро выбрать количество строк, которые выполняют myCondition, и показать моим пользователям сколько страниц у меня.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...