IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N't_english_2007'))drop table t_english_2007create table t_english_2007([id][int] ,[c_name][varchar] (50),[e_name][varchar](50),[createdate][datetime] NULL)
insert into  t_english_2007
select 1, '蜘蛛','spide','2007-04-21 14:43:11.060' union all
select 2, '鳄鱼','caymen','2007-04-21 08:15:47.857' union all
select 3, '长颈鹿','griafee','2007-04-21 08:17:40.343' union all
select 4, '星期三','wednesday','2007-04-21 08:19:08.827' union all
select 5, '太平洋','pacific','2007-04-21 08:19:24.293' union all
select 6, '大西洋','atlantic','2008-07-30 10:42:23.420' union all
select 7, '北冰洋','arctic','2008-07-30 10:42:59.547' union all
select 8, '三月','march','2008-07-30 10:44:12.607' union all
select 9, '九月','september','2008-07-30 10:44:32.857' union all
select 10, '十月','October','2008-07-30 10:44:45.513' 
go
select * from t_english_2007IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N't_english_2008'))drop table t_english_2008
create table t_english_2008([id][int] ,[c_name][varchar] (50),[e_name][varchar](50),[createdate][datetime] NULL)
insert into t_english_2008
select * from t_english_2007 where createdate>'2008'
select * from t_english_2008----------------------------------------------------------------------
因为t_english这个表数据每年增长很快,我想试着做一下分区表,我把我的意思大致表达一下,因为从来
没涉及过分区表,所以有很多肯定没考虑到,希望大家指出。创建了如上的表后,这时前台就访问t_english_2008,若找不到数据就开始访问t_english_2007;
到了2009年下半年,程序又开始创建新表t_english_2009,把2009年的数据先拷贝进来,
然后主要对t_english_2009进行超作,若访问不到数据就在向上访问,因为用户大部分都是访问现在的数据。
因为我们现在有一个2千万的数据好慢,主管让我们解决。我大致想好了这样做,大家告诉我有什么必须注意的问题?是不是这样做?

解决方案 »

  1.   

    建议使用历史表,,,
    t_english_history --存储往年的记录
    t_english --存储今年的记录
      

  2.   

    数据按年分割是没什么问题的,具体你想什么时候做,可以根据自己的需求来确定
    但对于查询,你可以创建一个分区视图,UNION ALL各个表,
    SQL Server 查询优化器可以识别 SELECT 语句中其搜索条件为仅引用 满足条件的表中的行。因此,它将其搜索范围限制在这些表。更多细节,你可以参考帮助文档关于"分区视图"的说明
      

  3.   

    2005 可以直接用分区表, 一张表就可以了, 建立分区函数和分区架构去做分区
    2000 可以用分区视图, 需要注意的是需要为每个表的分区列设置约束, 然后建立一个视图去 UNION ALL 这些表, 这样基于分区列上的查询可以通过约束知道该访问哪张表, 不用在查询前判断
      

  4.   

    --如果,不做分區表,使用前做判斷
    declare @tbname varchar(15)
    set @tbname='t_english_2008'
    if exists(select * from sysobjects where type='u' and name=@tbname)
       exec('select * from '+@tbname)
    else
      begin
       set @tbname=left(@tbname,10)+ltrim(cast(right(@tbname,4)as int)-1)
       exec('select * from '+@tbname)
      end