SQL Server 2008 引數化行篩選器
引數化篩選器允許將不同分割槽的資料傳送到不同的訂閱伺服器,而無需建立多個釋出(在早期版本的 SQL Server 中,引數化篩選器稱為“動態篩選器”)。 分割槽只是表中行的子集;根據建立引數化篩選器時所選擇的設定,已釋出表中的每一行可以僅屬於一個分割槽(生成不重疊的分割槽),也可以屬於兩個或多個分割槽(生成重疊分割槽)。
可以在訂閱之間共享不重疊的分割槽,也可以對其進行限制,使得一個給定分割槽只有一個訂閱。 本主題後面的“使用適當的篩選選項”部分介紹了控制分割槽行為的設定。 通過這些設定,可以根據應用程式和效能要求來調整引數化篩選。 通常,重疊分割槽的靈活性更大,而複製到單個訂閱的不重疊分割槽的效能則更佳。
引數化篩選器在單個表中使用,通常與聯接篩選器配合使用來將篩選擴充套件到相關表。 有關詳細資訊,請參閱聯接篩選器。
定義或修改引數化行篩選器
SQL Server Management Studio: 如何定義和修改合併專案的引數化行篩選器 (SQL Server Management Studio)
複製 Transact-SQL 程式設計:如何為合併專案定義和修改引數化行篩選器(複製 Transact-SQL 程式設計)
複製管理物件 (RMO) 程式設計:如何定義專案(RMO 程式設計)
引數化篩選器的工作機制
引數化行篩選器使用 WHERE 子句來選擇要釋出的適當資料。 不要在該子句中指定文字值(像在靜態行篩選器中那樣),而是指定以下一個或兩個系統函式:SUSER_SNAME() 和 HOST_NAME()。也可以使用使用者定義函式,但是函式主體中必須包含 SUSER_SNAME() 或 HOST_NAME(),或者計算這些系統函式之一(如 MyUDF(SUSER_SNAME())。 如果使用者定義函式的主體中包含 SUSER_SNAME() 或 HOST_NAME(),則無法向該函式傳遞引數。
系統函式 SUSER_SNAME() 和 HOST_NAME() 不是合併複製特有的,但合併複製使用它們來進行引數化篩選:
SUSER_SNAME() 返回連線到 SQL Server 例項所用的登入資訊。 在引數化篩選器中使用該函式時,它會返回合併代理連線到釋出伺服器所用的登入名(在建立訂閱時指定登入名)。
HOST_NAME() 返回連線到 SQL Server 例項的計算機的名稱。 在引數化篩選器中使用該函式時,預設情況下,它會返回執行合併代理的計算機的名稱。 對於請求訂閱,此名稱為訂閱伺服器的名稱;對於推送訂閱,此名稱為分發伺服器的名稱。
也可以使用非訂閱伺服器名稱或分發伺服器名稱的值來覆蓋此函式。 通常,應用程式使用較有意義的值(如某個銷售人員的名字或 ID)來覆蓋此函式。有關詳細資訊,請參閱本主題中的“覆蓋 HOST_NAME() 值”部分。
將系統函式返回的值與在要篩選的表中指定的列進行比較,並將相應的資料下載到訂閱伺服器。 此比較是在初始化訂閱時(因此初始快照中僅包含相應的資料)和每次同步訂閱時進行的。 預設情況下,如果釋出伺服器上的更改導致行移出分割槽,則該行將從訂閱伺服器上刪除(可以使用 sp_addmergepublication (Transact-SQL) 的 @allow_partition_realignment 引數控制此行為)。
注意:
對引數化篩選器進行比較時,將始終使用資料庫排序規則。 例如,如果資料庫排序規則不區分大小寫,而表或列排序規則區分大小寫,那麼該比較將不區分大小寫。
使用 SUSER_SNAME() 進行篩選
下面以 Adventure Works 示例資料庫中的 Employee 表為例進行說明。 此表包含 LoginID 列,該列中每個僱員的登入名的格式為“domain\login”。 若要篩選此表以便僱員僅接收與之相關的資料,請指定篩選子句:
LoginID = SUSER_SNAME()例如,其中一個僱員的值為“adventure-works\john5”。 合併代理連線到釋出伺服器時,使用建立訂閱時指定的登入名(此例中為“adventure-works\john5”)。 然後,合併代理將 SUSER_SNAME() 返回的值與表中的值進行比較,並僅下載 LoginID 列中值為“adventure-works\john5”的行。
使用 HOST_NAME() 進行篩選
下面以 HumanResources.Employee 表為例進行說明。 假定此表包含列 ComputerName,該列中每個僱員的計算機名稱的格式為“name_computertype”。 若要篩選此表以便僱員僅接收與之相關的資料,請指定篩選子句:
ComputerName = HOST_NAME()例如,其中一個僱員的值為“john5_laptop”。 合併代理連線到釋出伺服器時,會將 HOST_NAME() 返回的值與表中的值進行比較,並僅下載 ComputerName 列中包含值為“john5_laptop”的行。
也可以在篩選器中組合這些函式。 例如,如果要確保僱員僅在使用其登入名登入其計算機時接收資料,則篩選子句可以是:
LoginID = SUSER_SNAME() AND ComputerName = HOST_NAME()除非覆蓋 HOST_NAME() 值,否則使用 HOST_NAME() 進行篩選通常僅用於請求訂閱。 函式返回的值為執行合併代理的計算機的名稱。 對於請求訂閱,每個訂閱的值都不同,但對於推送訂閱,每個訂閱的值都相同(對於推送訂閱,所有合併代理都在分發伺服器上執行)。
安全說明:
函式 HOST_NAME() 的值可以覆蓋;因此不能使用包含 HOST_NAME() 的篩選器來控制對資料分割槽的訪問。 若要控制對資料分割槽的訪問,請將 SUSER_SNAME()、SUSER_SNAME() 和 HOST_NAME() 結合使用,或者使用靜態行篩選器。
覆蓋 HOST_NAME() 值
如前所述,HOST_NAME() 在預設情況下會返回連線到 SQL Server 例項的計算機的名稱。 使用引數化篩選器時,通常通過在建立訂閱時提供值來覆蓋此值。 然後,HOST_NAME() 函式將返回指定的值,而不是計算機的名稱。
注意:
如果覆蓋 HOST_NAME(),那麼所有對 HOST_NAME() 函式的呼叫都將返回指定的值。 請確保其他應用程式不依賴於 HOST_NAME() 返回計算機名稱。
下面以 HumanResources.Employee 表為例進行說明。 此表包含 EmployeeID 列。 若要篩選此表以便每個僱員僅接收與他們相關的資料,請指定篩選子句:
EmployeeID = CONVERT(int,HOST_NAME())
例如,為僱員 Pamela Ansman-Wolfe 分配的僱員 ID 為 280。為此僱員建立訂閱時,為 HOST_NAME() 值指定僱員 ID 值(在此例中為 280)。 合併代理連線到釋出伺服器時,會將 HOST_NAME() 返回的值與表中的值進行比較,並僅下載 EmployeeID 列中值為 280 的行。
重要提示:
HOST_NAME() 函式會返回 nchar 值,因此如果篩選子句中的列為數值資料型別(如前面示例所示),則必須使用 CONVERT。 出於效能方面的考慮,建議您不要對引數化行篩選器子句(如 CONVERT(nchar,EmployeeID) = HOST_NAME())中的列名應用函式。 建議您改用示例中所示的方法: EmployeeID = CONVERT(int,HOST_NAME())。此子句可用於 sp_addmergearticle 的 @subset_filterclause 引數,但通常不能用於新建釋出嚮導(該向導會執行篩選子句對其進行驗證,而此操作會失敗,因為計算機名稱無法轉換為 int)。 如果使用的是新建釋出嚮導,建議在嚮導中指定 CONVERT(nchar,EmployeeID) = HOST_NAME(),然後在為釋出建立快照之前,使用 sp_changemergearticle 將子句更改為 EmployeeID = CONVERT(int,HOST_NAME())。
覆蓋 HOST_NAME() 值
使用下列方法之一覆蓋 HOST_NAME() 值:
SQL Server Management Studio:在新建訂閱嚮導的“HOST_NAME() 值”頁中,指定一個值。 有關建立訂閱的詳細資訊,請參閱訂閱釋出。
複製 Transact-SQL 程式設計:指定 sp_addmergesubscription (Transact-SQL)(適用於推送訂閱)或 sp_addmergepullsubscription_agent (Transact-SQL)(適用於請求訂閱)的 @hostname 引數的值。
合併代理:在命令列中或通過代理配置檔案指定 -Hostname 引數的值。有關合並代理的詳細資訊,請參閱複製合併代理。 有關代理配置檔案的詳細資訊,請參閱複製代理配置檔案。
使用引數化篩選器初始化釋出的訂閱
在合併釋出中使用引數化行篩選器時,複製將使用由兩部分構成的快照初始化各個訂閱。 有關詳細資訊,請參閱帶有引數化篩選器的合併釋出的快照。
使用適當的篩選選項
使用引數化篩選器時,您可以控制兩個關鍵方面:
如何通過合併複製處理篩選器,可以通過以下兩個釋出設定之一控制:use partition groups 和 keep partition changes。
資料如何在訂閱伺服器之間共享,必須通過專案設定 partition options 來反映。
設定篩選選項
SQL Server Management Studio: 如何優化引數化行篩選器 (SQL Server Management Studio)
複製 Transact-SQL 程式設計:如何優化引數化行篩選器(複製 Transact-SQL 程式設計)
設定“use partition groups”和“keep partition changes”
use partition groups 選項和 keep partition changes 選項通過在釋出資料庫中儲存其他後設資料提高具有篩選專案的釋出的同步效能。 use partition groups 選項通過使用預計算分割槽功能進一步提高效能。如果釋出中的專案符合一組要求,則此選項在預設情況下將設定為 true。 有關這些要求的詳細資訊,請參閱使用預計算分割槽優化引數化篩選器的效能。 如果專案不符合使用預計算分割槽的要求,則 keep partition changes 選項設定為 true。
設定“partition options”
建立專案時,根據訂閱伺服器共享已篩選表中的資料的方式,指定 partition options 屬性的值。 可以使用 sp_addmergearticle、sp_changemergearticle 和“專案屬性”對話方塊,將該屬性設定為四個值中的一個。 可以使用“新增篩選器”或“編輯篩選器”對話方塊(可以通過新建釋出嚮導和“釋出屬性”對話方塊訪問),將該屬性設定為兩個值中的一個。 下表總結了可用的值:
說明 “新增篩選器”和“編輯篩選器”中的值 “專案屬性”中的值 儲存過程中的值
分割槽中的資料重疊,並且訂閱伺服器可以更新引數化篩選器中引用的列。
此表中的行將轉到多個訂閱
重疊
0
分割槽中的資料重疊,而訂閱伺服器無法更新引數化篩選器中引用的列。
無1
重疊,不允許分割槽外的資料更改
1
分割槽中的資料不重疊,並且資料由所有訂閱共享。 訂閱伺服器無法更新引數化篩選器中引用的列。
無1
不重疊,由所有訂閱共享
2
分割槽中的資料不重疊,每個分割槽只有一個訂閱。 訂閱伺服器無法更新引數化篩選器中引用的列。2
此表中的行將僅轉到一個訂閱
不重疊,一個訂閱
3
1 如果基礎篩選選項設定為 0、1 或 2,“新增篩選器”和“編輯篩選器”對話方塊中將顯示“此表中的行將轉到多個訂閱”。
2 如果指定此選項,則該專案中的每個資料分割槽只能有一個訂閱。 如果建立了另一訂閱,且新建訂閱的篩選準則解析為現有訂閱的同一分割槽,則將刪除現有訂閱。
重要提示:
必須根據訂閱伺服器共享資料的方式來設定 partition options 值。 例如,如果指定分割槽不重疊,每個分割槽一個訂閱,但資料隨後在另一臺訂閱伺服器上被更新,則合併代理在同步期間會失敗,且可能無法收斂。
選擇適當的分割槽選項
不重疊分割槽與預計算分割槽協同工作,可以在接受某些功能限制的情況下提高效能。 預計算分割槽可以加快下載到訂閱伺服器的速度,但會降低上載速度。 不重疊分割槽則可以將與預計算分割槽相關聯的上載開銷降至最低。 使用的引數化篩選器和聯接篩選器越複雜,不重疊分割槽的效能優勢就越明顯。
決定應在釋出中使用的分割槽選項時,請考慮下列方案。
Adventure Works 有一個移動銷售團隊,該團隊中的每個銷售人員分別負責給定郵政編碼內的客戶。 該應用程式要求,如果某個客戶從一個銷售區域移到另一個銷售區域,應更新其對應的郵政編碼,以便將該客戶分配給另一個銷售人員。 引數化篩選器基於客戶的郵政編碼,通過更新,從一個銷售人員的分割槽中刪除郵政編碼並將該郵政編碼插入到另一個銷售人員的分割槽中。 這需要能夠更新引數化篩選器中引用的列的重疊分割槽。 此選項具有的靈活性最大,但效能不如不重疊的分割槽。
政府機構具有提供給每個省/市/自治區各縣的地區辦事處的資料。 資料是不重疊的;機構總部的表中的每一行僅包含在一個分割槽中,但該分割槽將傳送到同一個縣的多個辦事處。 訂閱之間共享分割槽的不重疊分割槽選項可以實現此示例中的要求,它可以在滿足應用要求同時,提供優於重疊分割槽的效能。
如果具有不重疊分割槽,且只有一個訂閱接收和更新分割槽中的資料,則可以獲得更多的效能收益。 此方案通常用於銷售點系統和現場工作團隊應用(在這些應用中,主要在訂閱伺服器上收集資料,然後將資料上載到釋出伺服器)。 例如運輸應用中的 Package 表:將每個包都裝載到卡車上後,在 Package 表中包的狀態將會更改,並且該更改將複製回總部。司機不會更新兩輛不同卡車上同一個包的狀態,因此 Package 表對於每個分割槽一個訂閱的不重疊分割槽是一個很好的候選項。
不重疊分割槽的注意事項
在使用不重疊分割槽時,請注意下列事項。
一般注意事項
釋出必須使用預計算分割槽。
一行只能屬於一個分割槽。
專案不能是邏輯記錄的一部分。
不支援備用同步夥伴(不推薦使用此功能)。
訂閱伺服器無法更新引數化篩選器中引用的列。
如果訂閱伺服器上的插入不屬於分割槽,則不會刪除該插入。 但是,不會將其複製到其他訂閱伺服器。
在某些具有重疊分割槽的情況下,合併代理插入資料時,標識範圍會有所調整。 對於不重疊分割槽,範圍只能在插入期間由有權調整訂閱資料庫中標識範圍的使用者進行調整。 使用者或者必須擁有表,或者必須是 sysadmin 固定伺服器角色、db_owner 固定資料庫角色或 db_ddladmin 固定資料庫角色的成員。
每個分割槽一個訂閱的不重疊分割槽的其他注意事項
專案只能存在於一個釋出中;專案不能重新發布。
釋出必須允許訂閱伺服器啟動快照處理。 有關詳細資訊,請參閱帶有引數化篩選器的合併釋出的快照。
聯接篩選器的其他注意事項
在聯接篩選器層次結構中,具有重疊分割槽的專案無法顯示在具有不重疊分割槽的專案之上。 也就是說,如果子專案使用不重疊分割槽,父專案也必須使用不重疊分割槽。 有關聯接篩選器的資訊,請參閱聯接篩選器。
如果聯接篩選器中的不重疊分割槽為子專案,則該聯接篩選器的 join unique key 屬性必須設定為 1。有關詳細資訊,請參閱聯接篩選器。
專案應只有一個引數化篩選器或聯接篩選器。 允許具有引數化篩選器,並允許其作為聯接篩選器中的父專案。 不允許具有引數化篩選器,並且不允許其作為聯接篩選器中的子專案。 也不允許具有多個聯接篩選器。
如果釋出伺服器上的兩個表有聯接篩選器關係,並且子表的行在父表中沒有對應的行,則插入缺少的父行不會導致相關行下載到訂閱伺服器(這些行將隨重疊分割槽下載)。 例如,如果 SalesOrderDetail 表的行在 SalesOrderHeader 表中沒有對應的行,則在 SalesOrderHeader 中插入缺少的行後,該行將下載到訂閱伺服器,但 SalesOrderDetail 中對應的行不會下載到訂閱伺服器。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-515887/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 2008 聯接篩選器SQLServer
- SQL SERVER 引數化選項SQLServer
- SQL Server 2008篩選索引設計準則SQLServer索引
- SQL Server SQL效能優化之引數化SQLServer優化
- SQL SERVER 2008傳遞表值引數SQLServer
- SQL Server 2008:傳遞表值引數SQLServer
- Sql Server 的引數化查詢SQLServer
- 【SQL優化器】初始化引數SQL優化
- SQL Server之旅(12):sqltext的引數化處理SQLServer
- 啟用Exchange Server 智慧郵件篩選器更新Server
- SQL Server效能分析引數 (轉)SQLServer
- SQL Server 2008 查詢優化SQLServer優化
- SQL Server 2008 化繭成蝶SQLServer
- 在SQL Server 2008中的SP上使用表型別值引數MHSQLServer型別
- Sql Server2008 格式化 Sql的 工具SQLServer
- 淺析SQL Server效能分析引數SQLServer
- SQL Server 的max degree of parallelism引數SQLServerParallel
- JQuery選擇器——可見性篩選選擇器和屬性篩選選擇器jQuery
- SQL Server 2008配置並行索引操作SQLServer並行索引
- SQL Server 2008的選擇身份驗證模式SQLServer模式
- SQL Server 2008的選擇加密演算法SQLServer加密演算法
- Sql Server之旅——第十二站 sqltext的引數化處理SQLServer
- SQL Server 2008 效能監視和優化SQLServer優化
- 優化SQL Server 2008的查詢效能優化SQLServer
- SQL Server 2008資料庫引擎優化SQLServer資料庫優化
- SQL Server 2008中的格式化日期SQLServer
- SQL Server 2008資源調控器概念SQLServer
- sql點滴38—SQL Server 2008和SQL Server 2008 R2匯出資料的選項略有不同SQLServer
- 篩選法求質數
- SQL Server 2008選擇資料庫恢復模式SQLServer資料庫模式
- SQL Server 2008為索引操作選擇恢復模式SQLServer索引模式
- SQL Server 2008中Analysis Services的新特性——深入SQL Server 2008SQLServer
- SQL Server 2008效能監控和效能優化SQLServer優化
- SQL Server 2008 優化MERGE語句效能SQLServer優化
- SQL Server 2008 高階查詢優化概念SQLServer優化
- SQL Server 2008效能監視和優化概述SQLServer優化
- SQL Server 2008資源調控器狀態SQLServer
- SQL Server 2008 資源調控器監視SQLServer