SQLSERVER数据库表各种同步技术
1 --SQLSERVER数据库表各种同步技术 减少SQLServer中每次的同步数据量
2
3 --说到数据库,我就不由地想到同步数据,如何尽可能地减少每次的同步数据量,以此来提高同步效率,降低对网络带宽的消耗是我们使用者所关心的。对于大批量的数据同步,这一点是应引起重视的。获取差异数据是解决这个问题的关键点,即我们仅仅同步变化了的数据,至于没有变化的,就不再同步。对于减少每次同步数据量,以下提供了6个方法:
4 --
5 --1、日期栏位(时间戳)
6 --
7 --一般情况下,在设计表的时候,添加两个日期栏位,createdOn, ChangedOn, 分别记录数据产生时间和变更时间。同步程序可以根据两个栏位来获取差异的数据。
8 --
9 --2、Trigger
10 --
11 --它可以实时获取差异数据, Trigger使用较为容易,不需要改变原表的结构,可以只监视部分的栏位变更,以获取你需要的变化数据,并对数据做二次处理。Trigger需要你对源表的维护状况比较了解,否则可能产生一些意想不到的影响。
12 --
13 --3、SQLServer本身的复制服务
14 --
15 --本身支持多种数据同步方式,功能很强大,但是使用上会比较复杂,而且如果在同步过程中,需要对差异数据做二次处理,似乎无路可走。
16 --
17 --这种方法可以保证随时获取某个时间段内新增(变化)的数据,同时对于追踪问题也大有裨益。但是缺陷也不少,其一是这两个栏位完全由开发人员控制,切实保证这两个栏位每次都得到正确的维护比较困难,其二是不容易确定你下一次取差异数据的基准时间。
18 --
19 --4、timestamp栏位
20 --
21 --timestamp可以理解为行的版本号,每次插入或更新包含 timestamp 列的行时,timestamp 列中的值均会更新。利用这一特性,建立一个包含源表ID和timestamp值的基准表,就可以找到哪些数据发生变化了,每次同步成功后,再更新该基准表。
22 --
23 --5、监控并记录基于某数据对象的所有DML语句
24 --
25 --这种方法,我没有具体尝试过,但是一个很不错的思路,如果网络状况糟糕,而且对数据实时性要求不高,可以采用。具体做法是每天定时获取你需要同步表的所有update, delete语句,然后定点打包发送到另外一台服务器执行。
26 --
27 --6、使用BINARY_CHECKSUM
28 --
29 --这个是我认为最简单的方法。BINARY_CHECKSUM是SQLServer内置的一个聚合函数,它可以针对一行,或者某些列计算出一个值,如果它计算的那些列中的任何一个值发生变化,那么那个计算值就会发生变化。这样我只要建立一个包含源表ID和最初计算值的基准表,就可以找到哪些数据发生变化了,每次同步成功后,再更新该基准表。与方法4不同的是,BINARY_CHECKSUM可以只监视部分变化的栏位,这一点又类似于Trigger了。
30 --
31 --使用BINARY_CHECKSUM有些限制,因为它在计算中会忽略具有不可比数据类型的列(不可比数据类型是 text、ntext、image、cursor 以及基本类型为前4个数据类型之一的 sql_variant),所以如果要监控这些列变化,这种方法是不起作用的。
SQLSERVER数据库表各种同步技术的更多相关文章
- SqlServer数据库表生成C# Model实体类SQL语句——补充
在sql语句最前边加上 use[数据库名] 原链接:https://www.cnblogs.com/jhli/p/11552105.html --[SQL骚操作]SqlServer数据库表生成C ...
- SqlServer数据库表导入SqlLite数据库表保持日期时间类型字段的格式
在写查询功能的过程中遇到一个这样的问题:按日期范围查询,sql语句是:where dt>=用户选择起始日期&&dt<=用户选择结束日期.数据库中的数据如图1,我选择的测试数 ...
- 用sql语句生成sqlserver数据库表的数据字典
THEN O.name ELSE N'' END, 表描述 THEN PTB.[value] END,N''), 字段序号=C.column_id, 字段名称=C.name, 字段描述=ISNULL( ...
- 用SqlBulkCopy批量插入数据到SqlServer数据库表中
首先创建一个数据库连接类:SQLHelper using System; using System.Collections.Generic; using System.Linq; using Syst ...
- 监控SQLServer 数据库表每天的空间变化情况
阅读完桦仔的<分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)>后,我想使用文中提供的代码做一个统计表每天的新增行数及新增存储空间的功能 实现步骤如下: 1 ...
- sqlserver 数据库表分区
参考文档 https://msdn.microsoft.com/zh-cn/library/ms345146(SQL.90).aspx http://blog.sina.com.cn/s/blog_4 ...
- 解决sqlserver数据库表空间不自动释放问题
在项目中遇到了sql server数据库经过频繁地删减数据后,查询变慢的问题. 我把数据导到另一个库中,发现查询就很快. 查了下原因,根本原因是删除数据并不释放表空间,日志文件太过巨大的原因. 网上查 ...
- mysql导入sqlserver数据库表
原文:https://zhidao.baidu.com/question/1114325744502691499.html 在Navicat for MySQL 管理器中,创建目标数据库(注意:因为是 ...
- 查看SQLServer数据库表占用大小
查看数据库mdf 文件中 各个表数据占用大小. create table #t(name varchar(255), rows bigint, reserved varchar(20), ...
随机推荐
- AndroidTouchGalleryLibrary 优化
AndroidTouchGalleryLibrary 是一个非常好用的库, 但是使用的时候,需要小心处理,容易引发OutOfMemoryError,同时使用UrlTouchImageView的时候, ...
- ux.form.field.Verify 验证码控件
//验证码控件 Ext.define('ux.form.field.Verify', { extend: 'Ext.container.Container', alias: ['widget.fiel ...
- 年底奉献-QT编写视频监管平台(开源)
忙忙碌碌又是一年,算算自己毕业四年半,一直在现在这家公司做研发外加总经理助理,研发起初用的VB.NET,而后全面转为C#,最后又全面转为QT,都是由于项目需要,算下来自己搞QT编程也已经四年了,201 ...
- C# 类型基础——你可能忽略的技术细节
引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone 其实也就是对象复制.复制又分为了浅度 ...
- Android源码下载并绑定到Eclipse中
在Windows下,通过SDK Manager.exe更新下载的Android,是不带源码的,我们开发开发起来不是很方便: 其实Android的源代码是可以下载的,其源代码入在http://andro ...
- c++ 模板元编程的一点体会
趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...
- Network - 工具列表
Tcpdump homepage - tcpdump wiki - tcpdump Wireshark homepage - wireshark wiki - wireshark Fiddler ho ...
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...
- SQL Server中的事务日志管理(4/9):简单恢复模式里的日志管理
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- python面向对象编程(上)
面向对象编程(OOP,Object Oriented Programming)是每一个高级编程语言都支持的编程方法,比如JAVA/C++/C#等等.学习面向对象编程是每一个程序员都绕不开的重点内容. ...