如何在插入SQL Server时减少表的停机时间

时间:2018-03-09 12:31:42

标签: sql sql-server performance

我有一张手术台,称之为Ops。我们的客户每隔一秒就通过Web服务查询该表。

有两个进程会影响表:

  1. 删除过期记录(每日)

  2. 插入新记录(每周)

  3. 我的目标是在这些过程中将停机时间降至最低。我知道Oracle,但这是我第一次使用SQL Server和T-SQL。在Oracle中,我会做一个truncate来加速删除过期记录的第一个过程和一个分区交换来插入新记录。

    SQL Server的分区交换似乎有点难以处理,因为从我可以阅读的内容来看,必须创建文件组,分区方案和分区函数(?)。

    您对减少停机时间的建议是什么?

2 个答案:

答案 0 :(得分:1)

表未脱机,因为有人正在删除或插入行。该表可以同时读取和更新。

但是,在默认隔离级别READ COMMITTED下,读者会阻止读者,读者会阻止读者。这意味着SELECT语句可能需要更长时间才能完成,因为尚未提交的事务正在锁定SELECT语句尝试读取的某些行。在事务完成之前,SELECT语句将被阻止。如果事务需要很长时间,这可能是一个问题,因为它显示为表处于脱机状态。

另一方面,在READ COMMITTED SNAPSHOTSNAPSHOT隔离级别下,读者不会阻止编写者,编写者也不会阻止读者。这意味着SELECT语句可以与INSERTUPDATEDELETE语句同时运行,而无需等待获取锁,因为在这些隔离级别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/了解详情。