我有一张手术台,称之为Ops
。我们的客户每隔一秒就通过Web服务查询该表。
有两个进程会影响表:
删除过期记录(每日)
插入新记录(每周)
我的目标是在这些过程中将停机时间降至最低。我知道Oracle,但这是我第一次使用SQL Server和T-SQL。在Oracle中,我会做一个truncate来加速删除过期记录的第一个过程和一个分区交换来插入新记录。
SQL Server的分区交换似乎有点难以处理,因为从我可以阅读的内容来看,必须创建文件组,分区方案和分区函数(?)。
您对减少停机时间的建议是什么?
答案 0 :(得分:1)
表未脱机,因为有人正在删除或插入行。该表可以同时读取和更新。
但是,在默认隔离级别READ COMMITTED
下,读者会阻止读者,读者会阻止读者。这意味着SELECT
语句可能需要更长时间才能完成,因为尚未提交的事务正在锁定SELECT
语句尝试读取的某些行。在事务完成之前,SELECT
语句将被阻止。如果事务需要很长时间,这可能是一个问题,因为它显示为表处于脱机状态。
另一方面,在READ COMMITTED SNAPSHOT
和SNAPSHOT
隔离级别下,读者不会阻止编写者,编写者也不会阻止读者。这意味着SELECT
语句可以与INSERT
,UPDATE
和DELETE
语句同时运行,而无需等待获取锁,因为在这些隔离级别SELECT
语句下请求锁定。
您可以做的最简单的事情是在数据库上启用READ COMMITTED SNAPSHOT
隔离级别。启用此隔离级别后,它将成为默认隔离级别,因此您无需更改应用程序的代码。
ALTER DATABASE MyDataBase SET READ_COMMITTED_SNAPSHOT ON
答案 1 :(得分:0)
如果你的问题是"选择被阻止,"你可以尝试“没有锁定”。暗示。但一定要阅读其含义。您可以查看https://www.mssqltips.com/sqlservertip/2470/understanding-the-sql-server-nolock-hint/了解详情。