Лучшие практики для разработки таблиц для поддержки обновления одного поля быстрее с использованием сервера SQL
Я работаю над Workflow, как система. У меня есть одна таблица задач и поле состояния. Значением статуса может быть одно из следующих: Новый, Готов, Обработка, Ошибка, Прервать, Готово.
У меня есть около 7 процессов, которые будут запускаться в зависимости от ситуации, чтобы изменить значение статуса задачи. В большинстве случаев каждый процесс будет работать со своим собственным набором данных и каждый раз обрабатывает до 5000 записей. Но я все еще вижу некоторый тупик, если данные достигают около 2 миллионов записей. Я проверяю с помощью SQL Profiler, похоже, что некоторые ресурсы страницы связаны между собой. Я не очень хорош в настройке производительности SQL Server и не очень хорошо понимаю.
Поскольку неактивные задачи будут архивироваться каждый день, я думаю изменить дизайн таблицы для поддержки около 10 миллионов записей.
Немного выбора может быть:
- Создание разделенных таблиц на основе статуса.
- Создать основную таблицу со статическими данными и поддерживаемой таблицей на основе статуса
Есть ли хорошая практика для такой ситуации?
Спасибо!
2 ответа
- Вы можете разбить таблицу на основе столбца состояния. Активные записи в одном разделе. Закрытые записи в другом разделе
- Ежемесячно вы также можете очистить закрытые записи (Удалить, если больше не требуется) или перейти к таблице архивов.
- Разделение таблицы Я не думаю, что это был бы лучший выбор (вам не нужны многократные таблицы для той же функциональности)
- Чтобы избежать тупика, какую версию SQL Server вы используете
- Если вы используете SQL 2005 и выше, используйте Read Committed Snapshot Isolation для чтения зафиксированных данных. Это гарантирует, что вы читаете не блокировать записи
Я знаю, что должен публиковать ответ, но с этими вопросами ответы могут следовать:
1.) Табличные подсказки на месте? Если нет, то экспериментируйте с применением этих
2.) Используются ли все доступные индексы? TaskId
столбец единственный приемлемый индекс? Иногда определенные ситуации при анализе приводят к необходимости нового индекса
3.) Являются ли все 2 миллиона записей живыми / активными в любой момент времени?
4.) Проверяли ли вы фрагментированные индексы? Ежедневное архивирование может привести к фрагментации индекса, поэтому вам может потребоваться добавить в конце задания архивирования шаг для проверки и устранения фрагментации
5.) Поле состояния для new
,ready
,processing
,error
,abort
,done
находится под каким типом данных?
6.) Экспериментировали ли вы с индексированными представлениями? Если вы уже знаете, что ограничиваете определенные данные и хотите избежать сканирования таблицы, это может помочь