示例工程数据库教程后端【免费下载链接】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 是随 sql-server-samples 仓库发布的 SQL Server 配置评估机制它通过一套可定制、可扩展的 JSON 规则集Ruleset来检查 SQL Server 环境是否遵循最佳实践。本文以官方参考文档 JSONConfiguration.md 为骨架系统讲解规则集 JSON 文件的完整格式——从引擎顶层结构、Check检查项、Probe探测器及其实现到 SQL 对象匹配模式、版本区间语法和条件表达式求值规则并辅以仓库中的真实示例与源码级佐证。读完本文你将能独立读懂默认规则集 ruleset.json并能编写出自定义检查项与探测器的 JSON 配置文件。一、规则集文件与引擎配置Engine ConfigurationSQL Assessment API 的规则集存储在一个包含 JSON 对象的文本文件中。在深入 Check 与 Probe 之前先了解规则集的顶层骨架。规则集对象包含三个简单的必填属性name、version和schemaVersion其中schemaVersion指定文件格式版本截至仓库文档写作时文件格式版本为 1.0name与version共同构成规则集的唯一标识。规则集中还包含两个可选属性rules规则数组用于构建检查清单和probes探测器定义用于从目标 SQL Server 实例、宿主机器及其他数据源获取真实数据。rules和probes之所以可选是因为一个规则集中的规则可以使用另一个规则集中的探测器。完整的顶层结构参见 RulesetFileStructure.md如下{ name: Ruleset name, version: Ruleset version, schemaVersion: Schema version, rules:[ { … rule A … }, { … rule B … }, … ], probes:{ probe1: [ { … implementation 1 … }, { … implementation 2 … }, … ], probe2: [ … ], … } }而 JSONConfiguration.md 从“引擎配置”的角度给出了一组更聚焦的顶层属性定义| 属性 | 类型 | 说明 | | - | - | - | | version | string | 配置文件版本。当前版本为0.3。 | | checks | array | 每一项是一个 Check 对象。 | | probes | object | 每个属性代表一个 Probe Family。 |需要说明的是这两处文档对顶层对象的命名视角不同RulesetFileStructure.md面向完整的自定义规则集文件rulesprobes而JSONConfiguration.md是 API 层面“引擎配置”的抽象描述checksprobes。在实际仓库示例中如 MakingCustomChecks_sample.json使用的是schemaVersion: 1.0、version、name、rules、probes这套结构读者在编写自定义规则集时应以后者为准。二、SQL Assessment API 的两步评估流程在展开 JSON 语法之前先理解这些配置元素在引擎中如何被使用。根据 RulesandProbes.mdSQL Assessment API 通过两步流程给出最佳实践建议为给定目标构建检查清单Build a checklist清单包含一整套检查项取决于指定目标服务器或数据库遍历清单并报告每条最佳实践违规Report every best practice violation引擎逐项验证目标是否满足某项最佳实践。清单构建过程基于规则。每条规则要么定义一个新检查要么修改一个或多个已有检查。用户可以按顺序向引擎添加多个规则集引擎按添加顺序应用规则。单个检查可被多条规则影响第一条规则必须定义检查并分配唯一字符串 ID后续规则通过 ID 或标签tag引用并覆盖这些检查。检查出现在清单中并不意味着一定会被运行——每个检查都有默认为true的enabled属性若所有规则应用后该属性变为false引擎会跳过该检查。检查本身不直接获取数据而是引用Probe探测器来取数。每个 Probe 返回零行或多行包含命名项的数据若一个检查从多个 Probe 获取数据结果数据集将按“行的所有组合”构造行为类似 T-SQL 中的CROSS JOIN。检查的条件表达式会针对每一行分别求值——例如某数据库用 3 块磁盘存放文件那么磁盘可用空间的最佳实践会对每块磁盘独立判断若两个 Probe 分别产生 2 行和 3 行数据则条件表达式会被求值 2×36 次其中 2 次返回false就产生 2 条建议消息。三、Check 检查项详解Check检查项是 JSON 规则集的核心单元它描述“目标对象应当满足什么样的最佳实践”。JSONConfiguration.md对 Check 的属性定义如下| 属性 | 类型 | 说明 | | - | - | - | | name | string | 简短名称。必须唯一。 | | tags | string 数组 | 检查项的标签集合代表检查分组与类别。在 API 调用中标签可代替检查名使用。 | | displayName | string | 展示给用户的完整名称。 | | description | string | 解释检查目的的详细描述。 | | enabled? | bool | 指示检查是否启用。被禁用的检查不会对任何对象运行。默认值为true。 | | messge | string | 检查失败时展示给用户的建议文本。建议文本可包含{variableName}形式的变量引用此类引用会被替换为变量值的字符串表示还可用{variableName:formatString}形式为变量指定可选格式字符串。 | | target? | SQL Object Pattern | 检查可应用于满足该模式的对象。默认匹配任意对象。 | | probes | string 数组 | 该检查所需的 Probe Family 的 ID 列表。 | | condition? | Condition Expression | 目标对象必须满足的条件表达式。若条件表达式返回false则生成建议。默认值为true。 | | level | string | 严重级别Information、Warning或Critical。 | | any | Expression | 其他属性都被视为检查参数可在检查表达式中以带前缀的变量名访问。参数可以引用变量或其他参数。 |3.1 从规则到检查definition 与 override仓库中规则Rule有两种itemTypedefinition定义一个新检查和override覆盖/修改已有检查。这与上述Check属性中的name/enabled/condition等概念相呼应。以下是 RulesandProbes.md 中定义MaxMemory检查的示例——注意limit作为检查参数对应Check属性中的any在目标版本[11.0,)即 SQL Server 2012 及更高版本上生效{ id: MaxMemory, itemType: definition, target: { type: Server, version: [11.0,) }, limit: 2147483647 }下面的 override 规则则修改同一检查的参数{ id: MaxMemory, itemType: override, limit: 2000000000 }override 还可通过targetFilter针对特定引擎版本做精细化调整——例如对Standard版限制为 131072、对Express版限制为 1410也可以一次性按 ID 或标签批量禁用检查如将id设为[ MaxMemory, Performance ]并配合enabled: false在 Linux 平台上禁用相关检查。这正是enabled属性在真实规则集中的用法。3.2 检查示例Query Store 最佳实践以仓库 MakingCustomChecks_sample.json 中的QueryStoreOn规则为例对照Check属性逐项理解{ target: { type: Database, version: [13.0,), platform: Windows, Linux, engineEdition: OnPremises, ManagedInstance, name: { not: /^(master|tempdb|model)$/ } }, id: QueryStoreOn, itemType: definition, tags: [ CustomRuleset, Performance, QueryStore, Statistics ], displayName: Query Store should be active, description: The Query Store feature provides you with insight on query plan choice and performance…, message: Make sure Query Store actual operation mode is Read Write to keep your performance analysis accurate, helpLink: https://docs.microsoft.com/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store, probes: [ Custom_DatabaseConfiguration ], condition: { equal: [ query_store_state, 2 ] } }target该检查只作用于数据库对象、SQL Server 2016 及以上[13.0,)、Windows 与 Linux 平台、本地部署与托管实例且名称不是master/tempdb/model的数据库conditionequal: [ query_store_state, 2 ]表示从 Probe 获取的query_store_state变量必须等于 2Query Store 实际运行模式为 Read Write 的枚举值才视为合规否则触发建议消息失败时的用户可见输出即message字段。四、Probe 探测器与探针实现详解Probe探测器是 JSON 中的一个属性属性名就是 Check 中使用的探测器族 IDProbe Family ID属性值是一个 probe implementation探针实现数组。引擎按数组顺序检查各实现的目标模式是否匹配目标对象第一个匹配的实现会被用来获取数据——因此数组顺序至关重要。一个 Probe 可以由 CLR 与 SQL 实现混合组成。安全边界Probe 应被设计为无副作用的函数。调用顺序不确定引擎可能为优化目标 SQL Server 负载而重排调用当没有检查需要某 Probe 的数据时该 Probe 不会被调用。默认规则集中的 Probe 只读取元数据如更新日志或服务器属性不会读取表中的用户数据也不会向数据库或实例写入任何内容更不会设置任何标志或属性。安全性由使用者负责。4.1 探针实现Probe implementation探针实现是一个 JSON 对象其属性定义如下| 属性 | 类型 | 说明 | | - | - | - | | type | string | 探针类型。支持的值SQL、WMI、External、PowerShell、CmdShell、AzGraph、AzMetadata、Registry。 | | target? | SQL Object Pattern | 探针可应用于满足该模式的对象。 | | implementation | object | 探针所需的任意参数。typeSQL的探针需要query属性包含用于获取探针数据的 SQL 命令typeCLRExternal的探针需要class属性指定类名和assembly属性指定程序集。其他属性用于填充新的类实例。 |除implementation、target、type外探针实现还可包含requires显式功能需求若未满足则该探针不执行、依赖它的检查被跳过并返回警告和runFor显式逻辑需求若未满足则立即返回空结果集详见 Probe.md。探针类型与数据来源对照表见 Probes/README.md| 类型 | 描述 | | - | - | | AzGraph | 针对 Azure Resource Graph 的 Kusto 查询 | | AzMetadata | 针对 Azure Instance Metadata Service 返回对象的 JSONPath | | CMD | 在目标机器上运行的命令脚本 | | External | 任意 .NET 代码 | | PowerShell | PowerShell 脚本 | | Registry | 注册表数据 | | SQL | T-SQL 查询 | | WMI | WMI 查询 |4.2 SQL 探针实现SQL 探针实现的核心属性是query一段 T-SQL 查询查询可以按名称引用参数例如TargetName。仓库中的真实探针Custom_DatabaseConfiguration就包含了多个针对不同 SQL Server 版本的实现参见 MakingCustomChecks_sample.json例如面向 SQL Server 2016 及以上的实现{ type: SQL, target: { type: Database, version: [13.0,), platform: Windows, Linux, engineEdition: OnPremises, ManagedInstance }, implementation: { useDatabase: true, query: SELECT db.is_auto_create_stats_on, db.is_auto_update_stats_on, (SELECT CAST(actual_state AS DECIMAL) FROM [sys].[database_query_store_options]) AS query_store_state, db.collation_name, (SELECT collation_name FROM master.sys.databases (NOLOCK) WHERE database_id 1) AS master_collation, db.is_auto_close_on, db.is_auto_shrink_on, db.page_verify_option, db.is_db_chaining_on, db.is_auto_create_stats_incremental_on, db.is_trustworthy_on, db.is_parameterization_forced FROM [sys].[databases] (NOLOCK) AS db WHERE db.[name]TargetName } }注意其中的useDatabase: true键当查询需要在被评估的数据库上下文中运行时使用它相当于USE DATABASENAME;的替代品。由于各版本 SQL Server 的 DMV 可能不同同一个 Probe 往往有多个实现每个实现都有与规则相同的目标说明引擎会为每个目标选用最合适的实现。4.3 ExternalCLR探针实现External 探针实现引用给定程序集中的任意 .NET 类。该类必须实现IProbeImplementation接口| 属性 | 类型 | 说明 | | - | - | - | | assembly | string | 指定要加载的程序集。 | | class | string | 类的完整名称Full class name。 |仓库 notebooks/CustomizationSamples 目录下提供了CustomRuleCLRProbe.json、CustomRuleWMIprobe.json、CustomRulePowerShellProbe.json、CustomRuleCmdShellProbe.json、CustomRuleRegistryProbe.json等各类探针的完整示例并附带了TestsProbeLibrary.dll测试探针程序集供读者对照学习。4.4 数据变换Data Transformation探针返回的数据往往不是最终可直接用于条件判断的格式。此时可以在implementation中嵌套transform对象对输出做变换详见 DataTransformation.md。例如以下 T-SQL 查询返回形如10.0.19044.2006的host_release字符串用parse变换提取主、次版本号implementation: { query: SELECT host_platform, host_release FROM sys.dm_os_host_info, transform: { type: parse, map: { host_release: /^(?major\\d)\\.(?minor\\d) } } }变换还可以应用于探针引用Probe Reference以提升探针复用性当某个检查需要某项指标的平均值、而另一个最佳实践涉及同一指标的最大值时两个检查可以引用同一 Probe 但各自应用自己的变换——不仅代码被复用数据也被复用Probe 只会被调用一次。更多变换类型aggregate、defaultValue、nameValuePairs、noData、parse、performance、rename、toString参见 DataTransformation 参考文档。五、SQL Object Pattern 对象匹配模式target规则与target探针实现使用的 SQL Object Pattern 用于过滤规则和探针实现适用的对象只有匹配该模式的 SQL Server 实例和数据库才会被相应规则应用。借助它可以针对特定版本、特定版本或特定数据库定制规则。所有属性均为可选——省略某个属性意味着匹配所有值。目标模式可用的属性包括详见 TargetPattern.md| 属性 | 允许值 / 说明 | | - | - | | type |Server、Database可逗号分隔组合。 | | engineEdition |PersonalOrDesktopEngine、Standard、Enterprise、Express、AzureDatabase、DataWarehouse、StretchDatabase、ManagedInstance短名Azure 后四种SqlServer 前四种。 | | name | 目标对象名称数据库名或实例名的字符串模式。 | | serverName | SQL Server 实例名称的字符串模式。 | | machineType |Physical、AzureVm、Hypervisor、Other。 | | platform |Windows、Linux。 | | version | 版本模式版本区间列表见下文。 |JSONConfiguration.md重点展开的两种模式语法如下。5.1 正则表达式Regular expression正则表达式用斜杠包裹/Win*./。斜杠后可以指定正则选项例如/win.*/i表示不区分大小写的搜索。若字符串不以斜杠开头则视为精确字符串匹配——字符串Linux等价于正则/^Linux$/。补充来自 TargetPattern.md字符串模式可以是字符串、JSON 对象或字符串模式数组数组递归匹配“任一元素匹配”。以 JSON 对象表示时只能有一个名为not的属性其值必须是任意字符串模式含义为“匹配所有不匹配该值的对象”。另外SQL Assessment API 基于 .NET 正则表达式默认不区分大小写如需区分大小写使用c选项如/win.*/c。5.2 版本区间列表Version range list版本区间列表是一个版本区间或版本区间数组。单个版本区间等价于只含一个元素的数组。版本区间列表匹配任何与其任一区间匹配的版本version: [ [10.0.4326,10.0.4371], [10.0.5794,10.50), [10.50.2806,11.0), [11.0.2316,) ]5.3 版本区间Version range版本区间由字符串编码包含一个或两个版本以逗号分隔并可选地用圆括号或方括号包裹。若有两个版本前者必须小于等于后者它们代表区间边界。版本至少需要以句点分隔的两个数字指定主版本号和次版本号。该格式遵循 NuGet 版本区间格式。完整对照表如下| 版本区间 | 匹配内容 | | - | - | |10.0| 精确匹配版本 10.0。 | |[10.0, 13.0]| 10.0 与 13.0 之间含两端10.0、10.50、11.0.345、13.0。 | |(10.0, 13.0)| 10.0 与 13.0 之间不含两端10.50、11.0.345。不匹配 10.0 或 13.0。 | |[10.0, 13.1)| 10.0 与 13.1 之间不含右边界10.0、10.50、11.0.345、13.0、13.0.234。不匹配 13.1。 | |(10.0, 13.1]| 10.0 与 13.1 之间不含 10.0。 | |[10.0,)| 10.0 及以上含 10.0。 | |(10.0,)| 10.0 以上但不含 10.0 本身。 | |(,10.0]| 10.0 或以下。 | |(,10.0)| 10.0 以下但不含 10.0。 |实际示例version: [[13.0.5026.0, 14.0), [12.0.6024.0, 13.0), [15.0)]匹配 SQL Server 2016 SP2、2014 SP3 以及 2019。六、目标模式在探针中的多实现路由目标模式最典型的应用是让同一个 Probe 族根据目标版本路由到不同实现。以Custom_DatabaseConfiguration探针为例它针对数据库对象分别提供了三套 SQL 实现版本(,12.0)SQL Server 2014 之前、[12.0, 13.0)SQL Server 2014与[13.0,)SQL Server 2016 及以上。三套实现的查询几乎相同差别在于早期版本无法直接读取 Query Store 状态因此硬编码0 AS query_store_state2016 及以上版本则通过useDatabase: true配合子查询(SELECT CAST(actual_state AS DECIMAL) FROM [sys].[database_query_store_options])动态读取。这正是引擎“按顺序选取第一个目标匹配的实现”机制的实战体现。另一个例子是Custom_EnabledGlobalTraceFlags探针其实现通过DBCC TRACESTATUS收集全局跟踪标志并使用transform: { type: aggregate, map: { TraceFlag: array } }将多行跟踪标志聚合成数组便于检查条件用in操作符判断如in: [ 834, TraceFlag ]Custom_EnabledGlobalTraceFlags: [ { type: SQL, target: { type: Server, engineEdition: OnPremises, ManagedInstance }, implementation: { query: DECLARE tracestatus TABLE (TraceFlag NVARCHAR(40), [Status] tinyint, [Global] tinyint, [Session] tinyint); INSERT INTO tracestatus EXEC (DBCC TRACESTATUS WITH NO_INFOMSGS); IF NOT EXISTS(SELECT * FROM tracestatus WHERE Global1) SELECT 0 AS [TraceFlag], 0 AS [Status] ELSE SELECT [TraceFlag], [Status] FROM tracestatus WHERE Global1, transform: { type: aggregate, map: { TraceFlag: array } } } } ]七、表达式 Expression 与操作符表达式定义用于决定是否向用户给出建议的计算逻辑。表达式系统是规则集 JSON 中最具表达力的部分。7.1 字面量与变量布尔字面量JSON 值true和false被当作布尔常量。数字字面量JSON 数字被当作十进制常量。字符串字面量字符串字面量代表字符串但以字符开头的字符串除外——它们是对变量的引用。变量变量由包含其名称、并以前缀开头的字符串表示。变量值由探针设置被表达式或建议文本消费如{variableName}、{variableName:formatString}。7.2 表达式 JSON 对象只有一个属性的 JSON 对象是按该属性表示的表达式见下文“属性表达式”。具有多个属性的 JSON 对象是AND 运算的简写其参数是对象的各个属性结果在可能的情况下转换为布尔类型。因此下面两个表达式等价expression1: { version: 10.50.0, memroySize: 4096 } expression2: { and: [ {version: 10.50.0}, {memroySize: 4096} ] }7.3 属性表达式Property Expressions任何表达式都可以用 JSON 属性的形式表示属性名是操作名属性值是操作参数的数组。参数可以是除条件表达式外的任何表达式。当属性名以开头时它不是操作名而是equal等于运算的简写——变量作为第一个参数、唯一属性值作为第二个参数。以下两个表达式等价expression1: {memorySize: 4096} expression2: { equal: [ memorySize, 4096 ] }7.4 条件表达式Condition Expression条件表达式可以是任何表达式也可以是表达式数组。表达式数组是 OR 运算的简写数组中的各项是操作参数。以下两个表达式等价condition: [ {version: 10.50.0}, {memroySize: 4096} ] condition: { or: [ {version: 10.50.0}, {memroySize: 4096} ] }注意OR 的简写形式仅在条件表达式中生效而 AND 的简写形式在任意位置都生效。例如下面两个表达式等价condition: { version: 10.50.0, memroySize: 4096 } condition: { and: [ {version: 10.50.0}, {memroySize: 4096} ] }7.5 可用操作符参考表达式中的操作符共分五类完整参考见 Operators.md逻辑Logical| 操作符 | 参数 | 描述 | | - | :-: | - | | not | (x) | 逻辑非。 | | and | (a..) | 逻辑与。无参数时返回false。 | | or | (a..) | 逻辑或。无参数时返回true。 |字符串String| 操作符 | 参数 | 描述 | | - | :-: | - | | indexof | (str_a, str_b) | 在 str_a 中查找 str_b 首次出现的零基索引。区分大小写。 | | iindexof | (str_a, str_b) | 同上不区分大小写。 | | startswith / istartswith | (str_a, str_b) | str_a 是否以 str_b 开头区分/不区分大小写。 | | endswith / iendswith | (str_a, str_b) | str_a 是否以 str_b 结尾区分/不区分大小写。 |数学Math| 操作符 | 参数 | 描述 | | - | :-: | - | | ceiling / floor | x | 向上/向下取整。 | | max / min | (a, b) | 取较大/较小值。 | | mul / div / mod | (a..) / (a, b) | 乘 / 除 / 取余。 | | add / sub | (a..) / (a, b) | 加 / 减。 | | bitand / bitor / bitxor | (a..*) | 按位与 / 或 / 异或。 |集合Set| 操作符 | 参数 | 描述 | | - | :-: | - | | intersect | (a, b) | 集合交集。区分大小写。 | | in | (a, b) | 检查 a 是否在集合 b 中。区分大小写。 | | iin | (a, b) | 同上不区分大小写。 |比较Comparison| 操作符 | 同义词 | 参数 | 描述 | | - | - | :-: | - | | lt / gt | less / greater | (a, b) | 小于 / 大于。 | | eq / ieq | equal | (a, b) | 相等区分/不区分大小写。 | | ge / le | greaterequal / lessequal | (a, b) | 大于等于 / 小于等于。 | | ne / ine | notequal | (a, b) | 不相等区分/不区分大小写。 | | match / imatch | | (a, b) | 正则表达式匹配b 视为正则区分/不区分大小写。 | | interval | | (a, v₁, t₁, …, vₙ, tₙ, d) | 找到第一个大于等于 a 的 tᵢ 并返回对应的 vᵢ若所有 t 都小于 a 则返回 d。 |八、综合示例完整自定义规则集剖析仓库根目录的 MakingCustomChecks_sample.json 是一个可直接参考的完整自定义规则集它包含两个自定义检查QueryStoreOn与Custom_TF834及两个探针族Custom_DatabaseConfiguration与Custom_EnabledGlobalTraceFlags其结构如下{ schemaVersion: 1.0, version: 0.2, name: Custom Checks Ruleset, rules: [ … ], probes: { … } }值得注意的细节QueryStoreOn规则同时使用了tagsCustomRuleset, Performance, QueryStore, Statistics、probes[Custom_DatabaseConfiguration]与condition{equal: [query_store_state, 2]}完整覆盖了Check属性表中的各字段Custom_TF834规则除了definition外还有一个itemType: override的条目通过targetFilter: { version: (,11.0) }针对 11.0 以下版本提供不同的description、message与helpLink——演示了同一规则 ID 的覆盖机制两个探针族各自包含多个按版本路由的 SQL 实现并演示了transformaggregate的用法。若想禁用内置检查可以参考 DisablingBuiltInChecks_sample.json它演示了按规则 ID 禁用指定规则、按TraceFlag标签批量禁用以及针对名为DBName1、DBName2的数据库禁用默认规则集全部规则通过DefaultRuleset标签三种方式。想系统学习自定义规则的读者还可以查看 CreatingCustomRules.md、DisablingBuiltInRules.md 与 OverridingDefaultThresholds.md 等教程。九、快速上手与相关资源编写好规则集后可通过 PowerShell SqlServer 模块快速发起评估详见 QuickStart.mdInstall-Module -Name SqlServer -AllowClobber -Force Get-Module对本地 SQL Server 实例运行评估Get-SqlInstance -ServerInstance localhost | Invoke-SqlAssessment对本地实例上所有数据库运行评估Get-SqlDatabase -ServerInstance localhost | Invoke-SqlAssessment评估结果中每条规则都带有严重级别Info / Warning / Critical、建议文本Message、指向官方文档的HelpLink以及标识来源规则集与版本的Origin属性。进一步深入可参考的仓库资源默认规则集 JSONruleset.json默认规则集可读 CSV 版DefaultRuleset.csv自定义规则教程CreatingCustomRules.md、DisablingBuiltInRules.md、OverridingDefaultThresholds.md各类探针T-SQL / WMI / PowerShell / CMD / Registry / External / AzGraph / AzMetadata参考Probes 参考目录自定义规则 Notebook 示例CustomizationSamples完整教程 NotebookSQLAssessmentAPITutorialNotebook.ipynb赞分享示例工程数据库教程后端【免费下载链接】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点击查看免费下载相关推荐RedisInsight完整指南免费Redis可视化工具如何简化数据库管理RedisInsight完整指南免费Redis可视化工具如何简化数据库管理 RedisInsight作为Redis官方推出的免费开源可视化工具彻底改变了开发示例工程数据库教程后端Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南Hap QuickTime视频编码器实现10倍性能提升的硬件加速视频编解码架构设计指南 Hap QuickTime视频编码器是一款专为现代图形硬件优化的开源视示例工程数据库教程后端如何快速上手nbterm10个实用技巧让终端笔记本操作更简单如何快速上手nbterm10个实用技巧让终端笔记本操作更简单 想要在终端中高效地使用Jupyter Notebooks吗nbterm是你的终极解决方案这款示例工程数据库教程后端上一篇ReactJS 101路由实战如何使用React Router构建单页应用的7个技巧下一篇IETF 草案 draft-hardt-email-verification 全解读Email Verification API 的协议底座完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
