本帖最后由 yxb2012 于 2012-08-06 14:47:15 编辑

解决方案 »

  1.   

    这种对统计要求高,要求全的需求,最好就是使用SSAS来做,建立合适的维度,使用ETL设置成自动作业方式更新数据到OLAP,然后针对OLAP读取数据进行统计,尽可能减少对OLTP的影响。后期还可以使用SSRS生成各种报表,或者供其他BI工具进行二次开发。
      

  2.   

    如果涉及到保留历史数据,那么建议做分区表。不保留的话,一年365天,每天10w,不过也才365x10w=3650w
    索引设计的合理,硬件条件保证,不需要用分区表也能做好的个人愚见
      

  3.   

    至于现实,哪个用户会让你夜歌页面给他显示10w条数据?分也是必须的
    怎么实现分页呢?这个我这里给你一个例子:
    USE Employee
    GO
    IF OBJECT_ID('Employee.UP_Get_tRewardAndPunishment') IS NOT NULL
    DROP PROC Employee.UP_Get_tRewardAndPunishment
    GO
    CREATE PROC Employee.UP_Get_tRewardAndPunishment
    (
    @V_sNbid varchar(30), --网吧编号
    @V_PageIndex int=0, --当前页
        @V_PageCount int=10, --每页多少条当前第几页
        @OV_iReturnValue int = 0 OUTPUT, --状态:0表示正确执行  200表示操作失败
    @OV_sReturnText varchar(100)='' OUTPUT, --错误文本,返回具体错误
    @OV_iTotalRow int=0 OUTPUT --总共多少条数据
    )
    AS
    /*
    过程描述:IM留言报表查询
    接口目的:获取指定网吧的IM留言报表
    业务逻辑:传入网吧帐号,按照时间降排列IM留言报表

    传入参数:

    @V_snbid  varchar(30) 网吧账号
    @V_PageIndex  int=0                  当前页
        @V_PageCount  int=10                 每页多少条当前第几页
        
        输出参数:
        
    @OV_iReturnValue  0为执行成功;      200:操作失败 
    @OV_sReturnText  返回具体的执行消息
    @OV_iTotalRow  int                     总共多少条数据

    返回结果:

    sFlow  varchar(12)  流程号
    iType  tinyint  类型(0:奖励  1:惩罚)
    sName1  varchar(8)  员工姓名
    iMoney  numeric(12,2)  钱
    sContent  varchar(150)  备注
    dtInsert  datetime  录入日期
    sName2  varchar(8)  操作员姓名
    */
    BEGIN
    SET NOCOUNT OFF
    SELECT @OV_iReturnValue = 0
    SELECT @OV_sReturnText = '查询IM某网吧员工奖惩报表成功'
    /*获取指定网吧账号下的员工奖惩数据总条数*/
    SELECT 
    @OV_iTotalRow = COUNT(1) 
    FROM 
    Employee.tRewardAndPunishment(NOLOCK) 
    WHERE 
    sNbid = @V_snbid
    PRINT @OV_iTotalRow
    ;WITH T
    AS
    (

    SELECT
    RowId=ROW_NUMBER()OVER(Order BY dtInsert DESC),
    sFlow,
    iType,
    sName1,
    iMoney,
    sContent,
    dtInsert,
    sName2
    FROM
    Employee.tRewardAndPunishment
    WHERE
    sNbid = @V_snbid

    )
    SELECT
    sFlow,
    iType,
    sName1,
    iMoney,
    sContent,
    dtInsert,
    sName2
    FROM
    T
    WHERE
    RowId > @V_PageIndex*@V_PageCount 
    AND  RowId <= (@V_PageIndex+1)*@V_PageCount
    SET NOCOUNT OFF
    END
    GO--这个应该可以看懂的吧
      

  4.   

    telerik软件提供的RadgridView用来显示数据效果不错。
      

  5.   


    虽然目前表里的数据量不大,但是考虑到以后数据的不断增加。目前还是想把数据表分区,暂时想分两个区,通过一个bit标志将数据分开。(具体这个bit也是根据某个日期点去设置的,比如说一年)
    bit=0的数据可以让他查具体的数据。
    bit=1的数据做为历史数据。然后就是做每日的汇总,将汇总的结果放到另一张些汇总表中存放,以便读取。
    至于当日的数据及汇总数据,就只能通过即时的执行存储过程去获取了。不知道这样可不可行,麻烦再指点下!