Как разбить таблицы по дате? - PullRequest
0 голосов
/ 23 января 2012

Как я могу разбить строки в 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')

Но это не то, что я хочу

я хочу разбить данные на таблицы по возраст . Строки с 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 приходится постоянно перемещать данные.

1 Ответ

0 голосов
/ 02 апреля 2015

Начиная с SQL 2008, вы можете создавать разделы таблицы по неделям или по месяцам в зависимости от того, как часто вы хотите переключать данные. Также обратите внимание на параллельную обработку: если большинство ваших вопросов вызывают три или четыре раздела, тогда одни и те же числовые процессоры начинают работать параллельно для ваших ответов. (Я бы не советовал использовать разделы по дням, потому что предел в 1000 разделов будет достигнут в течение 3 лет).

...