如果你的需求不需要非常实时的统计,那你可以用固定表,做个job每天晚上统计插入,如果你的需求必须完全实时准确的统计,你只有在设计表和建索引上下工夫了!

解决方案 »

  1.   

    对于各种汇总数据和结算的数据,应该保存到固定的表中或固定的字段中,不要时实时查询,添加数据时重新更新汇总数据的表。我觉得应该把数据纵向分割一下,每个月有每个月的,要汇总一年的数据时把12个月的Union起来,这样查询和插入感觉都要快一点。
      

  2.   

    测试过程:环境:
    PIII900 128M
    win2000+sql server2000企业版
    table name :t_data
    CLUSTERED PRIMARY KEY  :id
    Rows:441000语句1:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 60000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:390ms语句2:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 100000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:4s语句3:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 150000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:5s语句4:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 200000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:6s语句5:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 250000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:过了15m没有出来,中断语句6:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 300000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:过了20m没有出来,中断语句7:
    select top 60000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:20s语句8:
    select top 100000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:21s语句9:
    select top 150000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:23s语句10:
    select top 200000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:24s语句11:
    select top 250000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:26s语句12:
    select top 300000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:28s语句13:
    select top 400000 id  into #a from t_data order by id asccreate index ind_a_base_id on #a(id)  select * from t_data where 
    id in (select top 10 id  from #a order by id desc)
    order by id asc时间:29s语句14:
    select * from t_data where 
    id in
    (select top 10 id  from t_data where id in
    (select top 250000 id  from t_data order by id asc)
    order by id desc)
    order by id asc时间:过了25m没有出来,还没有中断