0

我有一个 SQL Server 数据库,它存储具有信用的帐户(大约 200.000 条记录),以及一个存储交易的单独表(大约 20.000.000)。

每当将交易添加到数据库时,都会更新信用。

我需要做的是更新客户端程序(使用 Web 服务)以在本地存储积分,并且每当将新事务添加到服务器时,它们也会发送到客户端(使用 delta 的时间戳)。我的主要问题是为客户创建第一个数据集。我需要提供所有帐户的列表和交易表上的最后一个时间戳。

这意味着我必须在快照中创建此列表和最后一个时间戳,因为创建此列表期间的任何更新都意味着信用总数和最后一个事务时间戳不匹配。

我已经研究了ALLOW_SNAPSHOT_ISOLATION设置并在事务上使用快照隔离SqlCommand,但从我读到的内容来看,这将导致显着的性能损失。这是真的吗,这个问题可以用其他方法解决吗?

4

2 回答 2

1

但从我读过的内容来看,这将导致显着的性能损失。

我什至不想知道你在哪里读到的。我会参考你的官方文档。成本来自用于行版本的额外 tempdb 空间和遍历旧行版本。如果您的写入率较低,则这些问题与您无关。

快照隔离是解决阻塞和一致性问题的福音。它非常适合您的场景。

Stack Overflow 上的许多 SQL Server 问题让我评论“你调查过快照隔离了吗?”。最未充分利用的功能。

Oracle 和 Postgres 一直都在使用它。

于 2014-04-26T10:23:52.477 回答
1

不要急于跳上 SI 货车。和其他所有东西一样,它有它的优点,也有它的缺点。

就缺点而言,例如,应用程序可能依赖阻塞行为或/并且愿意等待数据的最后一个版本。您应该在 SI 下彻底测试应用程序以确保其行为正确。此外,未提交的事务可能会弄乱版本存储并导致 tempdb 急剧增长,因此必须进行监控。

此外,如果您通常没有阻塞问题,那么 SI 对您来说可能是一种过度杀伤。

相反,如果您需要一次性或接近它,请创建一个database snapshot数据库,从该快照创建初始列表,然后简单地删除它。

于 2014-04-26T10:45:24.200 回答