First of all, three tables are created with the same structure for the months: Jan/2012, Feb/2012 and Mar/2012.
Constraint check will keep each table with its respectively data on insert. It seems to work on update as well, but further tests are needed to ensure.
CREATE TABLE [dbo].[Data_2012_01]
(
[DateTime] DATETIME2(3) NOT NULL,
[TagId] INT NOT NULL,
CONSTRAINT CK_Data_2012_01 CHECK ([DateTime] >= CAST('2012-01-01' AS DATETIME2) AND [DateTime] < CAST('2012-02-01' AS DATETIME2)),
[Value] FLOAT NOT NULL
CONSTRAINT PK_Data_2012_01 PRIMARY KEY ([DateTime], [TagId])
)
CREATE TABLE [dbo].[Data_2012_02]
(
[DateTime] DATETIME2(3) NOT NULL,
[TagId] INT NOT NULL,
CONSTRAINT CK_Data_2012_02 CHECK ([DateTime] >= CAST('2012-02-01' AS DATETIME2) AND [DateTime] < CAST('2012-03-01' AS DATETIME2)),
[Value] FLOAT NOT NULL
CONSTRAINT PK_Data_2012_02 PRIMARY KEY ([DateTime], [TagId])
)
CREATE TABLE [dbo].[Data_2012_03]
(
[DateTime] DATETIME2(3) NOT NULL,
[TagId] INT NOT NULL,
CONSTRAINT CK_Data_2012_03 CHECK ([DateTime] >= CAST('2012-03-01' AS DATETIME2) AND [DateTime] < CAST('2012-04-01' AS DATETIME2)),
[Value] FLOAT NOT NULL
CONSTRAINT PK_Data_2012_03 PRIMARY KEY ([DateTime], [TagId])
)
Second, a view is created: CREATE VIEW [dbo].[Data] WITH SCHEMABINDING AS SELECT [DateTime], [TagId], [Value] FROM [dbo].[Data_2012_01] UNION ALL SELECT [DateTime], [TagId], [Value] FROM [dbo].[Data_2012_02] UNION ALL SELECT [DateTime], [TagId], [Value] FROM [dbo].[Data_2012_03]Third (optional), some data are inserted into that view:
INSERT INTO [dbo].[Data] ([DateTime], [TagId], [Value])
VALUES ('2012-01-01', 1, 1)
INSERT INTO [dbo].[Data] ([DateTime], [TagId], [Value])
VALUES ('2012-02-01', 1, 1)
INSERT INTO [dbo].[Data] ([DateTime], [TagId], [Value])
VALUES ('2012-03-01', 1, 1)
At last, execution plan is checked to ensure performance gain. SELECT [DateTime], [TagId], [Value] FROM [dbo].[Data_2012_02] WHERE [DateTime] BETWEEN '2012-02-03' AND '2012-02-04' SELECT [DateTime], [TagId], [Value] FROM [dbo].[Data] WHERE [DateTime] BETWEEN '2012-02-03' AND '2012-02-04'
Regardless all unions, the view searched just in the right tables.
