В настоящее время я работаю над сложной задачей.Обновление индексов хранилища столбцов С блокировкой таблицы
фона:
- У меня есть база данных MSSQL 2012 с несколькими столами и огромное количество строк. Поскольку поиск занимает довольно много времени в этой базе данных, i искать способы улучшения запросов. (И да, я использую индексы, уже посмотрел на план выполнения и прочее вроде этого :-)) После некоторого расследования я нашел индексы индекса столбцов в MSSQL 2012 Enterprise. Это дало мне огромное увеличение производительности во время поиска.
- Неудобство: Когда индекс включен не возможно INSERT/UPDATE/DELETE данные
Цель:
- Я хочу, чтобы иметь быстрый поиск доступных
- It должно быть возможным одновременное запуск нескольких сотрудников в данные INSERT/UPDATE/DELETE (разделение работы между несколькими работниками, которые обращаются к тем же таблицы), которые имеют колонки хранить индексы (обычно выполняется в течение ночи)
- После рабочего закончил показатели выполнения задачи должны быть восстановить (и другие работники не должны ждать до тех пор)
- Затем работники должны продолжить и отключить индексы снова где необходимо
Текущее решение:
в настоящее время есть решение на месте, но он не работает на 100%, потому что до сих пор получить сообщение что иногда UPDATES и INSERTS не могут быть выполнены, потому что индексы хранилища столбцов должны быть сначала отключены (но они должны быть в соответствии с тем, что я делаю), или что во время одного из вызовов хранимой процедуры происходит манипуляция данными.
Краткий обзор, что я сделал. Я не уверен, что это лучший способ обновить таблицы индексами столбцов. Также читайте о перегородке, но разделы в настоящее время не используются (из-за структуры данных и поиска)
У меня есть следующие хранимые процедуры в базе данных MSSQL.
sp_columnstore_entity_disable (Отключает индекс таблицы)
ALTER INDEX [ColumnStoreIndex_Entity] ON dbo.[Entity] DISABLE
sp_columnstore_entity_rebuild (перестраивает индекс на столе)
ALTER INDEX [ColumnStoreIndex_Entity] ON dbo.[Entity] REBUILD
sp_entity_insert_update
-- Whenever this stored procedure is executed index should be disabled in case it active
EXEC sp_columnstore_entity_disable
-- Insert or Update the entity
Программный код работника выглядит например:
// get entities to process
for(int i = 0; i < num_entities; i++)
{
// do some work
// insert/update entity
}
// Rebuild column store indexes again
DBRebuildColumnStoreIndexes();
Проблема:
Иногда я получаю сообщение об ошибке, как транзакций (идентификатор процесса) была заведена в тупик на ресурсах блокировки с другим процессом и была выбрана в качестве тупиковой жертвы и моих сбои процесса.
Иногда я получаю сообщение об ошибке, что INSERT или UPDATE невозможен, потому что индекс столбцов активен.
Я уже думал о блокировке стола, чтобы не переходить в состояние гонки во время перестройки и модификации.
Я рад любому предложению или помочь решить проблему
Вы осознаете на столе несколько сотен концертов, что вы полностью закроете стол во время перестройки? Зачем вам это делать? – Namphibian
Да, я понимаю это. Если есть лучший способ, когда я могу сохранить этот быстрый поиск и манипулировать данными с несколькими работниками одновременно, пожалуйста, дайте мне знать. :) Обработка данных в настоящее время выполняется в одночасье, поэтому она не влияет на обычное рабочее время. – Anubis
Если обработка данных выполняется за одну ночь, было бы приемлемо, если бы вы сбросили индекс столбцов до того, как начнется какое-либо манипулирование данными (для любого рабочего), и вы восстановите его после того, как все манипуляции с данными (для всех работников) будут выполнены? Вместо того, чтобы делать это для каждого рабочего. –