在使用分区表 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...