1

在使用分区表 SQL 功能时,我遇到了奇怪的行为。似乎使用while循环将行插入表中比将行插入临时表中,然后立即从临时表插入到原始表中更好。

我将尝试说明情况。

我已经在 CourtID 列上的表 TestTabela 上启用了分区。

CREATE PARTITION FUNCTION [TestPartition](int) AS RANGE LEFT FOR VALUES (1, 2, 3)
GO
/****** Object:  PartitionScheme [TestPartition]    Script Date: 1/18/2016 10:19:54 AM ******/
CREATE PARTITION SCHEME [TestPartition] AS PARTITION [TestPartition] TO ([Test1], [Test2], [Test3], [Test1])
GO
/****** Object:  Table [dbo].[TestTabela]    Script Date: 1/18/2016 10:19:54 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[TestTabela](
[Id] [int] IDENTITY(1,1) NOT NULL,
[CourtID] [int] NOT NULL,
[Name] [nvarchar](50) NULL,
 CONSTRAINT [PK_TestTabela] PRIMARY KEY NONCLUSTERED 
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [TestPartition]([CourtID])

GO
ALTER TABLE [dbo].[TestTabela] SET (LOCK_ESCALATION = AUTO)
GO
/****** Object:  Index [NonClusteredIndex-20160117-134607]    Script Date: 1/18/2016 10:19:54 AM ******/
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20160117-134607] ON [dbo].[TestTabela]
(
[CourtID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

我现在尝试在 CourtID 1(第一个分区)中插入 100.000 行,同时在 CourtID 2(第二个分区)中插入单行。

第一种情况的示例:

我会将行插入到临时表中,然后复制到原始表中。

create table #tmp(CourtID int,Name nvarchar(50))

DECLARE @count int
SET @count = 1
WHILE @count <> 100000
BEGIN
INSERT INTO #tmp
SELECT 1,N'Test'
SET @count = @count + 1
CONTINUE
END

begin tran
insert into TestTabela(CourtID,Name)
select CourtID,Name from #tmp
commit

第二种情况的示例:

使用 while 循环将行直接插入表中。

begin tran
DECLARE @count int
SET @count = 1
WHILE @count <> 100000
BEGIN
INSERT INTO TestTabela
SELECT 1,N'Test'
SET @count = @count + 1
CONTINUE
END
commit

在这两种情况下,我都尝试在单独的窗口中执行以下命令:

INSERT INTO TestTabela
SELECT 2,N'Test'

在第一次测试中,插入等待提交。在第二种情况下,立即插入第二个分区。

我想找到一种使用第一种情况仅锁定一个分区的方法。可能吗?

顺便说一句,我正在使用 SQLServer 2012R2...

4

0 回答 0