共用方式為


通知計畫

若要有效使用查詢通知,您應考量查詢通知對您的應用程式是否有利、您的應用程式所使用的查詢是否支援通知,以及應用程式將使用何種策略來訂閱及接收通知。

若查詢中的資料變動頻率較低、應用程式在資料變更時不需立即更新,以及查詢符合<為通知建立查詢>所列之需求與限制時,查詢通知都可提供便捷的方式來降低往返於資料庫的次數。許多 Web 應用程式都符合這些條件,而這些應用程式即可充分利用查詢通知。

查詢通知並非在所有狀況下都有效用。若應用程式經常從資料庫讀取資料,但資料更新的頻率相對而言較低的話,查詢通知即可派上用場。例如,檢視線上目錄應用程式的頻率會比目錄更新的頻率來得高。但就線上購物車而言,某些特定的內容可能會很頻繁地更新,此時查詢通知就沒有太大的效用。

當應用程式所發出的查詢共用相同的結構,而且僅在參數值中有變化時,查詢通知就會很有效率。例如:

SELECT ProductNumber, Name FROM Production.Product WHERE ListPrice < 300
SELECT ProductNumber, Name FROM Production.Product WHERE ListPrice < 500

在此情況中,兩個通知的查詢通知訂閱共用相同的內部範本,因此在 SQL Server 中所造成的負擔會低於各自使用不同查詢結構的兩個通知。但請注意,查詢中的參數都會保留下來。即使查詢共用範本,但在加入 ListPrice 為 350 的項目時,將會對第二個查詢產生通知,而不是對第一個查詢。

若資料表上正在使用查詢通知,則在更新資料表時就會耗費更多成本。Database Engine 會執行額外的工作來檢查訂閱,並在必要時產生通知。重複使用內部範本有助於降低每個訂閱的負擔。因此,只有以類似結構提交查詢的應用程式,才應該使用查詢通知。以不同結構提交查詢的應用程式,不應使用查詢通知。

例如,若有某個應用程式可顯示特定價格範圍中的目錄項目,並以相同的結構提交查詢。在此情況下,Database Engine 可以對每個查詢重複使用內部範本,而查詢通知即可增進效能。但允許特定報告的應用程式會以不同的結構提交查詢。在此情況下,該應用程式就不應使用查詢通知。

只要至少有一個註冊的訂閱使用內部範本,Database Engine 就會維護此範本。Database Engine 會限制特定資料表上不同內部範本的數量。一旦達到此限制,Database Engine 就不會對需要建立新範本的訂閱進行註冊。相反的,Database Engine 會立即產生訂閱訊息,指出該訂閱無法進行註冊。

規劃有效率的查詢通知策略

當通知總數為少量到中量時,查詢通知通常會運作良好,而且當資料變更時,應用程式不需要立即的通知回應時間。典型的 Web 層快取失效案例很適合這個模型,而且通常對於使用查詢通知會是很好的應用程式。當以幾近瞬間回應時間來接收通知、網路基礎結構不快速也不可靠,或者通知數量非常大時,查詢通知可能不是應用程式的最佳選擇。

當使用查詢通知時,請在其操作和部署所在的規模與環境來測試及微調應用程式。假設真實世界有一個預期負載最重的使用案例,並規劃可能發生時的高活動爆發。

如果您在需要幾近瞬間的可靠查詢通知的狀況下使用查詢通知,則建置任何高效能 OLTP 應用程式所適用的相同技術同樣適用於您的查詢通知應用程式。

  • 請確定您的應用程式持有鎖定的期間不會超過幾分之一秒的時間。例如,請勿透過效能不可靠的網路來從用戶端執行多重陳述式交易。

  • 請在您的使用者資料表中識別及消除作用點。

  • 通常會循序掃描查詢通知內部資料表,以找出您設定查詢通知所在之相關使用者資料表的每一項更新。如果查詢通知內部資料表上所持有的資料表層級鎖定可能會成為瓶頸,請考慮將具有查詢通知的使用者資料表分割為幾個個別的資料表,以減少必須針對每一項資料變更所評估的可能通知數目。

如果您的通知要求的可用生命週期很短,請考慮使用具有 SqlDependency 建構函式且明顯小於預設 5 天 (例如一分鐘) 的逾時值。這樣會大幅減少內部查詢通知資料表中的資料列數。而且這樣會減少處理這些資料表所需的時間,並減少其鎖定爭用。

查詢通知的替代方法

如果您對於具有高資料更新率和許多未處理通知要求之環境中的資料變更通知,需要快速且高度可預測的回應時間,請考慮類似下列其中一個替代方案。

  • 於正在監控的資料表上建立 AFTER UPDATE 觸發程序,其動作會使用 SQL Server Service Broker 傳送訊息給需要通知的實體 (這可能會以幾個方式來設計,例如加入有興趣之資料表的資料行,其中會指示必須被通知變更的實體,或者將主要資料表聯結至第二個資料表,其中包含有關需要通知之實體的資訊)。

  • 使用不依賴查詢通知的自訂應用程式層方案。例如,將通知設定為完全從中介應用程式發生,該應用程式會維護在主要記憶體物件集合中所監控的資料。當依照符合通知準則的方式來修改物件時,您的應用程式可以產生通知。

  • 根據記憶體中的物件快取以及您向物件註冊的回呼函數來使用 Windows Server AppFabric 快取,它可支援變更通知機制。

請參閱

概念