SQL Server 2005 引入 XML 格式的查詢執行計畫,並支援 XPath、XQuery、XSLT 等 XML 技術處理。本文示範如何結合 SQLCLR、Visual C# 与 XPath/XQuery,以程式化方式提取查詢預估執行成本,實現細粒度的查詢提交管控,防止高成本查詢拖垮伺服器效能。
DBA 常面臨用戶在尖峰時段提交長時間查詢導致伺服器回應變慢。傳統手段僅能透過 sp_configure 'query governor cost limit' 或 SET QUERY_GOVERNOR_COST_LIMIT 設定全域或連線層級閾值,缺乏針對單一查詢的精細控制。例如用戶可能有多個語法不同但邏輯等價的查詢,希望自動選擇成本最低者執行,或直接攔截超標查詢——這都需要程式化存取查詢成本。
StatementSubTreeCost 屬性值。CREATE ASSEMBLY)。CREATE PROCEDURE ... AS EXTERNAL NAME)。// C# CLR 預存程序核心邏輯
[Microsoft.SqlServer.Server.SqlProcedure]
public static void GetEstimatedCost(string queryText, out double cost) {
using (SqlConnection conn = new SqlConnection("context connection=true")) {
conn.Open();
// 取得 XML Showplan
SqlCommand cmd = new SqlCommand(
"SET SHOWPLAN_XML ON; " + queryText + "; SET SHOWPLAN_XML OFF;", conn);
XmlReader reader = cmd.ExecuteXmlReader();
// XPath 提取成本
XPathDocument doc = new XPathDocument(reader);
XPathNavigator nav = doc.CreateNavigator();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nav.NameTable);
nsmgr.AddNamespace("sm", "https://schemas.microsoft.com/sqlserver/2004/07/showplan");
string xpath = "//sm:StmtSimple/@StatementSubTreeCost";
XPathNodeIterator iter = nav.Select(xpath, nsmgr);
cost = iter.MoveNext() ? double.Parse(iter.Current.Value) : 0;
}
}
TRUSTWORTHY ON 或簽署組件憑證以允許 EXTERNAL_ACCESS/UNSAFE 權限組件。SQLCLR 賦予 SQL Server 2005 強大的擴展能力,結合 XML Showplan 與 XPath/XQuery,開發者可輕鬆實現查詢成本的程式化存取與管控,構建更智慧、伺服器友善的應用程式。此技術模式同樣適用於其他需解析 XML 計畫的場景(如索引建議、平行度分析等)。