Ben*_*imi 4 performance database-design sql-server update
设想:
\n我正在运行一个连接到 SQL Server 作为数据后端的用户应用程序。\n在正常的一天中,与应用程序关联的表中的数据可能会频繁更改,目前保存着 1500 万多条记录(并且还在进一步增长) 。但是,只有在整个更新语句成功完成后,应用程序才能应用和访问插入和更新插入,并且永远不会发生脏读。
\n为了能够为应用程序提供对表的持续可访问性,我使用了一个辅助表,在其中进行实际更新和索引重建,以便主表保持解锁状态。完成后,表就被交换了。
\n我还调查了:
\n问题:
\n由于我对此相当陌生,并且不太确定是否有任何“更好”的方法来解决这种情况(性能、数据库本机、设置方面等),因此值得深思。
\n更新:
\n启用读取已提交快照(不过,它似乎相当消耗资源)
您是否使用您的工作负载版本对其进行了测试?如果没有,我建议这样做。如果您可以使用 SQL Server 中内置的旨在解决您的问题的技术,您的情况通常会更好。如果您知道 Azure SQL 数据库默认使用 RCSI,您可能会感觉更好。如果它适用于所有这些数据库,那么也许它也适用于您的数据库。
您可以通过在数据库上启用快照隔离来测试 RCSI 的性能影响,而无需更改应用程序行为。这将创建 RCSI 所需的所有相同 tempdb 行版本,但快照隔离级别将仅用于选择它的代码。Kendra Little在此处发表了一篇博客文章,其中包含更多详细信息。
对于索引维护,我假设您使用的是标准版?如果是这样,RCSI 不会真正帮助您。您需要在用户活动较少的时间段(您的应用程序是 24/7?)或维护时段进行索引重建。这可能看起来不方便,但这是每个使用标准版的人都会遇到的问题。您目前重建索引的频率可能超过必要的程度。