设为首页 收藏本站
查看: 1361|回复: 0

[经验分享] MS-Sqlserver大表水平切割自定义方案

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-4-1 08:58:49 | 显示全部楼层 |阅读模式
概述:

    针对某些数据量较大的表,比如几千万的日志数据表,单从源表中查询所需数据(可能包含复杂查询),已经比较慢,所以可以将大表分为多个小表将数据进行水平切割,在此按日期进行切割,用到之前实现的复制库,所有操作在复制库中进行,比如登录日志数据表,每隔5天建立一张新登录表,名称使用LoginLog20150320样式,将5天前的数据导入新表,删除旧表5天前的数据

    STEP1:

        复制库中定义一张日志表,记录生成新表的信息,新建作业每天向新表中导入旧表中的数据,并且将旧表中的数据删除,确保单表的数据量不会过大。
1
2
3
4
5
6
CREATE TABLE [Z_LogCreateTable](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [STable] [nvarchar](50) NOT NULL,
    [DTable] [nvarchar](50) NOT NULL,
    [ExecTime] [date] NOT NULL
)



    STEP2:
        复制库中定义入口存储过程,Z_SP_PartitionTableAndData,判断当前执行时间与上次执行的时间差,如果大于等于5天则生成新表并导入数据,如小于5天则直接导入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
create proc Z_SP_PartitionTableAndData
as
begin
    declare @STableTB_PLogUsersLogin nvarchar(50)
    set @STableTB_PLogUsersLogin='TB_PLogUsersLogin'
    declare @DTableTB_PLogUsersLogin nvarchar(50)
    declare @lastExecTime date
    select @lastExecTime=MAX(ExecTime) from Z_LogCreateTable
    declare @dayInterval int
    select @dayInterval=DATEDIFF(day,@lastExecTime,GETDATE())
    if(@dayInterval>=5)
        begin
            --执行 创建表并且向新表中导入数据
            declare @extTableTag nvarchar(10)
            set @extTableTag=REPLACE(CAST(GETDATE() as DATE),'-','')
            --建表并导入数据
      EXEC Z_SP_CreateTableAndTransferData @extTableTag
        end
    else   
        begin
            --执行 导入数据
            declare @starttime date
            declare @endtime date
            select @DTableTB_PLogUsersLogin =DTable from Z_LogCreateTable where STable=@STableTB_PLogUsersLogin and ExecTime=@lastExecTime
            set @starttime=CAST(GETDATE() as DATE)
            set @endtime=CAST(Dateadd(day,1,GETDATE(  )) as DATE)
            --导入数据
        EXEC Z_SP_TransferData @DTableTB_PLogUsersLogin ,@starttime,@endtime,'LoginDate'
        end
end



        复制库中定义存储过程,Z_SP_CreateTableAndTransferData,动态创建表并导入数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
create proc Z_SP_CreateTableAndTransferData
(
    @extTableTag nvarchar(10)
)
as
begin
    declare @DTableTB_PLogUsersLogin nvarchar(50)
    set @DTableTB_PLogUsersLogin='TB_PLogUsersLogin'+@extTableTag
    declare @createtablesql nvarchar(max)
    set @createtablesql='
        CREATE TABLE [dbo].[TB_PLogUsersLogin'+@extTableTag+'](
            [ID] [int] NOT NULL,
            [UserID] [int] NOT NULL,
            [UserName] [nvarchar](50) NOT NULL,
            [LoginIP] [nvarchar](50) NOT NULL,
            [LoginDate] [datetime] NOT NULL,
            [LoginPosition] [int] NOT NULL
        )'
    --生成新的数据表
        exec(@createtablesql1);
        declare @starttime date
        declare @endtime date
        set @starttime=CAST(GETDATE() as DATE)
        set @endtime=CAST(Dateadd(day,1,GETDATE()) as DATE)
        --向新表中写入数据
        EXEC Z_SP_TransferData @DTableTB_PLogUsersLogin,@starttime,@endtime,'LoginDate'
        insert into Z_LogCreateTable values('TB_PLogUsersLogin',@DTableTB_PLogUsersLogin,CAST(GETDATE() as date))



       复制库中定义存储过程,Z_SP_TransferData,导入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
create proc ZBzw_WSP_TransferData
(
    @tablename nvarchar(50),
    @starttime date,
    @endtime date,
    @timefieldname nvarchar(20)
)
as
begin
    declare @insertdatasql nvarchar(max)
    begin
        set @insertdatasql='
            insert into '+@tablename+'
            select * from '+substring(@tablename,0,LEN(@tablename)-7)+' where '+@timefieldname+' between '''+cast(@starttime as nvarchar(10))+''' and '''+cast(@endtime as nvarchar(10))+''';
            delete from '+substring(@tablename,0,LEN(@tablename)-7)+' where '+@timefieldname+' between '''+cast(@starttime as nvarchar(10))+''' and '''+cast(@endtime as nvarchar(10))+''';
'
    end
    EXEC(@insertdatasql)
end



    STEP3:新建作业,步骤执行存储过程 Z_SP_PartitionTableAndData 每天将新生成的数据导入到新表,并在旧表中将新生成数据删除。应用程序根据时间间隔去不同的数据表中查询数据。

    复制库作为一个查询库存在,所以在源库中的历史数据也可以删除,扩大一点,可以将复制库单独作为一个查询系统存在,将源库上的大表查询去掉,减轻源库的查询负担。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-52682-1-1.html 上篇帖子: MSsql里执行insert时报错“identity_insert off”的解决办法 下篇帖子: SQL Server2014 Cluster安装及配置 切割
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表