1. 程式人生 > >SQL Server 2005/2008/2012中應用分布式分區視圖

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

lag tails soft 9.png .aspx 並且 例如 () 根據

  自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)而不創建鏈接服務器,並創建測試數據庫和表。

[sql] view plain copy
  1. /********* 創建一個分布式分區視圖 ***************/
  2. /********* [email protected] 邀月 ***************/
  3. USE master
  4. GO
  5. EXEC sp_addlinkedserver
  6. ‘AP4\NET2013‘,
  7. N‘SQL Server‘
  8. GO
  9. -- 跳過遠程實例架構表的檢查,以提升性能,邀月註
  10. EXEC sp_serveroption ‘AP4\NET2013‘, ‘lazy schema validation‘, ‘true‘
  11. GO
  12. --創建測試數據庫
  13. IF NOT EXISTS (SELECT name
  14. FROM sys.databases
  15. WHERE name = ‘RemoteViewTest2012‘)
  16. BEGIN
  17. CREATE DATABASE RemoteViewTest2012
  18. END
  19. GO
  20. --打開測試庫
  21. Use RemoteViewTest2012
  22. GO
  23. --創建上海分公司的點擊表
  24. CREATE TABLE dbo.WebHits_ShangHai
  25. (WebHitID uniqueidentifier NOT NULL,
  26. WebSite varchar(20) NOT NULL ,
  27. HitDT datetime NOT NULL,
  28. CHECK (WebSite = ‘ShangHai‘),
  29. CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

第二個實例:

[sql] view plain copy
  1. /*************** 實例 AP4\NET2013(SQL Server 2008) *********/
  2. /********* [email protected] 邀月 ***************/
  3. USE master
  4. GO
  5. EXEC sp_addlinkedserver
  6. ‘AP4\NET2012‘,
  7. N‘SQL Server‘
  8. GO
  9. -- 跳過遠程實例架構表的檢查,以提升性能,邀月註
  10. EXEC sp_serveroption ‘AP4\NET2012‘, ‘lazy schema validation‘, ‘true‘
  11. GO
  12. IF NOT EXISTS (SELECT name
  13. FROM sys.databases
  14. WHERE name = ‘RemoteViewTest2012‘)
  15. BEGIN
  16. CREATE DATABASE RemoteViewTest2012
  17. END
  18. GO
  19. --打開測試庫
  20. Use RemoteViewTest2012
  21. GO
  22. --創建北京分公司的點擊表
  23. CREATE TABLE dbo.WebHits_BeiJing
  24. (WebHitID uniqueidentifier NOT NULL,
  25. WebSite varchar(20) NOT NULL ,
  26. HitDT datetime NOT NULL,
  27. CHECK (WebSite = ‘BeiJing‘),
  28. CONSTRAINT PK_WebHits PRIMARY KEY (WebHitID, WebSite))

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

[sql] view plain copy
  1. /*************** 實例 AP4\NET2012(SQL Server 2008) *********/
  2. /********* [email protected] 邀月 ***************/
  3. --打開測試庫
  4. Use RemoteViewTest2012
  5. GO
  6. --創建分區視圖
  7. CREATE VIEW dbo.v_WebHits AS
  8. SELECT WebHitID,
  9. WebSite,
  10. HitDT
  11. FROM RemoteViewTest2012.dbo.WebHits_ShangHai
  12. UNION ALL
  13. SELECT WebHitID,
  14. WebSite,
  15. HitDT
  16. FROM [AP4\NET2013].RemoteViewTest2012.dbo.WebHits_BeiJing
  17. GO
  18. /*************** 實例 AP4\NET2013(SQL Server 2008) *********/
  19. /********* [email protected] 邀月 ***************/
  20. --打開測試庫
  21. Use RemoteViewTest2012
  22. GO
  23. --創建分區視圖
  24. CREATE VIEW dbo.v_WebHits AS
  25. SELECT WebHitID,
  26. WebSite,
  27. HitDT
  28. FROM RemoteViewTest2012.dbo.WebHits_BeiJing
  29. UNION ALL
  30. SELECT WebHitID,
  31. WebSite,
  32. HitDT
  33. FROM [AP4\NET2012].RemoteViewTest2012.dbo.WebHits_ShangHai
  34. GO

三、插入測試數據

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

[sql] view plain copy
  1. /*************** 實例 AP4\NET2013(SQL Server 2008) *********/
  2. /********* [email protected] 邀月 ***************/
  3. ----要保證插入,必須打開XACT_ABORT開關,並開啟分布式事務協調器,邀月註
  4. --打開測試庫
  5. Use RemoteViewTest2012
  6. GO
  7. SET XACT_ABORT ON
  8. INSERT dbo.v_WebHits
  9. (WebHitID, WebSite, HitDT)
  10. VALUES(NEWID(), ‘ShangHai‘, GETDATE())
  11. INSERT dbo.v_WebHits
  12. (WebHitID, WebSite, HitDT)
  13. VALUES(NEWID(), ‘BeiJing‘, GETDATE())


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

技術分享

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

技術分享

技術分享

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

四、進行分布式查詢

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

[sql] view plain copy
  1. /*************** 實例 AP4\NET2013(SQL Server 2008) *********/
  2. /********* [email protected] 邀月 ***************/
  3. /***** 分布式查詢  **************/
  4. ----AP4\NET2013上查詢
  5. --打開測試庫
  6. Use RemoteViewTest2012
  7. GO
  8. SET XACT_ABORT ON
  9. SELECT WebHitID, WebSite, HitDT
  10. FROM dbo.v_WebHits
  11. SELECT WebHitID, WebSite, HitDT
  12. FROM [AP4\NET2012].RemoteViewTest2012.dbo.WebHits_ShangHai

技術分享

[sql] view plain copy
  1. ----AP4\N ET2012上查詢
  2. --打開測試庫
  3. Use RemoteViewTest2012
  4. GO
  5. SET XACT_ABORT ON
  6. SELECT WebHitID, WebSite, HitDT
  7. FROM dbo.v_WebHits
  8. SELECT WebHitID, WebSite, HitDT
  9. FROM [AP4\NET2013].RemoteViewTest2012.dbo.WebHits_BeiJing

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