现在有一张表,已有上千万条记录,字段包括[主键](自增),[名称],[作用]、[时间]等,查询有点慢,看到论坛有人说水平分割一张表,可以加快搜索,请问怎么做,比如按时间,每年一张表。另外这张表每天都会INSERT上万条记录的,那么到时如何插入,SQL语句怎么写。请各位指导一下。数据库是sql2000。最好有实例,指导一步步操作。光说理论,因为是初学,所以不太能够理解。谢谢。。。
------解决方案--------------------
SQL.Server.2005.70-431.实现与维护.MCTS教程 第六章:分区表
- SQL code
--不能为了插入操作而删除索引,因为重建索引会导致表几个小时不能使(不知道创建索引的online选项)--分区函数不能将函数应用于不是定义为整数数据类型或者不能隐式转换为整数数据类型的列create partition function partfunc(int) asrange right for values(60,70,90);--删除分区函数drop partition function partfunc--创建数据库,要和分区方案去匹配的use mastergocreate database carlaon 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 carlagocreate partition scheme partscheme aspartition 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=90while @i<@x begin insert into sc select @i,@x set @[email protected]+1 endselect * from dbo.sc--查看表分区select * from sys.partitionswhere object_id=object_id('dbo.sc')--第四分区所有数据,因为最大sno 89select * from dbo.scwhere $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.scgroup 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子句后面的字段。
------解决方案--------------------