6

我正在研究类似系统的工作流。我有一个任务表和状态字段。status 的值可以是 New、ready、processing、error、abort、done 之一。

我有大约 7 个进程,它们将根据不同的情况触发以更改任务状态的值。大多数情况下,每个进程都将处理自己的数据集,并且每次最多只能处理 5000 条记录。但是如果数据达到大约 200 万条记录,我仍然会看到一些僵局。我用 SQL Profiler 检查,看起来像是一些相关的页面资源。我不擅长 sql server 性能调优,也不是很了解。

由于每天都会归档非活动任务,因此我正在考虑重新设计表格以支持大约 1000 万条记录。

几个选择可能是:

  1. 根据状态创建拆分表。
  2. 根据状态创建包含静态数据和支持的表的主表

这种情况有什么好的做法吗?

谢谢!

4

2 回答 2

0
  • 您可以根据状态列对表进行分区。一个分区中的活动记录。关闭另一个分区中的记录
  • 您还可以按月清除已关闭的记录(如果不再需要则删除)或移至存档表
  • 拆分表我认为这不是更好的选择(您不需要多个表来实现相同的功能)
  • 为避免死锁,您使用的是哪个版本的 SQL Server
  • 如果您使用的是 SQL 2005 及更高版本,请使用 Read Committed Snapshot Isolation 来读取已提交的数据。这将确保您的读取不会阻止写入
于 2011-10-19T01:00:25.577 回答
0

我知道我应该发布答案,但是对于这些问题,答案可能如下:

1.) 表格提示是否到位?如果没有,那么尝试应用这些

2.) 是否使用了所有可用的索引,并且该TaskId列是唯一可接受的索引吗?有时,分析某些情况会导致需要新索引

3.) 是否所有 200 万条记录在任何给定时间都处于活动状态?

4.) 你检查过碎片索引吗?每日归档可能会导致索引碎片,因此您可能希望在归档作业结束时添加一个检查和修复碎片的步骤

new5.) , ready, processing, error,abort的状态字段done是什么数据类型?

6.) 您是否尝试过索引视图?如果您已经知道要限制某些数据并希望避免表扫描,它可能会有所帮助

于 2011-11-19T21:10:52.173 回答