2014-09-19 68 views
0

我有一张表,其中包含281,433条记录,范围从2010年3月至当前日期(2014年9月)。这是一个交易表,它由确定当前进出仓库的库存的记录组成。“事务”表上的缓慢查询 - sql分区作为解决方案?

从仓库进行拣货时,系统需要查看某个特定客户的每笔交易(基于确定客户的AccountListID字段,客户平均可能拥有约300条记录表)。在完成拣配运行时,这种情况会在特定.NET应用程序的每次请求中发生2-3次。

有时候数据库似乎锁定。有些请求在3秒钟内完成不了。根据最终用户的需求,其他人可能会长达4分钟。

我的猜测是在4-5个请求的同时,所有看着这个事务表的东西都被锁定了。

我在考虑对此表进行分区,以便主事务表只包含最近2年的记录。最终用户已经同意,在这个日期之后的任何记录都是不必要的。

但我不能只删除它们,它们在系统中的其他地方使用。我有索引已经到位,他们有很大的区别(在accountlistid字段上从> 30秒到< 2)。看起来分区是下一步。

1)我是否正确解决了我的'锁定'问题? 2)当移动一组记录时(例如DateTimeCheckedIn字段超过2年的记录),这是一个手动过程还是分区自动执行?

+1

我不认为分区会影响锁定,但我可能是错的。我首先看“交易隔离级别”。 – 2014-09-19 13:57:17

+0

谢谢Tab,我只是从http:// technet上读到这个。microsoft.com/en-us/library/ms175519(v=sql.105).aspx – 2014-09-19 14:02:27

+0

'阅读列表':http://stackoverflow.com/questions/2471055/why-use-a-read-uncommitted-isolation-级别http://stackoverflow.com/questions/6945487/slow-sql-transaction-blocks-table – 2014-09-19 15:27:27

回答

1

我不认为在这里需要分区。你可以用一个很好的索引来解决这个问题:我想一个索引涵盖(按顺序)公司,部件号和数量。或者,如果它是旧服务器,可能只需添加内存。最后,由于这是读取大量较旧的事务数据,其中单个事务本身可能永远不会(或者至多很少)一旦写入就更新,所以对于此查询,您可能会使用READ UNCOMMITTED隔离级别做得更好。

+0

移动服务器是我第一个选择,我们已经完成了,它只有1GB,但即使在挑选期间也一直有20%的可用性看着perfmon,没有什么剧烈的事情发生,它从未记录过高峰)。我将研究未经整理的阅读,这似乎是下一个合乎逻辑的步骤。 – 2014-09-19 15:25:08

+0

在大多数情况下,1GB对于sql server来说是一个可笑的少量内存。只是因为perfmon没有显示内存峰值,并不意味着sql server不会使用更多。通过移动到合理的方框,您可能会看到显着不同的表现。 – 2014-09-19 15:58:10

+0

字面上,这个盒子上有一个网站,带有windows web服务器和web mssql版本。添加另一个演出将是我的下一个选项。 – 2014-09-19 20:52:46

2

对于少于300,000行的表格,分区不应该是必须的,除非每条记录都非常大。如果一条记录占用超过4k字节,那么你有300,000页(2400,000,000字节),并且这个记录越来越大。

索引通常是这样的解决方案。花费超过一秒钟的时间在索引数据库中返回300条记录似乎很长时间(除非记录真的很大,并且网络开销增加了时间)。您的表索引应该都适合内存。检查你的内存配置。

下一个问题是关于应用程序代码。如果它使用游标,那么这些可能是在某些情况下锁定行的罪魁祸首。对于只读游标,“FAST_FORWARD”或“FORWARD READ_ONLY”应该很快。如果应用程序代码锁定了全部的历史记录,则可能会有争用。毕竟,当两个记录(针对不同的)客户位于同一数据页面时,会发生这种情况。解决方案是在读取它们时不锁定历史记录。或者,避免一起使用游标。

+0

什么是游标?它来自.NET c#web应用程序,如果有帮助的话。我没有故意使用游标(我不知道它们是什么!) – 2014-09-19 15:23:06