为什么新插入的行会出现在 SQL Server 分区表的两个文件组中?

Bob*_*orn 2 sql-server partitioning sql-server-2017

我按年份对现有表进行了分区。为 2020 年的某个日期插入新记录后,新记录将显示为 2020 年分区主文件组的一部分。我很难确定这是否应该发生,或者我是否配置错误。

这是插入记录后分区的样子。在插入记录之前,此查询在主文件组中显示了 3 条记录,在 2021 组中显示了 3 条记录。

在此处输入图片说明

我期待 2020 分区中有一个新行,并且主文件组中的行数保持在 3,但也许这些是错误的期望。

主文件组是否总是显示分区的总数,或者行应该只显示在它们所属的分区中?

我可以展示我如何设置这一切,我很乐意,但这个问题更多的是关于结果应该是什么样子。我不希望多个分区中的同一行。

编辑

我刚刚找到了这个链接。这表明插入数据,其中新行的结果只有在正确的分区出现,而不是处于初级。所以看起来我做错了什么。

https://www.sqlshack.com/how-to-automate-table-partitioning-in-sql-server/

编辑 2

主要有所有 4 行的原因可能是它的上边界为空。由于主要已经存在于表中,因此从未修改过。也许我需要修改它?

编辑 3

有趣的是,此链接还显示了主分区中的分区总和。

https://www.mssqltips.com/sqlservertip/2888/how-to-partition-an-existing-sql-server-table/

SSMS 为分区生成的脚本

USE [Sandbox]
GO
BEGIN TRANSACTION
CREATE PARTITION FUNCTION [PunchPF1](datetimeoffset(7)) AS RANGE LEFT FOR VALUES (N'2020-01-01T00:00:00-05:00', N'2021-01-01T00:00:00-05:00', N'2022-01-01T00:00:00-05:00')
 
CREATE PARTITION SCHEME [PunchPS1] AS PARTITION [PunchPF1] TO ([Pre2020_Punch], [2020_Punch], [2021_Punch], [2022_Punch])
 
ALTER TABLE [time].[Punch] DROP CONSTRAINT [PK_Punch] WITH ( ONLINE = OFF )
 
ALTER TABLE [time].[Punch] ADD  CONSTRAINT [PK_Punch] PRIMARY KEY NONCLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
 
CREATE CLUSTERED INDEX [ClusteredIndex_on_PunchPS1_637515095430656187] ON [time].[Punch]
(
    [PunchTime]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PunchPS1]([PunchTime])
 
DROP INDEX [ClusteredIndex_on_PunchPS1_637515095430656187] ON [time].[Punch]
 
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)

编辑 4

这是相同的查询,但包含 IndexName 和 IndexID。

在此处输入图片说明

编辑 5

执行此操作后,现在情况看起来好多了:

USE [Sandbox]

--------------------------------------------------------------------------------------------------------------------
-- Drop table, scheme, and function
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Punch' AND TABLE_SCHEMA = 'time')
    DROP TABLE time.Punch;

IF EXISTS (SELECT 1 FROM sys.partition_schemes WHERE name = 'PunchPS1')
    DROP PARTITION SCHEME PunchPS1

IF EXISTS (SELECT 1 FROM sys.partition_functions WHERE name = 'PunchPF1')
    DROP partition function PunchPF1

--------------------------------------------------------------------------------------------------------------------
-- Files and Filegroups
-- Add files and filegroups manually in SSMS because each SQL Server could have different file locations?
-- How to add a file and filegroup using SQL:
-- https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options?view=sql-server-ver15
-- To see an example of creating filegroups in SQL, script the Sandbox DB AS CREATE...

--------------------------------------------------------------------------------------------------------------------
-- Partition Function
CREATE PARTITION FUNCTION [PunchPF1](datetimeoffset(7))
AS RANGE RIGHT FOR VALUES (N'2020-01-01T00:00:00-05:00', N'2021-01-01T00:00:00-05:00', N'2022-01-01T00:00:00-05:00')

-------------------------------------------------------------------------------------------------------------------- 
-- Partition Scheme
CREATE PARTITION SCHEME [PunchPS1]
AS PARTITION [PunchPF1] TO ([Pre2020_Punch], [2020_Punch], [2021_Punch], [2022_Punch])

--------------------------------------------------------------------------------------------------------------------
-- Table
CREATE TABLE [time].[Punch](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [EmployeeId] [bigint] NOT NULL,
    [PunchTime] [datetimeoffset](7) NOT NULL
) ON [PunchPS1] (PunchTime)

--------------------------------------------------------------------------------------------------------------------
-- Add some data
INSERT INTO [time].[Punch] ([EmployeeId],[PunchTime]) VALUES (10,'2020-12-18 16:40:20')
INSERT INTO [time].[Punch] ([EmployeeId],[PunchTime]) VALUES (10,'2020-12-20 16:40:20')
INSERT INTO [time].[Punch] ([EmployeeId],[PunchTime]) VALUES (10,'2020-12-22 16:40:20')
INSERT INTO [time].[Punch] ([EmployeeId],[PunchTime]) VALUES (10,'2021-3-18 16:40:20')
Run Code Online (Sandbox Code Playgroud)

如图所示,边界看起来不错,我使用的是 RANGE RIGHT,行似乎显示在正确的分区中。

在此处输入图片说明

我现在唯一的问题是没有聚集索引是否不好?

Ste*_*o64 7

您有一个索引和一个堆(未索引的表),如edit4 中的 indexid(分别为 3 和 0)所示,因此该行当然会出现两次。名为 PK_Punch 的索引似乎不是分区对齐的(因为它在 PartitionScheme 中为 NULL)——这可能是也可能不是问题。