以下面的示例为例,假设TABLE1包含一百万条记录;
SELECT * INTO TMP_TABLEA FROM TABLE1
SELECT * INTO TMP_TABLEB FROM TABLE1
INSERT INTO TMP_TABLEC (COLUMN1) SELECT COLUMN1 FROM TABLE1
问题;
答案 0 :(得分:1)
在SQL Server中,读取器永远不会阻塞读取器。所以不,这些语句都不会相互阻塞。因为尽管他们写表,但他们写的表却不同。
第一条语句将独占锁定TMP_TABLEA
,但是它将在默认隔离级别下将共享锁置于TABLE1
上。
第二条语句将独占锁定TMP_TABLEB
,但是它将在默认隔离级别下将共享锁置于TABLE1
上。
第三条语句将放置TMP_TABLEC
的排他锁(行,页或整个对象)。但是它将在默认隔离级别下将共享锁置于TABLE1
上。
显然,它会影响性能,因为您要SQL Server同时执行三件事。但是,使用三个连接同时执行所有三个语句比仅使用一个连接连续执行它们要快。
答案 1 :(得分:0)
回答:是的,但是共享锁(实际上是Read Committed锁)将应用于TABLE1,该表在行被一一读取时被释放。因为它是一个共享锁,所以它是非阻塞锁。
答案:是的。但是,通过在TABLE1中使用某种分区,可以大大提高性能。因此,它可以利用您尝试使用的多核CPU。另外,请确保已正确设置了TABLE1的索引。
答案 2 :(得分:0)
由于TABLE1中没有写操作,所以不会发生阻塞。
在读取操作期间,共享锁。这意味着没有障碍。
在写操作期间,排他锁。这意味着封锁。
但是肯定会导致速度变慢。因为TABLE1正在将其可用资源共享给“ n”个操作。