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,行似乎显示在正确的分区中。
我现在唯一的问题是没有聚集索引是否不好?
您有一个索引和一个堆(未索引的表),如edit4 中的 indexid(分别为 3 和 0)所示,因此该行当然会出现两次。名为 PK_Punch 的索引似乎不是分区对齐的(因为它在 PartitionScheme 中为 NULL)——这可能是也可能不是问题。
归档时间: |
|
查看次数: |
122 次 |
最近记录: |