SQLServer Table Partitioning

При использовании функции SQL таблицы разделов я столкнулся со странным поведением. Кажется, что лучше вставить строки в таблицу с помощью цикла while, чем вставлять строки во временную таблицу, а затем сразу вставить из временной таблицы в исходную таблицу.

Я постараюсь проиллюстрировать ситуацию.

Я включил разбиение на таблицу TestTabela на столбце CourtID.

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

Сейчас я пытаюсь вставить 100000 строк в CourtID 1 (первый раздел) и одновременно вставить одну строку в 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, кстати...

0 ответов

Другие вопросы по тегам