Linked Server 2:SQL Server 建立分佈式數據庫

分佈式數據庫的優點是將IO分散在不一樣的Physical Disk上,每次查詢都由多臺Server的CPU,I/O共同負載,經過各節點並行處理數據來提升性能,劣勢是消耗大量的網絡帶寬資源,管理難度大。在SQL Server 2012 版本中,建立水平切分的分佈式數據庫,必須分兩步來實現:劃分子集和對子集進行並集操做。html

劃分子集是將原始表水平切分紅若干個較小的成員表,每個成員表都是全集的一個劃分(各子集的並集是全集,其交集是空集)。每一個成員表包含與原始表相同數量的列,而且每一列具備與原始表中的相應列一樣的特性(如數據類型、大小、排序規則),成員表的schema和原始表相同,只是存儲的數據不一樣。水平切分原始表,也叫作數據庫水平分片,sharding。在查詢時,利用分區視圖來實現水平分片對用戶透明,分區視圖對分佈在不一樣服務器中的分區數據進行並集操做,使數據看起來來自一個表。sql

分佈在不一樣場地的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。ide

--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,建立分佈式水平分區視圖post

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

相關文章
相關標籤/搜索