我正在尝试在sql server 2016中创建一个表分区。我基本上需要根据年份和季度进行分区。我们在查询中有两个字段来确定它。 periodenddate,它确定决定季度的年份和财政季度,并且是int字段。 我需要的第二件事是应该从2000年到2070年创建分区 我创建了5个文件组。所以不确定如何在文件组中分配分区
请参阅下面我现有的分区查询。目前只在年内分配并考虑到过去5年。
USE CoreReferenceStaging;
GO
-- Adds five new filegroups to the CoreReferenceStaging database
ALTER DATABASE CoreReferenceStaging
ADD FILEGROUP CT1;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILEGROUP CT2;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILEGROUP CT3;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILEGROUP CT4;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILEGROUP CT5;
-- Adds one file for each filegroup.
ALTER DATABASE CoreReferenceStaging
ADD FILE
(
NAME = ctdata1,
FILENAME = 'M:\Data\MSSQL13.MSSQLSERVER\MSSQL\DATA\ctdata1.ndf',
SIZE = 25MB,
MAXSIZE = 500MB,
FILEGROWTH = 10MB
)
TO FILEGROUP CT1;
ALTER DATABASE CoreReferenceStaging
ADD FILE
(
NAME = ctdata2,
FILENAME = 'M:\Data\MSSQL13.MSSQLSERVER\MSSQL\DATA\ctdata2.ndf',
SIZE = 25MB,
MAXSIZE = 500MB,
FILEGROWTH = 10MB
)
TO FILEGROUP CT2;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILE
(
NAME = ctdata3,
FILENAME = 'M:\Data\MSSQL13.MSSQLSERVER\MSSQL\DATA\ctdata3.ndf',
SIZE = 25MB,
MAXSIZE = 500MB,
FILEGROWTH = 10MB
)
TO FILEGROUP CT3;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILE
(
NAME = ctdata4,
FILENAME = 'M:\Data\MSSQL13.MSSQLSERVER\MSSQL\DATA\ctdata4.ndf',
SIZE = 25MB,
MAXSIZE = 500MB,
FILEGROWTH = 10MB
)
TO FILEGROUP CT4;
GO
ALTER DATABASE CoreReferenceStaging
ADD FILE
(
NAME = ctdata5,
FILENAME = 'M:\Data\MSSQL13.MSSQLSERVER\MSSQL\DATA\ctdata5.ndf',
SIZE = 25MB,
MAXSIZE = 500MB,
FILEGROWTH = 10MB
)
TO FILEGROUP CT5;
GO
CREATE PARTITION FUNCTION financialStatementPartition (datetime)
AS RANGE RIGHT FOR VALUES ();
CREATE PARTITION SCHEME financialStatementRange
AS PARTITION financialStatementPartition
ALL TO ([PRIMARY]);
DECLARE @periodenddate datetime = DATEADD(year, -4, DATEADD(year, DATEDIFF(year, '', GETDATE()), ''));
ALTER PARTITION SCHEME financialStatementRange
NEXT USED CT1;
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@periodenddate);
SET @periodenddate = DATEADD(year, 1, @periodenddate);
ALTER PARTITION SCHEME financialStatementRange
NEXT USED CT2;
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@periodenddate);
SET @periodenddate = DATEADD(year, 1, @periodenddate);
ALTER PARTITION SCHEME financialStatementRange
NEXT USED CT3;
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@periodenddate);
SET @periodenddate = DATEADD(year, 1, @periodenddate);
ALTER PARTITION SCHEME financialStatementRange
NEXT USED CT4;
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@periodenddate);
SET @periodenddate = DATEADD(year, 1, @periodenddate);
ALTER PARTITION SCHEME financialStatementRange
NEXT USED CT5;
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@periodenddate);
CREATE TABLE [dbo].[FinancialStatementIds_Partitioned](
[financialCollectionId] [int] NOT NULL,
[companyId] [int] NOT NULL,
[dataItemId] [int] NOT NULL,
[dataItemName] [varchar](200) NULL,
[dataItemvalue] [decimal](18, 0) NULL,
[unittypevalue] [int] NULL,
[fiscalyear] [int] NULL,
[fiscalquarter] [int] NULL,
[periodenddate] [datetime] NULL,
[filingdate] [datetime] NULL,
[restatementtypename] [varchar](200) NULL,
[latestforfinancialperiodflag] [bit] NULL,
[latestfilingforinstanceflag] [bit] NULL,
[currencyconversionflag] [int] NULL,
[currencyname] [varchar](200) NULL,
[periodtypename] [varchar](200) NULL
) ON financialStatementRange(periodenddate);
GO
INSERT INTO dbo.FinancialStatementIds_Partitioned
SELECT *
FROM dbo.FinancialStatementIds WITH(TABLOCKX);
GO
DROP TABLE dbo.FinancialStatementIds;
GO
EXEC sp_rename N'dbo.FinancialStatementIds_Partitioned', N'FinancialStatementIds';
GO
从2000年到2070年按年分区
CREATE PARTITION SCHEME financialStatementRange
AS PARTITION financialStatementPartition
ALL TO ([PRIMARY]);
DECLARE @StartDate DATE = '20000101'
DECLARE @periodenddate DATE = '20700101'
while( @StartDate < @periodenddate)
begin
ALTER PARTITION SCHEME financialStatementRange
NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION financialStatementPartition()
SPLIT RANGE(@StartDate);
SET @StartDate = DATEADD(year, 1, @StartDate);
end
答案 0 :(得分:0)
检查一下,它可能适合你:
CREATE TABLE dbo.Orders
(
OrderID integer NOT NULL,
Name nvarchar(20) NULL,
OrderDate date NOT NULL,
CONSTRAINT PK__Orders_OrderID
PRIMARY KEY NONCLUSTERED
(OrderID)
ON [PRIMARY]
)
ON PS (OrderDate);
GO
CREATE CLUSTERED INDEX CX__Orders_OrderDate
ON dbo.Orders (OrderDate)
ON PS (OrderDate)