【问题标题】:Wrong order of SQL Server's partitionsSQL Server 的分区顺序错误
【发布时间】:2017-02-15 15:18:33
【问题描述】:

我创建了数据库

USE [master]
GO

CREATE DATABASE [testdb]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'testdb', FILENAME = N'D:\MSSQL\Data\testdb.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [2016] 
( NAME = N'2016', FILENAME = N'D:\MSSQL\Data\2016.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [2017] 
( NAME = N'2017', FILENAME = N'D:\MSSQL\Data\2017.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [2018] 
( NAME = N'2018', FILENAME = N'D:\MSSQL\Data\2018.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [2019] 
( NAME = N'2019', FILENAME = N'D:\MSSQL\Data\2019.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ), 
 FILEGROUP [2020] 
( NAME = N'2020', FILENAME = N'D:\MSSQL\Data\2020.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'testdb_log', FILENAME = N'D:\MSSQL\Data\testdb_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [testdb] SET COMPATIBILITY_LEVEL = 130
GO

我有一张桌子

CREATE TABLE [dbo].[ticket2](
    [id] [int] NULL,
    [datesell] [datetime] NULL,
    [status] [int] NULL
) ON [PRIMARY]
GO

接下来,我为这个表添加了分区

USE [testdb]
GO

BEGIN TRANSACTION
CREATE PARTITION FUNCTION [byYear](datetime) AS RANGE LEFT FOR VALUES (N'2015-12-31T23:59:59', N'2017-01-01T00:00:00', N'2018-01-01T00:00:00', N'2019-01-01T00:00:00', N'2020-01-01T00:00:00')

CREATE PARTITION SCHEME [years] AS PARTITION [byYear] TO ([PRIMARY], [2016], [2017], [2018], [2019], [2020])

CREATE CLUSTERED INDEX [ClusteredIndex_on_years_636227525068063988] ON [dbo].[ticket2]
(
    [datesell]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [years]([datesell])

DROP INDEX [ClusteredIndex_on_years_636227525068063988] ON [dbo].[ticket2]

COMMIT TRANSACTION
GO

当我将一些数据添加到我的表中时,我会看到下一个

接下来,我为明年添加了一个分区

ALTER DATABASE testdb
ADD FILEGROUP [2021]

ALTER DATABASE testdb
ADD FILE
( NAME = N'2021', FILENAME = N'D:\MSSQL\Data\2021.ndf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB ) TO FILEGROUP [2021] 

ALTER PARTITION SCHEME [years] NEXT USED [2021];
ALTER PARTITION FUNCTION byYear() split RANGE (N'2022-01-01T00:00:00' )

BEGIN TRANSACTION
CREATE CLUSTERED INDEX [ClusteredIndex_on_years_636227647501414735] ON [dbo].[ticket2]
(
    [datesell]
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [years]([datesell])
DROP INDEX [ClusteredIndex_on_years_636227647501414735] ON [dbo].[ticket2]
COMMIT TRANSACTION

我看到错误的分区顺序。

分区 2020 仍然是最后一个分区,但最后一个分区必须是 2021 年。所有销售日期超过 01/01/2022 的数据都将在分区 2020 中,但我预计会在分区 2021 中看到它们。

为什么会这样?

【问题讨论】:

    标签: sql-server partitioning database-partitioning


    【解决方案1】:

    您是否缺少分区 2020 的 N'2021-01-01T00:00:00'?

    USE [testdb]
    GO
    
    BEGIN TRANSACTION
    CREATE PARTITION FUNCTION [byYear](datetime) AS RANGE LEFT FOR VALUES (N'2015-12-31T23:59:59', N'2017-01-01T00:00:00', N'2018-01-01T00:00:00', N'2019-01-01T00:00:00', N'2020-01-01T00:00:00', N'2021-01-01T00:00:00')
    
    CREATE PARTITION SCHEME [years] AS PARTITION [byYear] TO ([PRIMARY], [2016], [2017], [2018], [2019], [2020])
    
    CREATE CLUSTERED INDEX [ClusteredIndex_on_years_636227525068063988] ON [dbo].[ticket2]
    (
        [datesell]
    )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [years]([datesell])
    
    DROP INDEX [ClusteredIndex_on_years_636227525068063988] ON [dbo].[ticket2]
    
    COMMIT TRANSACTION
    GO
    

    【讨论】:

    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 2013-09-13
    • 2012-02-01
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多