Лучшие практики для разработки таблиц для поддержки обновления одного поля быстрее с использованием сервера SQL - PullRequest
6 голосов
/ 19 октября 2011

Я работаю над Workflow как система. У меня есть одна таблица задач и поле состояния. Значение для статуса может быть одним из следующих: Новый, готов, обработка, ошибка, отмена, выполнено.

У меня около 7 процессов, которые будут запускаться в зависимости от ситуации, чтобы изменить значение статуса задачи. В большинстве случаев каждый процесс будет работать со своим собственным набором данных и каждый раз обрабатывать до 5000 записей. Но я все еще вижу некоторый тупик, если данные достигают около 2 миллионов записей. Я проверяю с помощью SQL Profiler, похоже, что некоторые ресурсы страницы связаны между собой. Я не очень хорош в настройке производительности SQL Server и не очень хорошо понимаю.

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

Мало выбора может быть:

  1. Создание разделенных таблиц на основе статуса.
  2. Создание основной таблицы со статическими данными и поддерживаемой таблицей на основе статуса

Есть ли хорошая практика для такой ситуации?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 20 ноября 2011

Я знаю, что должен публиковать ответ, но с этими вопросами могут последовать ответы:

1.) Табличные подсказки на месте? Если нет, то экспериментируйте с применением этих

2.) Используются ли все доступные индексы, и является ли столбец TaskId единственным приемлемым индексом? Иногда определенные ситуации при анализе приводят к необходимости нового индекса

3.) Являются ли все 2 миллиона записей живыми / активными в любой момент времени?

4.) Вы проверили фрагментированные индексы? Ежедневное архивирование может привести к фрагментации индекса, поэтому вам может потребоваться добавить в конце задания архивирования шаг для проверки и устранения фрагментации

5.) Поле состояния для new, ready, processing, error, abort, done для какого типа данных?

6.) Вы экспериментировали с индексированными представлениями? Если вы уже знаете, что ограничиваете определенные данные и хотите избежать сканирования таблиц, это может помочь

0 голосов
/ 19 октября 2011
  • Вы можете разбить таблицу на основе столбца состояния. Активные записи в одном разделе. Закрытые записи в другом разделе
  • Ежемесячно вы также можете очистить закрытые записи (удалить, если в этом больше нет необходимости) или перейти к таблице архивов
  • Разделение таблицы Я не думаю, что это был бы лучший выбор (вам не нужны многократные таблицы для той же функциональности)
  • Чтобы избежать тупика, какую версию SQL Server вы используете
  • Если вы используете SQL 2005 и выше, используйте Read Committed Snapshot Isolation для чтения зафиксированных данных. Это гарантирует, что вы читаете не блокировать записи
...