首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQLServer 2005 分区表有关问题,高手帮忙解惑,等待中。

2012-03-05 
SQLServer 2005 分区表问题,高手帮忙解惑,等待中。。。。。。。。USETEST--创建文件组ALTERDATABASETESTADDFILEGRO

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]

热点排行