同时在同一个表中插入和选择

Mag*_*n V 5 sql sql-server performance database-performance

由于我是 Sql 服务器的新手,有人可以澄清这一点吗?

考虑一下这个案例,

我有一个表“dbo.test”,其中包含 1 亿条记录。

在表“dbo.test”上运行10条select语句,每次选择将返回100万条记录。

现在我想向同一个表“dbo.test”插入100万条记录。但我不会选择新数据(我正在插入,我有相应的过滤器)。

这里我可以插入100万条吗,还是需要等待所有select语句完成。

如果我开始插入,性能怎么样?

欢迎询问。

M.A*_*Ali 5

为此,您需要了解 sql server 中的锁定行为。Sql Server 在访问数据库中的资源(行)进行任何操作时都会获取资源上的锁。

将获得什么类型的锁取决于您正在执行的操作类型以及您拥有的事务隔离级别。

默认情况下,您已读取已提交的事务隔离级别。并且您的读取(选择查询)将获得资源(行)的共享锁,这意味着也在读取行的其他用户可以访问这些行。

但是,如果另一个用户更新一行,sql server 将获得该行的排它锁,并且在提交更新语句之前该行将无法读取。

将行插入到具有默认读已提交事务隔离级别的表中不会对其他用户正在读取的行产生任何影响,除非 sql server 在插入新行时必须锁定某些行以检查条件。同样,这取决于您插入行的方式。

我建议您在继续插入之前先阅读一些关于 sql server 事务隔离级别和 sql server 锁定行为的文章:)

特别是查看可重复读事务隔离级别,它允许您插入数据,但可能会出现一些脏读。


Mih*_*riu 1

如果您使用的是 SQL Server,请使用OUTPUT 子句。为什么你需要选择 100 万行,那是另一个故事了......