SQL Server 样本库 SQL Assessment API Probe Reference 完全指南:探针引用的 JSON 结构与数据编排实战
示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载SQL Assessment API 通过规则Rule→ 检查Check→ 探针Probe的层次化模型完成最佳实践评估而探针引用Probe Reference正是将检查需要什么数据与探针如何取数衔接起来的核心桥梁。本文以 ProbeReference.md 为骨架结合同目录下的 RulesandProbes.md、Probe.md、DataTransformation.md 等配套文档完整讲解探针引用的四种属性alias、id、params、transform、同探针多次调用、探针间数据传递两大核心编排场景以及表达式与数据变换的底层规则。读完本文你将能够独立编写自定义规则集中的探针引用实现多探针联动评估。背景检查的数据从何而来在深入探针引用之前先明确它在整个评估流程中的位置。SQL Assessment API 使用最佳实践建议集检查 SQL Server 环境是否可优化其实现是两步过程详见 RulesandProbes.md为给定目标构建检查清单checklist清单包含完整的一组检查取决于目标目标可以是服务器、数据库等通过目标模式target/targetFilter匹配 SQL Server 版本、版本类型、平台等逐项遍历清单并报告最佳实践违规项引擎检查目标是否满足每一条最佳实践不满足时按消息模板输出建议。每个检查Check本身不直接向目标服务器或数据库取数而是引用探针Probe。探针是负责取数的独立单元大多数探针使用 T-SQL 查询但 SQL Assessment API 也支持 WMI、Windows 注册表、Azure Instance Metadata Service以及以 .NET 类实现的自定义探针Probe.md 中的类型表列出了 AzGraph、AzMetadata、CMD、External、PowerShell、Registry、SQL、WMI 共八种。从源码结构看默认规则集中的探针只读取元数据如更新日志、服务器属性不读取用户表数据也不向数据库或实例写入任何内容。探针引用正是检查 → 探针这一跳转的载体检查通过probes数组声明它需要哪些探针的数据数组中的每个元素就是一条探针引用。探针引用的两种形态探针引用本质上是描述检查所需探针的JSON 对象。文档给出了一个关键简化规则当探针被引用且无需任何附加选项或参数时探针引用可以缩写为仅含探针 ID 的字符串。也就是说probes: [SysDmOsSysInfo]是合法的——它等价于一个只有id的完整对象。这种简写形式在 LocalVariables.md 的示例中可以看到实际应用{ probes: [SysDmOsSysInfo], locals: { workers: {sub: [ max_workers_count, 1 ] } }, message: Workers {workers}., condition: { lt: [ 0, workers ], lt: [ workers, 4 ] } }而完整的探针引用对象通常出现在需要传参、起别名或做数据变换的场景由以下属性构成。探针引用属性详解属性含义说明id被引用探针的 ID探针 ID 定义在探针对象中Probe.md引用时用它指明取哪个探针的数据alias该探针在此检查中的别名可在表达式中使用的替代名称主要用于两种场景同一探针多次调用、探针间数据传递params传给探针的参数以 JSON 对象属性表示属性名即参数名属性值可以是任意表达式transform应用于数据的数据变换在计算条件值之前对探针返回的数据进行变换详见 DataTransformation.mdid引用探针的标识id是探针引用的核心标识。探针本身在规则集文件中以 JSON 对象定义属性名即探针 ID属性值是探针实现数组引擎会选取第一个与目标模式匹配的实现因此实现数组的顺序很重要Probe.md。探针引用通过id精确指定要使用哪个已定义探针。alias表达式中使用的别名alias为该探针起一个替代名称供本检查中的表达式使用。它的价值体现在文档强调的两个场景中同一探针多次调用calling probe multiple times同一检查需要用不同参数多次调用同一探针时用别名区分各次调用返回的结果探针间数据传递using data from another probe一个探针的输出要作为另一个探针的输入时用别名或探针 ID作为前缀引用前一个探针的输出变量。params传给探针的参数params是传给该探针的参数集合。参数以 JSON 对象属性的形式给出属性名是参数名属性值可以是任意表达式。表达式可以包含常量、全局变量、局部变量以及由其他探针返回的数据通过alias引用。参数的具体含义取决于探针类型例如 T-SQL 探针的主要参数是取数查询而引用文档中的DiskInfo探针的参数是DiskName。表达式支持的操作符体系见 Operators.md涵盖逻辑and/or/not、字符串indexof、startswith、endswith及不区分大小写的i前缀变体、数学add、sub、mul、div、mod、ceiling、floor、max、min、位运算等、集合intersect、in、iin与比较lt/less、gt/greater、eq、ge、le、ne、match正则匹配、interval区间取值等五类是编写params值与condition的基础语言。transform进入条件计算前的数据变换transform在计算条件值之前应用于探针数据。引入它的动机在 DataTransformation.md 中有清晰阐述当数据格式不便直接使用如sys.dm_os_host_info返回的host_release是10.0.19044.2006这样的字符串时与其在 T-SQL 中解析不如在 JSON 中声明变换使代码更易读、更易维护implementation: { query: SELECT host_platform, host_release FROM sys.dm_os_host_info, transform: { type: parse, map: { host_release: /^(?major\\d)\\.(?minor\\d) } } }变换既可定义在探针实现中也可定义在探针引用中——后者能显著提升探针复用当一个检查需要某指标的均值、另一个检查需要同一指标的最大值时两个检查可以引用同一个探针但各自应用自己的变换。此时不仅探针代码被复用数据也被复用因为探针只会被实际调用一次详见 DataTransformation.md。可用变换类型见 DataTransformation 参考包括aggregate、defaultValue、nameValuePairs、noData、parse、performance、rename、toString等后文会结合示例展开其中最常用的aggregate。场景一同一探针多次调用alias ::语法某些检查需要对同一探针以不同参数调用多次。做法是添加多条具有相同id的探针引用并在输出变量名前加上探针别名 双冒号::作为前缀以区分不同参数返回的结果。文档中的经典示例是比较 C: 与 D: 两块磁盘的剩余空间probes: [ { type: DiskInfo, alias: FirstDisk, params: { DiskName: C: } }, { type: DiskInfo, alias: SecondDisk, params: { DiskName: D: } } ], condition: { greater: [ FirstDisk::FreeSpace, SecondDisk::FreeSpace ] }这里要点有三两条探针引用type相同均为DiskInfo仅params.DiskName不同实现同一探针、不同参数分别为它们起别名FirstDisk、SecondDisk在条件表达式中用别名::输出变量名的形式访问各自的结果FirstDisk::FreeSpace与SecondDisk::FreeSpace通过greater比较操作符greater是gt的同义词见 Operators.md得到C 盘剩余空间是否大于 D 盘的结论。注意示例中探针引用使用了type而非id来指定探针——在 SQL Assessment API 的探针定义模型中探针 ID 即探针 JSON 对象的属性名二者在引用语境中指代同一概念具体以所加载规则集中探针的定义为准。场景二探针间数据传递前一个探针的输出作为下一个探针的输入一个探针返回的数据可以传给另一个探针作为参数参数表达式中应包含以先前探针的 id 或别名作为前缀的输出变量名。文档给出的示例是DatabaseMasterFiles探针找出目标数据库使用的所有磁盘的卷 IDAzStorage探针针对每个卷 ID 被调用追加 Azure 相关的存储属性probes: [ { id: DatabaseMasterFiles, alias: db_files, params: { dbId: null, type: null }, transform: [ { type: aggregate, group: [ volume_mount_point, volume_id ] }, { type: aggregate, group: volume_id, map: { volume_mount_point: join } } ] }, { id: AzStorage, params: { path: db_files::volume_id } } ]这个示例同时展示了三条关键机制数据传递第二条探针引用AzStorage的params.path取值为db_files::volume_id即引用别名为db_files的探针即DatabaseMasterFiles输出中的volume_id变量。引擎会先调用DatabaseMasterFiles再把它的输出注入AzStorage的参数多步变换串联transform是一个数组变换按顺序依次作用于数据。第一步aggregate按volume_mount_point与volume_id两列分组第二步再按volume_id分组并将每组的volume_mount_point用join聚合函数拼成字符串——经过两级聚合后数据收敛为每个卷 ID 一行天然适配AzStorage逐卷取数的需求聚合变换的细节aggregate的group参数可接受单个字符串或字符串数组作用类似 T-SQL 的GROUP BYmap参数将列名映射到聚合函数。join聚合函数默认以, 分隔、默认去重distinct: true、默认修剪首尾空白trim: true还支持limit参数控制最多拼接前 N 项并用省略号代替其余部分详见 aggregate.md。关于多探针数据的组合方式还有一个重要语义RulesandProbes.md 明确指出当检查从多个探针获取数据时结果数据集由所有行的全部组合构成行为类似 T-SQL 的CROSS JOIN。条件会对每一行分别求值例如一个数据库用 3 块磁盘存放文件空闲空间最佳实践对每块磁盘独立适用若检查使用两个探针、一个产生 2 行另一个产生 3 行条件将被求值 2×36 次其中 2 次为false时会产生 2 条消息。数据变换transform深入以 aggregate 为例transform是探针引用的灵魂属性之一值得单独展开。变换的目的是让原始取数与条件计算解耦从而最大化探针复用。DataTransformation.md 开篇即点明当数据格式不便时可以在探针实现中应用变换如用parse正则提取host_release的主次版本号也可以在探针引用中应用变换使不同检查复用同一探针、各取所需的数据形态。以最常用的aggregate为例完整参数见 aggregate.md参数必填类型说明map是Map将列名映射到聚合函数group否字符串或字符串数组用于分组的列名作用类似 T-SQLGROUP BY聚合函数包括and/or对布尔值计算逻辑与/或null、DBNull、空字符串、空数组、字符串false视为false非空字符串/数组及字符串true视为truearray将所有值收集为数组count计数支持distinct默认true只计不重复值与notNull默认true只计非空值两个可选参数join将值转成字符串后拼接默认分隔符, 支持trim、separator、limit、distinct、comparison参数max/min仅限数值列的最大/最小值sum仅限数值列的求和。不加group时聚合作用于全部数据行、返回一行指定group时每个分组返回一行聚合结果。上一节示例中map: { volume_mount_point: join }正是把每个卷的所有挂载点拼成一个字符串的典型用法。更多变换如parse正则解析、rename重命名、defaultValue缺省值填充等可查阅 DataTransformation 参考目录。探针引用与检查、规则的完整配合探针引用不是孤立存在的它最终服务于规则Rule所定义或修改的检查。在 Rule.md 中检查的关键属性包括probes探针引用数组即本文讨论的核心——声明检查取数所需的数据源conditionJSON 对象树形式的表达式使用检查参数与探针数据最佳实践被实现时返回true为false时向用户展示消息locals局部变量是涉及字面量、探针数据与变换结果的任意表达式供条件与消息模板使用见 LocalVariables.mdmessage消息模板支持类似 C# 字符串插值的{变量}语法及:格式说明符如{fragmentation:P2}输出37.20%字符串变量还支持#占位符的条件拼接见 MessageTemplate.md。一个典型的数据流是规则definition/override→ 检查probes 数组中的探针引用→ 探针实现按目标模式取数可带实现级变换→ 引用级 transform → locals/condition/message。探针引用位于这条链的枢纽位置——它决定了取哪个探针、传什么参数、如何变换、如何被其他探针引用。在动手编写自定义探针引用前建议先通读 RulesandProbes.md 理解规则与检查的关系如definition定义检查、override修改检查、enabled: false跳过检查等并参考仓库中现成的规则集如 DefaultRuleset.csv观察真实探针引用的写法。编写探针引用时的注意事项综合文档与配套资料编写探针引用需注意以下几点无副作用设计探针应设计为无副作用的函数探针的调用顺序是不确定的引擎可能为优化目标服务器负载而重排调用当没有检查需要某探针的数据时该探针根本不会被调用Probe.md。因此探针引用之间不应隐式依赖调用先后跨探针传数据必须显式使用别名::变量语法别名冲突与覆盖探针引用既可用id也可用type指定探针取决于所加载规则集中探针的定义方式同一检查内多次引用同一探针时必须使用不同alias否则无法区分各次调用的结果多探针数据组合语义多探针结果按全组合类 CROSS JOIN方式合并、条件逐行求值编写引用与条件时要预估组合爆炸对评估结果消息数量的影响RulesandProbes.md简写优先无参数、无别名、无变换时优先使用字符串简写如probes: [SysDmOsSysInfo]保持规则集 JSON 简洁可读变换顺序敏感transform数组中的变换按声明顺序依次执行如先按两列分组、再按单列分组收敛两级聚合的输出将直接决定下游探针参数与条件表达式的数据形态目标匹配决定探针实现探针可含多个实现每个实现有自己的目标模式引擎选取第一个匹配的实现因此探针引用本身不控制版本差异——版本适配由探针实现层的目标模式完成RulesandProbes.md。掌握以上规则后你可以对照 ProbeReference.md 原文结合 Customization 目录 中的 Rule.md、Probe.md 与 DataTransformation.md并参考 CreatingCustomRules 教程 开始编写你自己的自定义规则与探针引用。赞分享示例工程数据库教程后端【免费下载链接】sql-server-samplesAzure Data SQL Samples - Official Microsoft GitHub Repository containing code samples for SQL Server, Azure SQL, Azure Synapse, and Azure SQL Edge项目地址https://gitcode.com/gh_mirrors/sq/sql-server-samples点击查看免费下载相关推荐Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南 Hap QuickTime视频编码器是一款专为现代图形硬件优化的开源视示例工程数据库教程后端Diffusers 移植数值偏差排查清单从参考实现到 Diffusers 复现的 12 个精度陷阱Diffusers 移植数值偏差排查清单从参考实现到 Diffusers 复现的 12 个精度陷阱 在把第三方扩散模型移植为 Diffusers Pipe示例工程数据库教程后端sql-server-samples 仓库完全指南Azure Data SQL 官方示例库的结构、示例数据库与稀疏检出实战sql server samples 仓库完全指南Azure Data SQL 官方示例库的结构、示例数据库与稀疏检出实战 本文以微软官方 Azure Dat示例工程数据库教程后端上一篇3DS游戏格式转换终极教程5分钟学会用3dsconv轻松转换游戏文件下一篇3DS游戏格式转换终极指南5分钟掌握3dsconv从入门到精通创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考