XML执行计划总子树成本计算函数优化:仅累加含指定属性节点
修正XML执行计划总子树成本计算函数
原函数在计算XML执行计划的总子树成本时,没考虑部分StmtSimple标签不含statementsubtreecost属性的情况,直接访问会报错,而且还有冗余逻辑。下面是修正后的实现:
原函数代码
public string CheckForGetTotalSubTreeCost(XmlDocument xdExecPlan) { float totalSubtreeCost = 0; float subtreeCost = 0; int i = 0; XmlNodeList xnlStmtSimple = xdExecPlan.GetElementsByTagName("StmtSimple"); XmlNode xnlStmt = xnlStmtSimple[i]; if (xnlStmtSimple.Count > 0) { if (xnlStmt == null) { return null; } foreach (XmlNode xnlStmtt in xnlStmtSimple) { if (xnlStmtSimple != null) { subtreeCost = float.Parse(xnlStmtt.Attributes[ConstantValue.STATEMENTSUBTREECOST].Value); totalSubtreeCost += subtreeCost; } } } // 原函数缺失return语句,此处按业务逻辑补充返回总成本字符串 return totalSubtreeCost.ToString(); }
修正后的函数代码
public string CheckForGetTotalSubTreeCost(XmlDocument xdExecPlan) { float totalSubtreeCost = 0; XmlNodeList xnlStmtSimple = xdExecPlan.GetElementsByTagName("StmtSimple"); // 节点列表为空直接返回0(或null,按需调整) if (xnlStmtSimple.Count == 0) { return "0"; } foreach (XmlNode stmtNode in xnlStmtSimple) { // 先检查当前节点是否包含目标属性 XmlAttribute costAttr = stmtNode.Attributes[ConstantValue.STATEMENTSUBTREECOST]; if (costAttr != null) { // 安全解析数值,避免格式错误崩溃 if (float.TryParse(costAttr.Value, out float subtreeCost)) { totalSubtreeCost += subtreeCost; } } } return totalSubtreeCost.ToString(); }
核心修改点
- 只处理带
statementsubtreecost属性的StmtSimple节点,没属性的直接跳过 - 用
float.TryParse替代强制转换,就算属性值格式不对也不会报错 - 删掉了没用的逻辑:比如
xnlStmtSimple != null(GetElementsByTagName不会返回null),还有一开始直接取索引0的节点(列表为空时会越界) - 明确了节点列表为空时的返回值,补全了原函数缺失的return逻辑
内容的提问来源于stack exchange,提问作者Pranjal raut
相关产品推荐
相关产品推荐

