当前位置: 首页 > news >正文

Distributed3:SQL Server 创建分布式数据库

分布式数据库的优势是将IO分散在不同的Physical Disk上,每次查询都由多台Server的CPU,I/O共同负载,通过各节点并行处理数据来提高性能,劣势是消耗大量的网络带宽资源,管理难度大。在SQL Server 2012 版本中,创建水平切分的分布式数据库,必须分两步来实现:划分子集和对子集进行并集操作。

划分子集是将原始表水平切分成若干个较小的成员表,每一个成员表都是全集的一个划分(各子集的并集是全集,其交集是空集)。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则),成员表的schema和原始表相同,只是存储的数据不同。水平切分原始表,也叫做数据库水平分片,sharding。在查询时,利用分区视图来实现水平分片对用户透明,分区视图对分布在不同服务器中的分区数据进行并集操作,使数据看起来来自一个表。

分布在不同场地的SQL Server通过Linked Server相互通信,通过MSDTC来保证查询的事务特性。Linked Server定义从某一数据库服务器到另一数据库服务器的单向通信路径,而MSDTC能够保证一个事务在不同的Server上实现ACID属性。例如,在一个事务中存在 Server1上的 Insert 操作和 Server2上 Update 操作 ,如果事务回滚,那么MSDTC保证Server1 和 Server2的操作都要回滚;如果事务提交,MSDTC保证Server1 和 Server2的操作都要Commit。

 

设计目的:将table dbo.Person 的数据水平分片,分布到两天SQL Server上,Column [PersonType] 共有6个值,分别是:('IN','EM','SP'),('SC','VC','GC'); 

复制代码
CREATE TABLE [dbo].[Person]
(
    [PersonID] [int] NOT NULL,
    [PersonType] [nchar](2) NOT NULL,
    [FirstName] [sysname] NOT NULL,
    [MiddleName] [sysname] NOT NULL,
    [LastName] [sysname] NOT NULL
)
复制代码


step1,打开Win10 MSDTC(Microsoft Distributed Transaction Coordinator)

参考《Win10 打开MSDTC》,不再赘述。

step2,分别在两台Server上创建数据库和表,数据库分别是DBtest1 和 DBTest2,将DBTest1作为Master DB,将DBTest2作为Slave DB。

复制代码
--default instance
CREATE TABLE [dbo].[Person](
    [PersonID] [int] NOT NULL,
    [PersonType] [nchar](2) NOT NULL,
    [FirstName] sysname,
    [MiddleName] sysname ,
    [LastName] sysname,
    constraint   chk__Person_PersonType check([PersonType] in ('IN','EM','SP')) 
);

--named instance
CREATE TABLE [dbo].[Person](
    [PersonID] [int] NOT NULL,
    [PersonType] [nchar](2) NOT NULL,
    [FirstName] sysname,
    [MiddleName] sysname ,
    [LastName] sysname,
    constraint   chk__Person_PersonType check([PersonType] in ('SC','VC','GC')) 
);
复制代码


Step3,在Master DB中,添加Linked Server

复制代码
--add linked server
exec sys.sp_addlinkedserver @server= N'db1'
,@srvproduct= N'' ,@provider= N'SQLNCLI' ,@datasrc= N'LJHPC\NamedInstance1' ,@location= null ,@provstr= null ,@catalog= N'dbtest2' --check select * from sys.servers where is_linked=1 --drop linked server --EXEC sys.sp_dropserver @server=N'db1', @droplogins='droplogins' --add login exec sp_addlinkedsrvlogin @rmtsrvname = 'db1' ,@useself=false ,@locallogin=null ,@rmtuser ='sa' ,@rmtpassword='sa'
复制代码


step4,创建分布式水平分区视图

复制代码
create view dbo.view_Person
as
    select [PersonID]
          ,[PersonType]
          ,[FirstName]
          ,[MiddleName]
          ,[LastName]
    from [dbo].[Person]  with(nolock)
    where [PersonType] in('IN','EM','SP')
    union all
    select [PersonID]
          ,[PersonType]
          ,[FirstName]
          ,[MiddleName]
          ,[LastName]
    from db1.[DBTest2].[dbo].[Person] with(nolock)
    where [PersonType] in('SC','VC','GC')
    with check OPTION;
复制代码

Step5,查询分布式数据,查看执行计划

SELECT *
from dbo.view_Person p 
where p.PersonType in ('em','sc')

 

Step6,优化

分布式事务使用的资源远大于内部事务,通常使用OPENQUERY等相关行集函数,避免过度依赖分布式事务。

1,使用OpenQuery,避免DTC的干预

复制代码
create view dbo.view_Person
as
    select [PersonID]
          ,[PersonType]
          ,[FirstName]
          ,[MiddleName]
          ,[LastName]
    from [dbo].[Person]  with(nolock)
    where [PersonType] in('IN','EM','SP')
    union all
    select [PersonID]
              ,[PersonType]
              ,[FirstName]
              ,[MiddleName]
              ,[LastName]
    from OPENQUERY ( db1 ,
        N'select [PersonID]
              ,[PersonType]
              ,[FirstName]
              ,[MiddleName]
              ,[LastName]
        from db1.[DBTest2].[dbo].[Person] with(nolock)
        where [PersonType] in(''SC'',''VC'',''GC'')' ) as p
    with check OPTION;
复制代码


2,在Local Server上更新分片数据

复制代码
update db1.DBTEST2.dbo.person 
   set FirstName=N'Harm' 
where PersonId=102;

--修改成
exec db1.DBTEST2.sys.sp_executesql N'update dbo.person 
   set FirstName=N''Harm'' 
   where PersonId=102;'
复制代码

 

Appendix

复制代码
--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries'  
exec sp_configure 'show advanced options',1 
reconfigure 
exec sp_configure 'Ad Hoc Distributed Queries',1 
reconfigure 
--使用完成后,关闭Ad Hoc Distributed Queries: 
exec sp_configure 'Ad Hoc Distributed Queries',0 
reconfigure 
exec sp_configure 'show advanced options',0 
reconfigure 
复制代码

 

参考doc:

Top 3 Performance Killers For Linked Server Queries

作者: 悦光阴
出处: http://www.cnblogs.com/ljhdo/
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: 数据库管理





本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5597222.html,如需转载请自行联系原作者

相关文章:

  • C#-属性
  • 2的幂的合并运算实例
  • 【curl】cookie的分隔符
  • 从零开始学数据库(一)——安装、启动、进入、创建表、检查表结构、类型说明、更改表项名、插入值...
  • Ruby之基本数据类型(三)
  • 机器学习:eclipse中调用weka的Classifier分类器代码Demo
  • 线程同步工具(一)控制并发访问资源
  • Solr schema编写指导
  • Azkaban的Web Server源码探究系列14:创建Project
  • 成都Uber优步司机奖励政策(4月11日)
  • Tomcat6.0数据源配置
  • 同步和Java内存模型(四)有序性
  • git命令的简单使用
  • lintcode:买卖股票的最佳时机 I
  • PHP处理一个5G文件,使用内存512M的,数据为整形,从大到小排序,优化排序算法...
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • IDEA 插件开发入门教程
  • Linux gpio口使用方法
  • MD5加密原理解析及OC版原理实现
  • Python socket服务器端、客户端传送信息
  • Python爬虫--- 1.3 BS4库的解析器
  • React-生命周期杂记
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 解析 Webpack中import、require、按需加载的执行过程
  • 前端相关框架总和
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • nb
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​什么是bug?bug的源头在哪里?
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $(selector).each()和$.each()的区别
  • (007)XHTML文档之标题——h1~h6
  • (31)对象的克隆
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (done) 两个矩阵 “相似” 是什么意思?
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (四)Android布局类型(线性布局LinearLayout)
  • (转)shell调试方法
  • (轉貼) UML中文FAQ (OO) (UML)
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .NET实现之(自动更新)