Сколько времени должен занимать запрос, который возвращает 5 миллионов записей? - PullRequest
12 голосов
/ 03 апреля 2012

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

Для начала я использую свою локальную машину с копией SQL Server 2008 Express. У меня есть двухъядерный процессор, 2 ГБ оперативной памяти и 64-битная ОС (если это имеет значение). Я использую только простую таблицу с примерно 6 полями varchar.

Сначала я запрашивал данные без какой-либо индексации. Это заняло смехотворно много времени, поэтому я отменил и добавил в таблицу кластерный индекс (используя PK). Это сократило время до 1 минуты 14 секунд. Я понятия не имею, если это лучшее, что я могу получить, или я все еще могу сократить это еще дальше?

Я ограничен моим оборудованием или могу ли я что-то еще сделать со своей таблицей / базой данных / запросами, чтобы получить результаты быстрее?

К вашему сведению, я использую только стандартный SELECT * FROM для получения моих результатов.

Спасибо!

РЕДАКТИРОВАТЬ: Просто чтобы уточнить, я делаю это только для целей тестирования. Мне не нужно извлекать все данные, я просто использую их как последовательный тест, чтобы посмотреть, смогу ли я сократить время запроса.

Полагаю, что я спрашиваю: могу ли я что-то сделать для ускорения производительности моих запросов, кроме: а) обновления оборудования и б) добавления индексов (при условии, что схема уже работает)?

Ответы [ 5 ]

11 голосов
/ 03 апреля 2012

Я думаю, что вы задаете неправильный вопрос.

Прежде всего - зачем вам так много статей одновременно на локальном компьютере?Что вы хотите с ними сделать?

Почему я спрашиваю?Я думаю, что этот объем данных будет перенесен куда-то.И только в это время вы должны измерить время передачи данных.

И даже в этой ситуации я хочу дать вам совет:

Ваши приложения не должны выберите 5 миллионов записей одновременно.Попробуйте разделить запрос и получить данные частично.

ОБНОВЛЕНИЕ:

Поскольку вы говорите, что делаете это для тестирования, я предлагаю вам:

  1. Удалить * из вашего запроса - SQL-сервер тратит некоторое время на решение этой проблемы.
  2. Попробуйте поместить ваши данные в какое-то временное хранилище данных.Попробуйте использовать VIEW или временную таблицу для этого.
  3. Попробуйте использовать какой-нибудь план кэширования на вашем сервере

Но я все еще не понимаю -зачем вам такие тесты, если ваше приложение никогда не будет использовать такой запрос? Тестирование только для тестирования - это трата плохого времени .

2 голосов
/ 03 апреля 2012

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

1 голос
/ 12 апреля 2012

Лучший оптимизированный способ зависит от выбранной вами стратегии индексации.Как и многие из приведенных выше ответов, я бы тоже сказал, что разделение таблицы иногда помогает.И это не лучшая практика для запроса всех миллиардов записей за один промежуток времени.Если вы попытаетесь частично выполнить запрос с помощью итераций, вы получите гораздо лучший результат.Вы можете проверить эту ссылку, чтобы снять сомнения относительно минимальных требований к серверу Sql 2008 Минимальные требования к H / W и S / W для сервера Sql 2008

0 голосов
/ 25 ноября 2018

Я заработал 5,5 миллиона за 20 секунд. Это берет более 100 тыс. Расписаний с разными частотами и прогнозирует их на ближайшие 25 лет. Максимальное тестирование сценария, но доказывает скорость, которую вы можете достичь в системе планирования в качестве примера.

0 голосов
/ 07 февраля 2014

Когда вы разбираете 5 миллионов строк, вы почти на 100% переходите в режим очереди. Вы должны попытаться оптимизировать свою временную базу данных, добавив дополнительные файлы. если у вас есть несколько дисков на отдельных дисках, вы должны разделить данные таблицы на разные файлы ndf, расположенные на отдельных дисках. Parititioning не поможет при запросе всех данных на диске Вы также можете использовать подсказку запроса, чтобы вызвать параллелизм MAXDOP, это увеличит загрузку процессора. Убедитесь, что столбцы содержат как можно меньше нулей, и перестройте ваши индексы и статистику

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