Как выделить большое количество записей в SQL SERVER - PullRequest
2 голосов
/ 19 декабря 2008

Я пытаюсь выбрать более 80 000 записей в SQL Server в таблице, содержащей миллионы записей. Проблема в том, что у меня правильный индекс, но для возврата набора записей требуется более 15 минут.

Я использую MS SQL Server 2000, я нашел метод разбиения на страницы с использованием хранимых процедур, но он использует временную таблицу, в которую мне нужно вставить весь набор результатов, а затем выбрать количество записей, которые я собираюсь показать на странице , Этот метод занимает слишком много времени.

Любая помощь для более быстрого способа, который я могу реализовать?

Ответы [ 4 ]

3 голосов
/ 19 декабря 2008

Вам нужно будет отредактировать это, чтобы реализовать ваши входные параметры для параметров фильтрации и сортировки пользователя, но общий принцип будет применяться. Я использовал эту технику с SQL 2000 в 2000-2001 гг. С таблицей записей 90M для обеспечения быстрой подкачки страниц для 150-200К строк результатов. Так как во временной таблице находится только ключ, это очень узкая, очень маленькая временная таблица, и производительность высока (и для этого шага нужно только прочитать индекс основной таблицы, а не саму таблицу) при фактическом создании данных из основной таблицы для фактического (меньшего) возвращаемого результирующего набора (только строки @PageSize) запрос должен прочитать только несколько записей ...

Create Procedure GetPagedData
@Page Integer = 1,
@PageSize Integer = 100,
@UsersFilteringCOnditions,
@UsersSortOptions
As
Set NoCount On

Declare @Start Integer,
Declare @End Integer
Declare @NumRecs Integer

   -- Declare a temp table variable to hold all the pk values...
   Declare @Keys Table (rowNum integer Identity Primary Key NotNull,
                        keyVal Integer Not Null)

   -- Insert all the Primary Keys into the temp table variable...
   Insert @keys(keyVal)
   Select PrimaryKey From MyMillionRowTable
   Where UsersFilterConditionsAreTrue
   Order By UsersSortOptions

  -- Then, select from your big table only the data 
  -- from the rows for the page the user wants

   Select @NumRecs = Count(*) From Keys 
   Set @End = @Page * @PageSize
   Set @Start = @End + 1 - @PageSize

   Select {Insert ColumnListHere}
   From MyMillionRowTable T
       Join @Keys K On K.KeyVal = T.PrimaryKey 
   Where K.rowNum Between @Start And @End
0 голосов
/ 19 декабря 2008

@ jmpena: извините, план выполнения требует 2% чтения из закладки и 98% сканирования индекса

Я думаю, что вы ответили здесь на свой вопрос. Msgstr "98% сканирует индекс". Сканирование индекса просто означает, что SQL обнаружил индекс, который может помочь производительности, выбранной на основе статистики. В зависимости от индекса операция может быть такой же плохой, как и само сканирование таблицы.

То, что вы должны увидеть, если индекс / запрос были настроены правильно, это поиск по индексу.

Можете ли вы поделиться, какие индексы находятся на столе? (sp_help {tablename})

0 голосов
/ 19 декабря 2008

Это определенно использует индекс? Это кластерный индекс? Проверьте план выполнения. Вы также можете перестроить индекс.

Если этого не сделать, опубликуйте запрос, определение таблицы и индексы.

Это также может быть ограничение вашей конфигурации SQL (объем используемой оперативной памяти и т. Д.) Или вашего оборудования. Это один диск или RAID? Если в RAID-массиве произошел сбой одного из дисков, что привело к фоновому перестроению?

0 голосов
/ 19 декабря 2008

Есть несколько вариантов. Обычные приемы настройки БД (по которым я не эксперт). Можно ли извлечь данные подмножества, которые вас интересуют, в меньшую таблицу за кулисами?

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