SQL Server 2005/2008/2012中應用分布式分區視圖


SQL Server 2008中SQL應用系列--目錄索引

  自2000版本起,SQL Server企業版中引入分布式分區視圖,允許你為分布在不同的SQL 實例的兩個或多個水平分區表創建視圖。

  簡要步驟如下:根據Check約束中定義的一組值把大表分割成更小的一些表。Check約束確保每個小表保存着不能保存在其他表的唯一數據。然后使用Union All創建分布式分區視圖,把所有這些小表聯結成單獨的結果集。

  這樣對性能的改善是有益的,例如,如果視圖根據日期分區,並用查詢來返回僅保存在一個分區表中的行,那么SQL Server會智能地只搜索一個分區而不是分布式分區視圖中的所有表。

  我們假設一個場景,某公司成立上海和北京分公司,分別有各自的SQL Server實例來保存網站數據,都希望用一個表跟蹤網站點擊。點擊量非常大。此時,需要一個視圖以在單個視圖中引用各自的表。公司希望能查詢任意一個服務器,並且返回相同的數據或各自分公司的數據。

  下面我們通過實例來演示這個場景的具體應用。假定有兩個實例:AP4\NET2012和AP4\NET2013(本文所有示例均在SQL Server 2008環境下通過)。

一、創建鏈接服務器,當然也可以通過OpenRowset(http://msdn.microsoft.com/zh-cn/library/ms190312.aspx)而不創建鏈接服務器,並創建測試數據庫和表。

/********* 創建一個分布式分區視圖 ***************/
/********* 3w@live.cn 邀月 ***************/

USE master
GO
EXEC sp_addlinkedserver
'AP4\NET2013',
N'SQL Server'
GO

-- 跳過遠程實例架構表的檢查,以提升性能,邀月注
EXEC sp_serveroption 'AP4\NET2013', 'lazy schema validation', 'true'
GO

--創建測試數據庫
IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = 'RemoteViewTest2012')
BEGIN
CREATE DATABASE RemoteViewTest2012
END
GO
--打開測試庫
Use RemoteViewTest2012
GO

--創建上海分公司的點擊表
CREATE TABLE dbo.WebHits_ShangHai
(WebHitID uniqueidentifier NOT NULL,
WebSite varchar(20) NOT NULL ,
HitDT datetime NOT NULL,
CHECK (WebSite = 'ShangHai'),
CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

 

 

第二個實例:

/*************** 實例 AP4\NET2013(SQL Server 2008) *********/
/********* 3w@live.cn 邀月 ***************/
USE master
GO
EXEC sp_addlinkedserver
'AP4\NET2012',
N'SQL Server'
GO

-- 跳過遠程實例架構表的檢查,以提升性能,邀月注
EXEC sp_serveroption 'AP4\NET2012', 'lazy schema validation', 'true'
GO

IF NOT EXISTS (SELECT name
FROM sys.databases
WHERE name = 'RemoteViewTest2012')
BEGIN
CREATE DATABASE RemoteViewTest2012
END
GO

--打開測試庫
Use RemoteViewTest2012
GO

--創建北京分公司的點擊表
CREATE TABLE dbo.WebHits_BeiJing
(WebHitID uniqueidentifier NOT NULL,
WebSite varchar(20) NOT NULL ,
HitDT datetime NOT NULL,
CHECK (WebSite = 'BeiJing'),
CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

 

二、在兩個實例中分別創建視圖

/*************** 實例 AP4\NET2012(SQL Server 2008) *********/
/********* 3w@live.cn 邀月 ***************/

--打開測試庫
Use RemoteViewTest2012
GO

--創建分區視圖
CREATE VIEW dbo.v_WebHits AS
SELECT WebHitID,
WebSite,
HitDT
FROM RemoteViewTest2012.dbo.WebHits_ShangHai
UNION ALL
SELECT WebHitID,
WebSite,
HitDT
FROM [AP4\NET2013].RemoteViewTest2012.dbo.WebHits_BeiJing
GO

/*************** 實例 AP4\NET2013(SQL Server 2008) *********/
/********* 3w@live.cn 邀月 ***************/

--打開測試庫
Use RemoteViewTest2012
GO

--創建分區視圖
CREATE VIEW dbo.v_WebHits AS
SELECT WebHitID,
WebSite,
HitDT
FROM RemoteViewTest2012.dbo.WebHits_BeiJing
UNION ALL
SELECT WebHitID,
WebSite,
HitDT
FROM [AP4\NET2012].RemoteViewTest2012.dbo.WebHits_ShangHai
GO

 

三、插入測試數據

我們可以選擇任意一個實例中插入,下面我們選擇AP4\NET2013

/*************** 實例 AP4\NET2013(SQL Server 2008) *********/
/********* 3w@live.cn 邀月 ***************/
----要保證插入,必須打開XACT_ABORT開關,並開啟分布式事務協調器,邀月注

--打開測試庫
Use RemoteViewTest2012
GO

SET XACT_ABORT ON
INSERT dbo.v_WebHits
(WebHitID, WebSite, HitDT)
VALUES(NEWID(), 'ShangHai', GETDATE())

INSERT dbo.v_WebHits
(WebHitID, WebSite, HitDT)
VALUES(NEWID(), 'BeiJing', GETDATE())

 

  注意,如果該實例所在的服務器上沒有啟用MSDTC(Microsoft 分布式事務處理協調器),會拋出一個錯誤:

邀月工作室

  此時在命令行中輸入Net start msdtc以啟用該服務。

邀月工作室

邀月工作室

  如果還是不能正常啟動MSDTC,請查閱MSDN(http://msdn.microsoft.com/zh-cn/library/aa561924%28BTS.10%29.aspx)以獲取幫助。

 

四、進行分布式查詢

  此時,我們在任意一個實例查詢的結果都是一致的,也正是我們想要的。

/*************** 實例 AP4\NET2013(SQL Server 2008) *********/
/********* 3w@live.cn 邀月 ***************/
/***** 分布式查詢  **************/

----AP4\NET2013上查詢
--打開測試庫
Use RemoteViewTest2012
GO
SET XACT_ABORT ON

SELECT WebHitID, WebSite, HitDT
FROM dbo.v_WebHits

SELECT WebHitID, WebSite, HitDT
FROM [AP4\NET2012].RemoteViewTest2012.dbo.WebHits_ShangHai

 

----AP4\N ET2012上查詢
--打開測試庫
Use RemoteViewTest2012
GO

SET XACT_ABORT ON

SELECT WebHitID, WebSite, HitDT
FROM dbo.v_WebHits

SELECT WebHitID, WebSite, HitDT
FROM [AP4\NET2013].RemoteViewTest2012.dbo.WebHits_BeiJing

 

邀月工作室

  我們欣喜地看到,SQL Server並沒有在基礎分區表中插入冗余數據,而是自動分發到了Check所約定的相應的表中,這得益於MSDTC的功勞。

邀月工作室

  注意:創建分布式視圖的注意事項和必要條件,請看MSDN(http://msdn.microsoft.com/zh-cn/library/ms188299.aspx)。

 

  小結:分布式分區視圖允許我們跨多個SQL Server實例划分數據。對於超大型數據庫和擁有大量事務和讀操作的SQL Server實例來說,這種設計讓我們獲益良多。根據被查詢的視圖,SQL Server能確定只查詢本地分區表是否能滿足某個查詢請求,遠程表是否需要查詢,最終,SQL Server會最大限度地減少SQL Server實例間傳輸的數據總量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM