读书人

SQLServer 2005 分区表有关问题高手

发布时间: 2012-03-05 11:54:02 作者: rapoo

SQLServer 2005 分区表问题,高手帮忙解惑,等待中。。。。。。。。
USE TEST
--创建文件组
ALTER DATABASE TEST ADD FILEGROUP FG_01
ALTER DATABASE TEST ADD FILEGROUP FG_02
ALTER DATABASE TEST ADD FILEGROUP FG_03

--创建数据文件
ALTER DATABASE TEST ADD FILE (NAME = DF_01,
FILENAME = 'D:\TEST\DF_01.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_01

ALTER DATABASE TEST ADD FILE (NAME = DF_02,
FILENAME = 'D:\TEST\DF_02.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_02

ALTER DATABASE TEST ADD FILE (NAME = DF_03,
FILENAME = 'D:\TEST\DF_03.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_03

--创建分区函数
CREATE PARTITION FUNCTION PF_HIS_HTTP_LOG(datetime)
AS
RANGE LEFT FOR VALUES (
'20070101 23:59:59.997 ',
'20070102 23:59:59.997 ')
--创建分区方案
CREATE PARTITION SCHEME PS_HIS_HTTP_LOG
AS
PARTITION PF_HIS_HTTP_LOG TO
( FG_01, FG_02, [PRIMARY])
--创建分区表
CREATE TABLE HIS_HTTP_LOG
(
USERID varchar(32) , --用户名
USERIP varchar(15) , --用户IP
USERPORT numeric(5,0) , --用户端口
OBJECTIP varchar(15) , --目的IP
OBJECTPORT numeric(5,0) , --目的端口
URL varchar(256) , --URL
HOST varchar(64) , --HOST
DN varchar(64) , --域名
VISITIME numeric(5,0) , --访问次数
STARTIME datetime , --访问起始时间
ENDTIME datetime --访问结束时间
) ON PS_HIS_HTTP_LOG(STARTIME)

--插入数据,分区1 20070101
DECLARE @i int
SET @i = 1
WHILE @i <= 100
BEGIN
INSERT INTO HIS_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ',
6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070101 13:25:26.100 ',121),GETDATE())
SET @i = @i +1
END

--插入数据,分区2 20070102
SET @i = 1
WHILE @i <= 200
BEGIN
INSERT INTO HIS_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ',
6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070102 11:25:26.100 ',121),GETDATE())
SET @i = @i +1


END

--普通表
CREATE TABLE TMP_HTTP_LOG
(
USERID varchar(32) , --用户名
USERIP varchar(15) , --用户IP
USERPORT numeric(5,0) , --用户端口
OBJECTIP varchar(15) , --目的IP
OBJECTPORT numeric(5,0) , --目的端口
URL varchar(256) , --URL
HOST varchar(64) , --HOST
DN varchar(64) , --域名
VISITIME numeric(5,0) , --访问次数
STARTIME datetime , --访问起始时间
ENDTIME datetime --访问结束时间
) ON FG_03

--普通表插入数据 20070103
--DECLARE @i int
SET @i = 1
WHILE @i <= 400
BEGIN
INSERT INTO TMP_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ', 6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070103 09:25:26.100 ',121),GETDATE())
SET @i = @i +1
END

--普通表添加约束
ALTER TABLE TMP_HTTP_LOG
WITH CHECK
ADD CONSTRAINT CK001
CHECK (STARTIME > = '20070103 00:00:00.000 '
AND STARTIME <= '20070103 23:59:59.997 ')

--拆分分区,移入分区操作
ALTER PARTITION SCHEME PS_HIS_HTTP_LOG NEXT USED FG_03
ALTER PARTITION FUNCTION PF_HIS_HTTP_LOG() SPLIT RANGE ( '20070103 23:59:59.997 ')
ALTER TABLE TMP_HTTP_LOG SWITCH TO HIS_HTTP_LOG PARTITION 3

为什么“ALTER TABLE TMP_HTTP_LOG SWITCH TO HIS_HTTP_LOG PARTITION 3” 错了呢
错误信息:
消息 4972,级别 16,状态 1,第 1 行
ALTER TABLE SWITCH 语句失败。源表 'TEST.dbo.TMP_HTTP_LOG ' 的检查约束或分区函数所允许的值是目标表 'TEST.dbo.HIS_HTTP_LOG ' 的检查约束或分区函数所不允许的值。



[解决办法]



USE TEST
--创建文件组
ALTER DATABASE www_szweb ADD FILEGROUP FG_01
ALTER DATABASE www_szweb ADD FILEGROUP FG_02
ALTER DATABASE www_szweb ADD FILEGROUP FG_03

--创建数据文件
ALTER DATABASE www_szweb ADD FILE (NAME = DF_01,
FILENAME = 'g:\aaa\DF_01.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_01

ALTER DATABASE www_szweb ADD FILE (NAME = DF_02,
FILENAME = 'g:\aaa\DF_02.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_02

ALTER DATABASE www_szweb ADD FILE (NAME = DF_03,
FILENAME = 'g:\aaa\DF_03.ndf ',
SIZE = 10MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 10MB)
TO FILEGROUP FG_03

--创建分区函数
CREATE PARTITION FUNCTION PF_HIS_HTTP_LOG(datetime)
AS
RANGE LEFT FOR VALUES (
'20070101 23:59:59.997 ',
'20070102 23:59:59.997 ')


--创建分区方案
CREATE PARTITION SCHEME PS_HIS_HTTP_LOG
AS
PARTITION PF_HIS_HTTP_LOG TO
( FG_01, FG_02, [PRIMARY])
--创建分区表
CREATE TABLE HIS_HTTP_LOG
(
USERID varchar(32) , --用户名
USERIP varchar(15) , --用户IP
USERPORT numeric(5,0) , --用户端口
OBJECTIP varchar(15) , --目的IP
OBJECTPORT numeric(5,0) , --目的端口
URL varchar(256) , --URL
HOST varchar(64) , --HOST
DN varchar(64) , --域名
VISITIME numeric(5,0) , --访问次数
STARTIME datetime NOT NULL , --访问起始时间
ENDTIME datetime NOT NULL , --访问结束时间
) ON PS_HIS_HTTP_LOG(STARTIME)


--插入数据,分区1 20070101
DECLARE @i int
SET @i = 1
WHILE @i <= 100
BEGIN
INSERT INTO HIS_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ',
6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070101 13:25:26.100 ',121),GETDATE())
SET @i = @i +1
END

--插入数据,分区2 20070102
DECLARE @i int
SET @i = 1
WHILE @i <= 200
BEGIN
INSERT INTO HIS_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ',
6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070102 11:25:26.100 ',121),GETDATE())
SET @i = @i +1
END

--普通表_IN
CREATE TABLE TMP_HTTP_LOG
(
USERID varchar(32) , --用户名
USERIP varchar(15) , --用户IP
USERPORT numeric(5,0) , --用户端口
OBJECTIP varchar(15) , --目的IP
OBJECTPORT numeric(5,0) , --目的端口
URL varchar(256) , --URL
HOST varchar(64) , --HOST
DN varchar(64) , --域名
VISITIME numeric(5,0) , --访问次数
STARTIME datetime not null, --访问起始时间
ENDTIME datetime not null --访问结束时间
) ON FG_03


--普通表插入数据 20070103
DECLARE @i int
SET @i = 1
WHILE @i <= 400
BEGIN
INSERT INTO TMP_HTTP_LOG VALUES(CAST(@i AS varchar(32)), '192.168.1.1 ',5, '202.103.1.57 ', 6, 'http://sina.com.cn ', ' ', 'www.sohu.com ',11,CONVERT(datetime, '20070103 09:25:26.100 ',121),GETDATE())
SET @i = @i +1
END

--普通表添加约束
ALTER TABLE TMP_HTTP_LOG
WITH CHECK
ADD CONSTRAINT CK001
CHECK (STARTIME > = '20070103 00:00:00.000 '
AND STARTIME <= '20070103 23:59:59.997 ')


--普通表out
CREATE TABLE TMP_HTTP_LOG_OUT
(
USERID varchar(32) , --用户名
USERIP varchar(15) , --用户IP
USERPORT numeric(5,0) , --用户端口
OBJECTIP varchar(15) , --目的IP
OBJECTPORT numeric(5,0) , --目的端口
URL varchar(256) , --URL
HOST varchar(64) , --HOST
DN varchar(64) , --域名
VISITIME numeric(5,0) , --访问次数
STARTIME datetime not null , --访问起始时间
ENDTIME datetime not null --访问结束时间
) ON FG_01


--普通表添加约束
ALTER TABLE TMP_HTTP_LOG_OUT
WITH CHECK
ADD CONSTRAINT CK002
CHECK (STARTIME > = '2007-01-01 00:00:00.000 '
AND STARTIME <= '2007-01-01 23:59:59.997 ')


--拆分分区,移入分区操作
--移出旧数据,放入第二个分段表中。
ALTER TABLE HIS_HTTP_LOG
SWITCH PARTITION 1
TO TMP_HTTP_LOG_OUT
GO


--更改分区函数以删除 20070101的边界点。
ALTER PARTITION FUNCTION PF_HIS_HTTP_LOG()
MERGE RANGE ( '20070101 23:59:59.997 ')
GO

--此操作还会删除文件组与分区架构之间的关联。具体来说,FG1 将不再是分区架构的一部分。因为您将滚动相同的现有 24 个分区的新数据,所以需要使 FG1 成为“下一个使用的”分区,此分区将是下一个用于拆分的分区。
ALTER PARTITION SCHEME PS_HIS_HTTP_LOG
NEXT USED [FG_03]
GO

--更改分区函数,为 20070103添加新的边界点。


ALTER PARTITION FUNCTION PF_HIS_HTTP_LOG()
SPLIT RANGE ( '20070103 23:59:59.997 ')

--更改基础表的约束定义(如果存在),
--以允许新范围的数据。因为添加约束的代价可能很昂贵(需要验证数据),
--所以最好的做法是继续扩大日期范围,而不是删除并重新创建约束。
--现在,只存在一个约束 (OrdersRangeYearCK),但以后将存在两个约束。
ALTER TABLE HIS_HTTP_LOG
WITH CHECK
ADD CONSTRAINT CK003
CHECK (STARTIME > = '2007-01-01 00:00:00.000 '
AND STARTIME <= '2007-01-03 23:59:59.997 ')


--从第一个分段表中移入新数据。
ALTER TABLE TMP_HTTP_LOG SWITCH TO HIS_HTTP_LOG PARTITION 2
GO

--查询分区表数据
SELECT $partition.PF_HIS_HTTP_LOG(o.STARTIME)
AS [Partition Number]
, min(o.STARTIME) AS [Min Order Date]
, max(o.STARTIME) AS [Max Order Date]
, count(*) AS [Rows In Partition]
FROM dbo.HIS_HTTP_LOG AS o
GROUP BY $partition.PF_HIS_HTTP_LOG(o.STARTIME)
ORDER BY [Partition Number]

读书人网 >SQL Server

热点推荐