【问题标题】:How to partition tables by date?如何按日期对表进行分区?
【发布时间】: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


【解决方案1】:

从 SQL 2008 开始,您可以按周或按月创建表分区,具体取决于您希望切换数据的频率。也看看并行处理,如果您的大多数问题都调用三个或四个分区,那么相同数量的处理器开始并行工作以获得您的答案。 (我不建议每天使用分区,因为 1000 个分区的限制会在 3 年内达到)。

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多