【发布时间】:2012-02-16 09:02:35
【问题描述】:
如何在 SQL Server 中按日期对行进行分区?
奖金聊天
在 SQL Server 中,按年份对表进行分区相对容易,例如:
- 表
Orders_2000 - 表
Orders_2001 - 表
Orders_2002 - ...
- 表
Orders_2011 - 表
Orders_2012
您为每一年创建一个单独的表,确保包含一个带有与该表匹配的检查约束的 Year 列:
CREATE TABLE Transactions_1999 (Year int NOT NULL DEFAULT 1999, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_1999 ADD CONSTRAINT PK_Transactions1999 PRIMARY KEY CLUSTERED (Year, TransactionID)
ALTER TABLE Transactions_1999 ADD CONSTRAINT CK_Transactions1999_Year CHECK (Year = '1999')
CREATE TABLE Transactions_2000 (Year int NOT NULL DEFAULT 2000, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2000 ADD CONSTRAINT PK_Transactions2000 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2000 ADD CONSTRAINT CK_Transactions2000_Year CHECK (Year = '2000')
CREATE TABLE Transactions_2001 (Year int NOT NULL DEFAULT 2001, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2001 ADD CONSTRAINT PK_Transactions2001 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2001 ADD CONSTRAINT CK_Transactions2001_Year CHECK (Year = '2001')
...
CREATE TABLE Transactions_2011 (year int NOT NULL DEFAULT 2011, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2011 ADD CONSTRAINT PK_Transactions2011 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2011 ADD CONSTRAINT CK_Transactions2011_Year CHECK (Year = '2011')
CREATE TABLE Transactions_2012 (Year int NOT NULL DEFAULT 2012, TransactionID int NOT NULL, CustomerName varchar(50))
ALTER TABLE Transactions_2012 ADD CONSTRAINT PK_Transactions2012 PRIMARY KEY (Year, TransactionID)
ALTER TABLE Transactions_2012 ADD CONSTRAINT CK_Transactions2012_Year CHECK (Year = '2012')
然后你可以构造一个VIEW,将表合并到一起:
CREATE VIEW Transactions AS
SELECT * FROM Transactions_1999
UNION ALL
SELECT * FROM Transactions_2000
UNION ALL
SELECT * FROM Transactions_2001
UNION ALL
--...
SELECT * FROM Transactions_2011
UNION ALL
SELECT * FROM Transactions_2012
现在您可以查询此Transactions 视图:
SELECT * FROM Transactions
WHERE (CustomerName LIKE 'boyd%')
OR (CustomerName LIKE '% boyd%')
数据可以插入到视图中,SQL Server 会自动将其放入它应该进入的表中:
INSERT INTO Transactions(Year, TransactionID, CustomerName)
VALUES (2012, 378922384, 'Ian Boyd')
但这不是我想要的
我想按 age 将数据分区到表中。 TransactionDate 超过 90 天的行应该进入一个表,TransactionDate 超过 90 天的事务应该进入另一个表:
- 表
Transactions_olderThan90Days - 表
Transactions_newerThan90Days
SQL 是这样说的:
CREATE TABLE Transactions_NewerThan90Days (
TransactionDate datetime NOT NULL,
TransactionID int NOT NULL,
CustomeName varchar(50))
CREATE TABLE Transactions_OlderThan90Days (
TransactionDate datetime NOT NULL,
TransactionID int NOT NULL,
CustomeName varchar(50))
在 SQL Server 中这样的事情可能吗?
我意识到这听起来不可能,因为这意味着 SQL Server 必须不断移动数据。
【问题讨论】:
-
除非您绝对需要在任何时候第一个表中没有超过 90 天的事务,否则我只会满足于将所有“旧”事务移动到不同表的计划作业。
-
这是不可能的。你还没有解释你希望得到什么。
-
@MartinSmith 在我的真实数据库中,我将有表
Transactions,表Transactions_olderThan90Days,视图为AllTransactions。自发的软件只需要处理 3 个月的数据,我就可以摆脱整个复杂的归档过程。 -
您使用的是 SQL 2000 还是 SQL 2008?表分区不同于分区视图。
-
您希望谁将此移至 data.se?
标签: sql-server sql-server-2000 sql-server-2008-r2 partitioning