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, кстати...