2013-12-16 10 views
1

В настоящее время я работаю над сложной задачей.Обновление индексов хранилища столбцов С блокировкой таблицы

фона:

  • У меня есть база данных 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 невозможен, потому что индекс столбцов активен.

Я уже думал о блокировке стола, чтобы не переходить в состояние гонки во время перестройки и модификации.

Я рад любому предложению или помочь решить проблему

+0

Вы осознаете на столе несколько сотен концертов, что вы полностью закроете стол во время перестройки? Зачем вам это делать? – Namphibian

+0

Да, я понимаю это. Если есть лучший способ, когда я могу сохранить этот быстрый поиск и манипулировать данными с несколькими работниками одновременно, пожалуйста, дайте мне знать. :) Обработка данных в настоящее время выполняется в одночасье, поэтому она не влияет на обычное рабочее время. – Anubis

+1

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

ответ

0

На моей старой команде мы рассматривали колонки магазина индексирование для наших архивных записей, которые мы хотели бы выполнять задачи хранилищ данных на, однако база данных была очень транзакционная база данных, требующая 24/7 времени. Наше решение состояло в том, чтобы настроить процесс ETL, который сбрасывал данные в отдельную базу данных хранилища данных, на которую мы включили индексирование индекса хранилища. Тем не менее, мы использовали 2014 и включили индексирование кластерного хранилища столбцов, которое позволяет вставлять/обновлять/удалять, но иметь его в отдельной таблице, позволяя выполнять задачи обслуживания для таблицы и индекса без влияния на операции.

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

 Смежные вопросы

  • Нет связанных вопросов^_^