我目前正在处理一项棘手的任务。
背景:
- 我有一个MSSQL2012数据库,其中包含多个表和大量行。由于在这个数据库中搜索需要相当长的时间,我搜索改进查询的方法。(是的,我正在使用索引,已经看了执行计划和类似的东西:-))经过一些调查,我在MSSQL2012中发现了列存储索引企业这让我在搜索过程中获得了巨大的性能提升
- 缺点:启用索引时,无法INSERT/UPDATE/DELETE数据
目标:
- 我想要快速搜索
- 应该可以一次运行多个工作程序来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_inter_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)在锁定资源上与另一个进程发生死锁,已被选为死锁牺牲品我的进程崩溃了。
有时我会得到一个错误,因为columnstore索引是活动的,所以INSERT或UPDATE是不可能的。
我已经考虑过表锁在重建和修改过程中不会陷入竞争状态。
我很高兴有任何建议或帮助来解决问题
在我的旧团队中,我们正在考虑为我们想要对其执行数据仓库任务的存档记录建立列存储索引,但该数据库是一个高度事务性的数据库,需要全天候运行。我们的解决方案是建立一个ETL过程,将数据转储到一个单独的数据仓库数据库中,我们在该数据库上启用了列存储索引。也就是说,我们使用2014,并启用了集群列存储索引,它允许插入/更新/删除,但将其放在一个独立的表中,可以在不影响操作的情况下执行表和索引的维护任务。
根据我的经验,最好有一个专门的操作数据库和一个单独的报告数据库。尤其是在操作上,您可以归档大量您希望保留的记录以供报告。