我正在工作的工作流系统。我有一个任务表和状态字段。状态值可以是新建、就绪、处理、错误、中止、完成。
我大约有7个进程,根据不同的情况会触发这些进程来改变任务状态的值。大多数情况下,每个进程将处理自己的数据集,每次最多只处理5000条记录。但如果数据达到200万条左右,我仍然会看到一些死锁。我检查与SQL分析器,看起来像一些页面资源相关。我不擅长sql server性能调优,也不太了解它。
由于非活动任务将每天存档,我正在考虑重新设计表以支持大约1000万条记录。
少数选择可能是:
- 根据状态创建分割表。
- 根据状态 创建包含静态数据和支持表的主表
谢谢!
- 可以根据状态列对表进行分区。活动记录在一个分区中。另一个分区 中已关闭的记录
- 您还可以每月清除已关闭的记录(如果不再需要则删除)或移动到存档表
- 拆分表我不认为这将是一个更好的选择(你不需要多个表相同的功能)
- 为避免死锁,您使用的是哪个版本的SQL Server
- 如果您使用的是SQL 2005及以上版本,请使用读取提交快照隔离来读取提交数据。这将确保读操作不会阻塞写操作
我知道我应该发布一个答案,但是这些问题的答案可能如下:
1)。表提示是否到位?如果没有,那么尝试应用那些
2)。是否使用了所有可用的索引,并且TaskId
列是唯一可接受的索引?有时,在分析某些情况时会需要一个新的索引
3)。所有200万条记录在任何给定时间都是活动的吗?
4)。您检查过碎片索引了吗?每日归档可能会导致索引碎片,因此您可能希望在归档作业结束时添加检查和修复碎片的步骤
5)。new
, ready
, processing
, error
, abort
, done
的状态字段在什么数据类型下?
6)。你有没有尝试过索引视图?如果您已经知道要限制某些数据并希望避免表扫描,那么