パーティション テーブルの 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 (2 番目のパーティション) に 1 行を挿入しようとしています。
最初のケースの例:
行を一時テーブルに挿入してから、元のテーブルにコピーします。
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
2 番目のケースの例:
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'
最初のテストでは、挿入はコミットを待ちました。2 番目のケースでは、2 番目のパーティションへの挿入がすぐに行われました。
最初のケースのシナリオを使用して、1 つのパーティションのみをロックする方法を見つけたいと考えています。出来ますか?
ちなみに、私はSQLServer 2012R2を使用しています...