我目前正在开展一项棘手的工作。
背景
:定位:
当前解决方案:
目前有一个解决方案,但它不能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();
问题:
有时我会收到错误消息 事务(进程ID)在锁资源上与另一个进程死锁,并被选为死锁牺牲品 我的进程崩溃了。
有时我会收到INSERT或UPDATE无法执行的错误,因为列存储索引处于活动状态。
我已经考虑过表锁在重建和修改过程中不会遇到竞争状态。
我很高兴有任何建议或帮助解决问题
答案 0 :(得分:0)
在我的旧团队中,我们正在考虑我们希望执行数据仓库任务的归档记录的列存储索引,但数据库是一个高度事务性的数据库,需要24/7的正常运行时间。我们的解决方案是设置一个ETL流程,将数据转储到一个单独的数据仓库数据库中,我们启用了列存储索引。也就是说,我们使用2014并启用了集群列存储索引,允许插入/更新/删除,但将其放在一个单独的表中,允许表和索引的维护任务,而不会影响操作。
根据我的经验,最好有一个专门的操作数据库和一个单独的报告数据库。特别是在操作上,您可以归档大量您希望保留以进行报告的记录。