日期:2014-05-18  浏览次数:20561 次

如何对一张表进行水平分割 sql2000
现在有一张表,已有上千万条记录,字段包括[主键](自增),[名称],[作用]、[时间]等,查询有点慢,看到论坛有人说水平分割一张表,可以加快搜索,请问怎么做,比如按时间,每年一张表。另外这张表每天都会INSERT上万条记录的,那么到时如何插入,SQL语句怎么写。请各位指导一下。数据库是sql2000。最好有实例,指导一步步操作。光说理论,因为是初学,所以不太能够理解。谢谢。。。

------解决方案--------------------
SQL.Server.2005.70-431.实现与维护.MCTS教程 第六章:分区表

SQL code

--不能为了插入操作而删除索引,因为重建索引会导致表几个小时不能使(不知道创建索引的online选项)
--分区函数不能将函数应用于不是定义为整数数据类型或者不能隐式转换为整数数据类型的列
create partition function partfunc(int) as
range right for values(60,70,90);
--删除分区函数
drop partition function partfunc
--创建数据库,要和分区方案去匹配的
use master
go
create database carla
on primary
(
    name=carla,
    filename='C:\carla.mdf'
),
filegroup fg1
(
    name=fg1,
    filename='C:\fg1.ndf',
    size=2Mb
),
filegroup fg2
(
    name=fg2,
    filename='c:\fg2.ndf',
    size=2mb
),
filegroup fg3
(
    name=fg3,
    filename='D:\fg3.ndf',
    size=2mb
),
filegroup fg4
(
    name=fg4,
    filename='E:\fg4.ndf',
    size=2mb
)
log on
(
    name=carla_log,
    filename='E:\log.ldf',
    size=2mb,
    filegrowth=15%
);
go
-- 创建分区方案,并把他映射到响应的组下
use carla
go
create partition scheme partscheme as
partition partfunc to
(
    fg1,fg2,fg3,fg4
)
go

--查询分区
select * from sys.partition_functions
--查询分区方案,和分区范围值
select * from sys.partition_range_values
--创建分区表
create table sc 
(
    sno int identity(1,1) primary key,
    cno int,
    grade int
)

--插入测试数据
declare @i int=1,@x int=90
while @i<@x
    begin
        insert into sc
        select @i,@x
        set @i=@i+1
    end
select * from dbo.sc

--查看表分区
select * from sys.partitions
where object_id=object_id('dbo.sc')
--第四分区所有数据,因为最大sno 89
select * from dbo.sc
where $partition.partfunc (sno)=3

--为第四分区插入数据
insert into sc
        select 95,80
--查询某个数字在第几分区
select $partition.partfunc(89) as partitionNum

--查询每个分区的行数
select $partition.partfunc(sno) as partitionNum,
COUNT(1) as numRows from dbo.sc
group by $partition.partfunc(sno)
order by $partition.partfunc(sno);

--删除一个边界点
alter partition function partfunc()
MERGE RANGE (90)

--分区的分割合并,合并一个边界点
alter partition function partfunc()
SPLIT RANGE (90)

------解决方案--------------------
查询慢在哪里?可以先把重点放在优化查询语句上,比如索引。SQL2000有些新功能用不上,SQL2005就可以通过复合索引的方式处理WHERE子句后面的字段。
------解决方案--------------------
探讨

抛弃2000吧