码迷,mamicode.com
首页 > 数据库 > 详细

SQL Server 创建水平分布式数据库尝试

时间:2016-06-19 01:13:11      阅读:386      评论:0      收藏:0      [点我收藏+]

标签:

创建水平分布式数据库,需要分两步实现:划分子集和对子集进行并集操作。分布式数据库的优势是:IO分散,便于快速读取数据,劣势是消耗大量的网络带宽资源。

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

 

设计目的:将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

参考《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= Ndb1
    ,@srvproduct= NRemoteServerDB
    ,@provider= NSQLNCLI
    ,@datasrc=  NLJHPC\NamedInstance1  
    ,@location= null
    ,@provstr= null 
    ,@catalog= Ndbtest2

--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)

技术分享

 

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 

 

SQL Server 创建水平分布式数据库尝试

标签:

原文地址:http://www.cnblogs.com/ljhdo/p/5597222.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!