从传统分区到微分区,Snowflake 与 Databend 如何减少数据扫描

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

Cluster Key 专题介绍

Cluster Key 决定了大表中的数据如何在物理层面聚集,也直接影响查询需要扫描多少数据。但从“知道语法”到“真正用对”,中间至少隔着三个问题:它为什么有效、应该怎么选,以及 Databend 的实现有什么特点。本系列共 2 篇:

  1. 原理篇(本文):从传统 Partition、Micro-partition 和 Block 出发,解释 Min/Max Pruning、数据重叠与 Cluster Key 的工作原理。
  2. 最佳实践篇:回答列怎么选、复合列顺序怎么排,以及时间字段使用原始值还是 Day、Week、Month 等粒度。进一步解读 Databend Cluster Key 的数据组织、自动聚类、Recluster、观测指标与适用边界。

这个系列的目的是帮助数据工程师建立一套判断方法:什么时候需要 Cluster Key、它为什么能减少扫描、维护成本是否值得,以及如何用指标验证设计是否有效。


导读: Cluster Key 不是 B-tree 索引,也不是给每个字段各建一套独立的访问路径。它通过改善数据的物理局部性,让相近的 Key Values 尽量落入相同或相邻的 Micro-partitions / Blocks,从而缩小每个物理单元的 Min/Max 范围,减少范围重叠,让查询在读取数据前跳过更多不可能命中的物理单元。


为什么理解 Cluster Key,要先理解“数据放在哪里”

很多用户第一次接触 Snowflake 或 Databend 的 Cluster Key,会把它理解成数据库索引,或者简单类比为 ORDER BY。这种解释抓住了“数据会变得更有序”的表面现象,却没有回答最重要的问题:

数据更有序以后,查询为什么会扫描得更少?

答案不在 Cluster Key 本身,而在它背后的完整链路:

数据写入物理单元
  → 引擎记录每个物理单元的列统计信息
  → 查询谓词与统计信息比较
  → 排除不可能命中的物理单元
  → 只读取剩余数据

Cluster Key 的作用,是改善这条链路中的第一步:让相关数据在物理上更集中,使后续的 Data Pruning 更有效。

从这个角度看,可以把 Cluster Key 暂时理解为一种由引擎维护、作用在 Micro-partition / Block 层面的自动、动态 Range Partition。这个类比有助于建立直觉,但它并不意味着 Cluster Key 等同于传统硬分区,后文会专门说明两者的边界。

Snowflake 与 Databend 在 Micro-partition / Block、列统计信息、Pruning 和 Clustering 上可以建立相似的心智模型。但两者的存储格式、后台维护机制和操作接口并不完全相同。


传统 Partition:用户先定义边界,引擎再放置数据

假设有一张持续增长的 LLM Eval 结果表:

CREATE TABLE llm_eval_results (
    created_at  TIMESTAMP,
    project_id  VARCHAR,
    eval_run_id VARCHAR,
    trace_id    VARCHAR,
    score       DOUBLE,
    passed      BOOLEAN
);

随着评测任务不断运行,这张表可能积累数亿甚至数十亿行数据。传统数仓常按月建立 Range Partition:

2026-07 partition
2026-08 partition
2026-09 partition

在对象存储中,也可能表现为目录边界:

/year=2026/month=07/
/year=2026/month=08/
/year=2026/month=09/

这种分区方式有四个典型特征:

  1. 分区字段由用户选择;

  2. 分区边界通常由用户预先定义;

  3. 每个分区都有明确的逻辑范围;

  4. 一个分区内部仍然可能包含大量文件、Row Groups 或 Blocks。

查询某一天的数据时:

WHERE created_at >= '2026-08-01'
  AND created_at <  '2026-08-02'

引擎可以先排除 7 月和 9 月,只访问 8 月分区。这就是传统的 Partition Pruning。

问题在于,Partition Pruning 通常只能把范围缩小到一个较粗的边界。进入 8 月分区后,如果缺少更细粒度的统计信息,引擎仍然可能读取大量数据。因此,粗粒度 Partition 不能替代文件、Row Group 或 Block 级别的 Pruning。

传统分区还需要在粒度之间做取舍:

  • 分区太粗,分区内部扫描量仍然很大;

  • 分区太细,容易产生大量小文件和元数据;

  • 新范围到来时,可能需要继续维护分区边界;

  • 查询模式变化后,原有分区设计未必仍然合适。

Snowflake 和 Databend 采用了另一种思路:用户不必逐个声明大量细粒度分区,引擎会根据数据量、写入批次和存储策略自动形成更小的物理数据单元。

图 1:传统 Partition 使用用户定义的粗粒度边界;Micro-partition / Block 由引擎自动形成,边界可以更细,也不必与自然月严格对齐。


Micro-partition 与 Block:引擎自动形成的物理数据单元

Snowflake 会自动把表数据组织成 Micro-partitions。Databend 的 Fuse Engine 会把数据写入 Blocks,并使用更高一层的 Segments 组织多个 Blocks。

两者内部实现并不相同,但在理解 Cluster Key 时,可以先使用下面这个共同模型:

Table
├── Physical Unit 1
├── Physical Unit 2
├── Physical Unit 3
└── Physical Unit 4

其中:

  • 在 Snowflake 中,Physical Unit 可以理解为 Micro-partition;

  • 在 Databend 中,Physical Unit 可以理解为 Block。

与传统 Partition 相比,关键差异不是名称,而是边界由谁管理:

用户通常不需要逐个定义 Micro-partition 或 Block 的范围。引擎会自动形成这些物理单元,并为它们维护可用于查询裁剪的元数据。

最容易理解的一类元数据,是每一列在物理单元中的最小值和最大值,也就是 Min/Max。

例如,某列的物理分布为:

Block A
created_at: [2026-07-01, 2026-07-07]

Block B
created_at: [2026-07-08, 2026-07-14]

Block C
created_at: [2026-08-01, 2026-08-07]

此时查询:

WHERE created_at >= '2026-07-10'
  AND created_at <  '2026-07-12'

引擎可以在读取实际列数据之前比较查询范围与 Min/Max:

  • Block A 的最大值早于 7 月 10 日,可以跳过;

  • Block C 的最小值晚于查询范围,可以跳过;

  • Block B 与查询范围相交,可能包含结果,需要读取。

这就是 Min/Max Pruning,也常被称为 Data Skipping。

图 2:谓词与物理单元的 Min/Max 不相交时,引擎可以直接跳过;范围相交只表示“可能命中”。

这里有一个非常重要的边界:

Min/Max 只能判断目标值是否一定不在这个物理单元中,不能证明范围内的某个值一定存在。

例如:

Block A trace_id: [trace_0001, trace_9999]

查询:

WHERE trace_id = 'trace_5000'

即使 trace_5000 实际不存在,只要它落在 Min/Max 范围内,引擎就不能仅凭 Min/Max 排除该 Block。Databend 还可以结合 Block-level Bloom Filter 等机制进一步过滤部分等值查询候选,但 Bloom Filter 与 Cluster Key 解决的不是同一个问题:前者判断成员是否可能存在,后者改善数据的整体物理布局。


Pruning 为什么会失效:问题往往出在范围重叠

Min/Max Pruning 的效果,很大程度上取决于同一个物理单元中的数据是否接近,以及不同物理单元的范围是否大量重叠。

数据接近有序时

假设数据按时间接近有序地写入:

Block A: [07-01, 07-07]
Block B: [07-08, 07-14]
Block C: [07-15, 07-21]

查询 7 月 10 日时,只需要读取 Block B。

数据高度乱序时

如果多个任务并发写入,同时不断回灌历史数据,物理布局可能变成:

Block A: [07-01, 07-21]
Block B: [07-02, 07-20]
Block C: [07-03, 07-19]

查询同样的 7 月 10 日,三个 Blocks 都可能包含结果,因此一个也不能排除。

图 3:同一个查询面对不同数据布局时,候选 Blocks 数量可能完全不同。

这说明,Pruning 变差不一定是因为引擎没有 Min/Max,而可能是因为:

  • 单个物理单元的范围太宽;

  • 多个物理单元的范围高度重叠;

  • 同一个 Key Value 同时落入过多候选范围。

Overlap 和 Clustering Depth 正是用于描述这种状态的指标。直观地说,同一个值覆盖的物理范围越多,查询需要保留的候选单元通常越多。Snowflake 可以通过 SYSTEM$CLUSTERING_INFORMATION 观察 Micro-partition 的 Overlap 与 Depth;Databend 的 clustering_information 也会返回 Block 数、Average Overlaps、Average Depth 和深度分布。

Cluster Key 要解决的核心问题,就是降低这种无效重叠。


Cluster Key 到底改变了什么

假设设置:

CLUSTER BY (created_at)

它表达的不是“为 created_at 建立一个传统索引”,而是告诉引擎:希望数据沿 created_at 这个维度改善物理组织,让时间接近的记录尽量进入相同或相邻的物理单元。

理想情况下,布局从:

Block A: [07-01, 07-21]
Block B: [07-02, 07-20]
Block C: [07-03, 07-19]

逐步改善为:

Block A: [07-01, 07-07]
Block B: [07-08, 07-14]
Block C: [07-15, 07-21]

它产生效果的因果链是:

定义 Cluster Key
  → 相近的 Key Values 更集中
  → 每个物理单元的值域更窄
  → 不同物理单元的范围重叠减少
  → Min/Max Pruning 排除更多候选单元
  → 实际扫描的数据量下降

因此,Cluster Key 不是查询结果的直接入口,也不会像 B-tree 一样把查询定位到某个 Row ID。它通过改善数据布局,间接增强已有元数据的裁剪能力。

Reclustering 是维护过程,不是免费收益

持续写入、更新和历史数据回灌会再次打乱物理布局。Reclustering 会选择部分数据重新组织,使其更接近 Cluster Key 所描述的顺序。

这个过程需要排序、读取、重写和存储资源,因此存在明确成本:

  • Snowflake 主要通过 Automatic Clustering 在后台维护聚类,Manual Reclustering 已被标记为 Deprecated。后台维护使用服务端计算资源,并产生相应 Credits 与存储影响。

  • Databend 当前也提供后台自动聚类能力,同时保留显式的 ALTER TABLE ... RECLUSTER,并支持 FINAL、WHERE 和 LIMIT 等控制方式。显式 Recluster 同样会消耗时间和计算资源,在 Databend Cloud 中也会产生 Credits。

Reclustering 的目标是改善最混乱的数据范围,而不是保证所有 Micro-partitions / Blocks 最终完全不重叠。是否值得维护,取决于减少的查询扫描成本能否覆盖聚类成本。


为什么可以把 Cluster Key 理解为“动态 Range Partition”

传统 Range Partition 的工作方式是:

用户预先定义范围
  → 2026-07 放入 7 月分区
  → 2026-08 放入 8 月分区
  → 2026-09 放入 9 月分区

Cluster Key 驱动的物理组织更接近:

用户指定聚集维度
  → 引擎按数据量自动形成物理单元
  → 每个物理单元根据实际数据得到 Min/Max 范围
  → 后台维护根据数据变化动态调整布局

例如,按时间聚类后形成的边界可能是:

Block 1: [07-01 00:00, 07-03 15:20]
Block 2: [07-03 15:21, 07-08 09:10]
Block 3: [07-08 09:11, 07-19 18:40]
Block 4: [07-19 18:41, 08-02 11:30]

这些边界不是用户提前写在 DDL 中的,而是由真实数据分布与物理单元大小共同决定。

对比项传统 Range PartitionCluster Key 驱动的物理组织
边界由谁定义用户预先定义引擎根据数据自动形成
常见粒度较粗的业务范围Micro-partition / Block 级别
边界是否固定相对固定随写入和聚类维护变化
用户声明什么具体 Partition Range聚集列或表达式
主要价值数据管理、生命周期和粗粒度裁剪改善物理局部性和细粒度裁剪

这个类比最有价值的地方,是帮助读者理解“按范围组织数据”。它的边界也必须说清楚:

Cluster Key 可以看作 Micro-partition / Block 层面的自动、动态 Range Partition,但它不是传统硬分区,也不保证每个物理单元严格落在某个业务边界内。


一个必要的复合 Key 示例:month, trace_id 代表什么

本文不展开 Cluster Key 的选列方法,但要正确理解其物理语义,必须先澄清复合 Key 的顺序。

如果查询通常先限定月份,再回查 trace_id,可以考虑:

CLUSTER BY (
    DATE_TRUNC('month', created_at),
    trace_id
)

可以把这个 Tuple 按字典序理解:

先按 month 组织
  → month 相同或接近时,再按 trace_id 组织

可能形成类似布局:

Block 1: 2026-07 / trace_0001 ... trace_1000
Block 2: 2026-07 / trace_1001 ... trace_2000
Block 3: 2026-07 / trace_2001 ... 2026-08 / trace_0050
Block 4: 2026-08 / trace_0051 ... trace_1100
Block 5: 2026-08 / trace_1101 ... trace_2200

注意 Block 3 仍可能跨月。这再次说明,month 是主要组织维度,不是“每月一个硬分区”的边界声明。

这种布局适合同时包含月份和 trace_id 的查询:

WHERE created_at >= '2026-08-01'
  AND created_at <  '2026-09-01'
  AND trace_id = 'trace_1024'

引擎可以先利用月份范围排除大量物理单元,再使用 trace_id 的统计信息继续缩小候选范围。

但如果查询只有:

WHERE trace_id = 'trace_1024'

同一个 trace_id 可能出现在不同月份,引擎仍可能检查多个时间范围。

因此:

CLUSTER BY (month, trace_id) 不等于同时拥有一套独立的 Month 索引和一套独立的 trace_id 索引。前导表达式决定主要物理顺序,后续表达式主要在前导值相同或接近的范围内发挥作用。

至于哪些列应该放在前面、时间应该保留原始 Timestamp 还是降低到 Day / Week / Month,以及高基数 trace_id 是否值得加入,将在本系列第二篇集中讨论。


Snowflake 与 Databend:相似的思想,不同的产品边界

Snowflake 和 Databend 都通过自动形成的细粒度物理单元、列统计信息和聚类布局减少扫描。对用户来说,两者可以共享“改善物理局部性以增强 Pruning”这一核心心智模型。

但在产品能力与使用方式上,仍有几处值得区分。

维度SnowflakeDatabend
基础物理单元Micro-partitionFuse Block,多个 Blocks 由 Segment 组织
Cluster Key 的核心作用将相关记录共同组织到更合适的 Micro-partitions按列或表达式改善 Blocks 的物理组织
默认维护方式Automatic Clustering 后台评估并维护;Manual Reclustering 已 Deprecated提供后台自动聚类,同时保留显式 RECLUSTER 控制
显式维护能力可暂停或恢复 Automatic Clustering,主要由服务管理资源RECLUSTER 支持 FINAL、WHERE、LIMIT,可控制维护范围与深度
聚类观测SYSTEM$CLUSTERING_INFORMATION 等系统函数clustering_information 返回 Block Count、Overlap、Depth 等指标
主要用户心智声明聚集维度,由托管服务维护,并关注 Credits 与存储影响声明聚集维度,可依赖自动维护,也可查看 Block 级指标并显式调优

Snowflake:强调托管式的自动维护

Snowflake 默认自动创建 Micro-partitions,并维护其列级元数据。对于非常大的表,如果自然写入顺序无法满足主要查询路径,用户可以定义 Clustering Key,之后主要由 Automatic Clustering 评估并执行维护。

这种产品体验的重点是“声明目标,平台维护”。用户不需要指定执行 Reclustering 的 Warehouse,但仍然需要评估 Automatic Clustering 带来的 Credits 和存储成本。Snowflake 官方也明确指出,Clustering Key 并不适合所有表,通常更适用于具有大量 Micro-partitions、查询足够有选择性且访问模式较稳定的大表。

Databend:自动维护之外,保留更直接的物理调优入口

Databend 使用 Fuse Blocks 和 Segments 组织对象存储上的数据。定义 Cluster Key 后,系统可以在后台持续维护数据布局;与此同时,Databend 仍向用户开放 RECLUSTER 命令和 clustering_information 指标。

这使 Databend 的用户心智同时包含两层:

  1. 声明式使用:定义 Cluster Key,让系统持续改善物理布局;

  2. 可观察、可干预:通过 Block Count、Overlap 和 Depth 判断聚类质量,并在需要时显式控制 Recluster 范围。

这不是“自动”与“手动”的简单二选一,而是产品边界不同:Snowflake 更强调由托管服务接管维护;Databend 在提供自动聚类的同时,保留了更直接的 SQL 控制面。对数据工程团队而言,后者便于把聚类维护纳入批处理窗口或特定数据范围,但也要求团队理解显式操作的资源与写入影响。

不要把 Cluster Key 当作通用加速开关

无论使用 Snowflake 还是 Databend,Cluster Key 都不应该默认加到每一张表上。它更适合满足以下条件的场景:

  • 表已经足够大,查询确实扫描了大量物理单元;

  • 主要查询包含稳定且有选择性的过滤条件;

  • 多数高价值查询可以从同一组聚集维度获益;

  • 查询节省能够覆盖持续写入和 Reclustering 的维护成本。

对于小表、查询模式高度随机的表,或者自然写入顺序已经与主要过滤维度一致的表,增加 Cluster Key 可能收益有限,甚至只增加维护成本。


建立正确心智:Cluster Key 优化的是扫描路径,不是 SQL 语法

现在可以把 Partition、Micro-partition、Block、Pruning 和 Cluster Key 串成一条完整链路:

传统 Partition
  → 用户定义粗粒度硬边界

Snowflake Micro-partition / Databend Block
  → 引擎自动形成细粒度物理单元

Min/Max Metadata
  → 描述每个物理单元可能覆盖的值域

Pruning
  → 排除不可能命中谓词的物理单元

Cluster Key
  → 改善数据的物理局部性
  → 缩小单元值域并减少范围重叠
  → 让 Pruning 跳过更多数据

Reclustering
  → 在持续写入后维护这种布局
  → 以额外计算和存储成本换取扫描收益

对新用户来说,最重要的认识不是记住某个 DDL,而是把 Cluster Key 看成一项物理布局选择。任何布局都会偏向一类查询,也必然对其他查询做出取舍。

下一步才是实践问题:

  • 哪些列最常出现在有选择性的过滤条件中?

  • 复合 Cluster Key 的列顺序应该怎么排?

  • 时间字段应该保留原始 Timestamp,还是按 Day、Week、Month 降低粒度?

  • trace_id、eval_run_id 这类高基数字段是否适合作为 Cluster Key?

  • Boolean、Status 等低基数字段为什么可能没有效果?

  • 自然写入顺序已经接近有序时,还有没有必要聚类?

  • 如何通过扫描比例、Overlap 和 Depth 验证 Cluster Key 是否真正有效?

这些问题将在本系列第二篇《Cluster Key 最佳实践:列怎么选、顺序怎么排,粒度多大才合适?》中展开。

给新人的储能系统入门图解:从电芯到EMS,一张图看懂BESS里那些‘黑话’ 本文通过视觉化拆解储能系统,从电芯到EMS详细解析BESS中的关键组件和行业术语。涵盖电芯参数、模组组装、PCS功能、BMS与EMS分工,以及SOC、DOD等关键运维参数,帮助新人快速理解储能系统的核心技术和应用场景。 阅读详情

相关推荐

蓝牙HCI Dongle实战:从芯片选型到协议栈集成的完整指南

本文详细介绍了蓝牙HCI Dongle的实战应用,从芯片选型到协议栈集成的完整指南。通过对比CSR8510、nRF52840等主流芯片的性能和价格,提供选型建议和避坑技巧。同时,深入解析Zephyr协议栈移植和常见问题排查,帮助开发者高效完成蓝牙项目开发。

weixin_30786657的博客 322

001:一个快速、可嵌入、模块化的分析查询引擎

通过插件开发,我们能够极大地释放Typora的潜力,使其从一个优秀的Markdown编辑器进化为一个高度定制化的“写作操作系统”。回顾核心要点:从环境搭建、API学习到实战开发与性能优化。未来可能性:AI辅助写作集成、云同步插件、多人在线协作编辑等。行动号召:鼓励读者从一个小需求开始,动手开发自己的第一个Typora插件,共同丰富Markdown写作的工具生态。

339

睿尔曼超轻量仿人机械臂-ROS第一篇 启动机械臂的Moveit

本文主要讲述了睿尔曼六轴机械臂在ROS中的功能包配置,及如何根据文件启动Moveit做仿真。

realman_Rop的博客 7490

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 228

基于STM32L4XX 、HAL库的DRV8833RTYR步进电机驱动器驱动程序应用设计

/ 注:具体计算取决于你的定时器配置,例如 Period=1000, duty_cycle 0-100 -> compare_value = duty_cycle * 10。// 控制电机方向/停止/刹车。//================== 硬件引脚映射 (请根据实际电路修改) ==================

PP_Cottage的博客 180

【Bug已解决】openclaw max turns reached / Tool calls exceeded limit — OpenClaw 最大轮次超限解决方案

OpenClaw 在执行过程中达到最大轮次限制任务未完成,本质是 --max-turns 设置过小或任务过于复杂。文中给出增加轮次、--continue 继续、分步执行等完整方案。

一键难忘的博客 5505

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 315

零基础教你学RDMA驱动开发--第8篇:队列对(QP)、完成队列(CQ)与工作请求(WR)机制剖析

本文深入剖析了RDMA(远程直接内存访问)中的核心机制:队列对(QP)、完成队列(CQ)和工作请求(WR)。QP作为通信端点包含发送队列(SQ)和接收队列(RQ);WR是用户提交的操作指令,转换为工作队列元素(WQE)后由网卡异步执行;CQ则提供完成通知机制。文章详细介绍了三者的协作原理,包括QP状态机、WR提交方式、CQ轮询机制,以及关键的信号控制技术(Signaled Mode)来优化性能。同时对比了SEND/RECV和RDMA WRITE两种模式的差异,提供了调试技巧和最佳实践。这些机制共同构成了RD

amy_mhd的博客 157

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 592

【实现100个unity特效之4】Unity ShaderGraph使用教程与各种特效案例(2023/12/1更新)

ShaderGraph是Unity中的一个可视化工具,用于创建和编辑图形着色器。其意义在于简化编写复杂着色器的过程,减少对具体编程语言的依赖,使艺术家和设计师可以更方便地创建各种美术效果。使用ShaderGraph可以通过图形界面设置着色器属性,包括颜色、纹理、光照等,并在视窗预览中即时显示结果,从而快速迭代和调整着色器。使用ShaderGraph需要先安装Unity 2018.1或以上版本,并添加ShaderGraph插件。打开ShaderGraph面板后,可以通过拖放节点并连接它们来创建着色器。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4万+

软件测试面试题之易错题

(1)白盒测试:又称功能功能 测试、数据驱动测试和行为测试,是一种从用户观点出发的测试,被测程序为黑盒子, 通过测试来检测每个功能是否能够正常使用。(2)黑盒测试:又称结构测试和逻辑驱动 测试,是知道产品内部工作过程,通过测试来检测产品内部动作是否按照规格说明书 的规定去正常运行。(1)、测试需求分析;(2)动态白盒测试:需要对各个模块功能、模块间的接口、局部数据结构、主要执行路径、 错误处理等方面的测试。(2) 集成测试所测试的对象是模块间的接口,其目的是在找出在模块接口上面,包括整体体系结构上的问题;

m0_37449634的博客 679

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 21

【JDK】win 10 / win 11:jdk 8 下载、安装、配置、验证

win10 / win 11:JDK 最新版本下载 / 历史版本下载(jdk 8)、安装、配置系统环境变量、验证安装全详细操作教程

顾三殇 —— 博客空间(软件测试) 13万+

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 371

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 412

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 172

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 85

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 219

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 356

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 44

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 400

贪心题目:可以到达的最远建筑

为了到达尽可能远的建筑物,在将砖块替换成梯子时,应将高度差最大位置的砖块替换成梯子,此时剩余的砖块数量最多,如果将高度差较小位置的砖块替换成梯子,则剩余的砖块数量较少,能到达的最远建筑物下标不可能更大。开始向后面的建筑物移动,移动过程中维护优先队列存储正高度差,优先队列的队首元素是最大元素,每次遇到正高度差时优先考虑使用砖块,如果砖块数量不够则使用梯子替换最大高度差位置的砖块,直到砖块和梯子都使用完毕时,到达的建筑物即为最远建筑物。如果以最佳方式使用给定的梯子和砖块,返回可以到达的最远建筑物的下标。

stormsunshine的博客 292

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 184

强化学习第十一课:完整 Q-Learning 算法

表示有:\[ 5 \]0 1 2 3 40:向左1:向右目标位置:\[ 4 \]

qq_56657939的博客 306
上一篇: 从 Kafka 到 Databend Cloud:万亿级 Agent Trace 接入链路的工程实践
下一篇: Cluster Key 最佳实践:列怎么选、顺序怎么排与粒度设计
Databend
博客等级 码龄5年 1458粉丝 362原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值