列存储索引更新使用表锁定

时间:2013-12-16 16:39:52

标签: sql-server table-locking columnstore

我目前正在开展一项棘手的工作。

背景

  • 我有一个MSSQL 2012数据库,有多个表和大量数据 的行。由于在这个数据库中搜索需要一段时间,我 寻找改进查询的方法。 (是的,我正在使用索引, 已经看过执行计划和这样的东西:-)) 经过一番调查后,我在MSSQL 2012中找到了Column Store Indexes 企业。这使我在搜索期间获得了巨大的性能提升。
  • 缺点:启用索引时,无法执行此操作 INSERT / UPDATE / DELETE数据

:定位:

  • 我希望快速搜索
  • 应该可以一次运行多个worker来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();

问题:

有时我会收到错误消息 事务(进程ID)在锁资源上与另一个进程死锁,并被选为死锁牺牲品 我的进程崩溃了。

有时我会收到INSERT或UPDATE无法执行的错误,因为列存储索引处于活动状态。

我已经考虑过表锁在重建和修改过程中不会遇到竞争状态。

我很高兴有任何建议或帮助解决问题

1 个答案:

答案 0 :(得分:0)

在我的旧团队中,我们正在考虑我们希望执行数据仓库任务的归档记录的列存储索引,但数据库是一个高度事务性的数据库,需要24/7的正常运行时间。我们的解决方案是设置一个ETL流程,将数据转储到一个单独的数据仓库数据库中,我们启用了列存储索引。也就是说,我们使用2014并启用了集群列存储索引,允许插入/更新/删除,但将其放在一个单独的表中,允许表和索引的维护任务,而不会影响操作。

根据我的经验,最好有一个专门的操作数据库和一个单独的报告数据库。特别是在操作上,您可以归档大量您希望保留以进行报告的记录。