⽤ egg 孵化你的 SQL 优化器 - 王润基第三届中国Rust开发者⼤会 ⽤ egg 孵化你的 SQL 优化器 王润基 RisingWave 内核开发⼯程师 ? Parser Binder Optimizer Executor SQL AST Logical Plan Physical Plan Table Catalog Storage RisingLight 查询引擎的整体结构 SELECT name, url Hash Join #0 = #2 Scan $1.1, $1.2 Scan $2.1, $2.2 Projection #1, #3 ⼀个 SQL 语句优化的例⼦ 基于规则的优化 (RBO) 基于代价的优化 (CBO) 谓词下推 Join Filter A B Join Filter A B Filter Join A Join B C Join C Nested Loop Join 连接重排序 连接算法选择 TopN A Order TopN A Limit 查询优化 定义计划节点 定义重写规则 ⽤纯 Rust 编写的第⼀代优化器 Visitor 模式 ⽤纯 Rust 编写的第⼀代优化器 e-class e-node Rewriting Rewriting (* ?x 2) => (<< ?x 1) Rewriting0 码力 | 39 页 | 6.48 MB | 1 年前3
Rust 语言学习笔记................................................................................. 106 第八章 Rust 性能优化 ............................................................................. 107 第九章 测试与评测 .... 事情。 rust 的包管理系统和 go 的包管理系统以及 java 的包管理系统大大不同,很容 易给人造成困惑。 最主要原因是: 1.Rust 的模块支持层级结构,但这种层级结构本身与文件系统目录的层级结构 是解耦的。 因为 Rust 本身可用于操作系统的开发。 开发者需要自己去定义路径,定义 mod 的层级关系,配合 rust 的默认约定。这 点和 java,go 开发完全不同,在面向 xxx.rs 文件用 mod xxx {} 包裹起来了。 (又一个约定)初学者往往会多加一层,请注意。 1.2.3 多文件模块的层级关系 Rust 的模块支持层级结构,但这种层级结构本身与文件系统目录的层级结构是 解耦的。 mod xxx; 这个 xxx 不能包含::号。也即在这个表达形式中,是没法引用多层结 构下的模块的。也即,你不可能直接使用 mod a::b::c::d;的形式来引用0 码力 | 117 页 | 2.24 MB | 1 年前3
Comprehensive Rust(简体中文) 20241226.1 模块 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 26.2 文件系统层级结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 26.3 可见性 . . . . . . . build 只进行编译,而不运行。你 可以在 target/debug/ 中找到常规调试 build 的输出。使用 cargo build --release 在 target/release/ 中生成经过优化的 发布 build。 7. 可以通过修改 Cargo.toml 为项目添加依赖项。当运行 cargo 命令时,系统会自动下载和编译缺 失的依赖项。 尽量鼓励全班学员安装 Cargo 并使用本地 ”Tools” 下,使用 rustfmt 选项以 ”standard” 方式设置代码格式。 • Rust 具有两个用于生成代码的主要“配置文件”:调试(进行额外运行时检查、较少优化)和发布(较 少运行时检查,进行大量优化)。可以在顶部的”Debug” 下访问这些内容。 • 如果感兴趣,您可以使用 ”...” 下的 ”ASM” 查看生成的汇编代码。 As students head into the0 码力 | 359 页 | 1.33 MB | 10 月前3
Rust 程序设计语言 简体中文版 1.85.0简体中文版 发布(release)构建 当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/ release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更快,不 过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一种是为 了开发,你需要快速且频繁地重新构建;另一种是为用户构建最终程序,它们不会经常重新构 程序设计语言 简体中文版 这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系 统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来 找到模块。 136/562Rust 程序设计语言 简体中文版 引用模块树中项的路径 为了向 Rust 指示在模块树中从何处查找某个项,我们使用路径,就像在文件系统中使用路径 一样。为了调用一个函数,我们需要知道它的路径。 ,直到我们找到 add_to_waitlist。你可以想象出一个相同结构的文件系统:我们通过指定路径 /front_of_house/hosting/add_to_waitlist 来执行 add_to_waitlist 程序。我们使用 crate 从 crate 根开始就类似于在 shell 中使用 / 从文件系统根开始。 第二次在 eat_at_restaurant 中调用 add_to_waitlist0 码力 | 562 页 | 3.23 MB | 1 月前3
Rust 程序设计语言简体中文版提供相应的命令。 发布(release)构建 当项目最终准备好发布时,可以使用 cargo build --release 来优化编译项目。这会在 target/release 而不是 target/debug 下生成可执行文件。这些优化可以让 Rust 代码运行的更 快,不过启用这些优化也需要消耗更长的编译时间。这也就是为什么会有两种不同的配置:一 种是为了开发,你需要经常快速重新构建;另一种是为用户构建最终程序,它们不会经常重新 中,我们将模块 A 称为模块 B 的 子(child),模 块 B 则是模块 A 的 父(parent)。注意,整个模块树都植根于名为 crate 的隐式模块下。 这个模块树可能会令你想起电脑上文件系统的目录树;这是一个非常恰当的类比!就像文件系 统的目录,你可以使用模块来组织你的代码。并且,就像目录中的文件,我们需要一种方法来 找到模块。 147/600 Rust 程序设计语言 简体中文版 -tree.md commit 2b4565662d1a7973d870744a923f58f8f7dcce91 来看一下 Rust 如何在模块树中找到一个项的位置,我们使用路径的方式,就像在文件系统使 用路径一样。为了调用一个函数,我们需要知道它的路径。 路径有两种形式: • 绝对路径(absolute path)是以 crate 根(root)开头的全路径;对于外部 crate 的代码,0 码力 | 600 页 | 12.99 MB | 1 年前3
Real world Rust
- Why and how we use Rust in TiKVSend + Sync TiKV ● 大规模分布式 Key-Value 数据库 ● 支持 ACID 跨行事务支持 ● 支持 MVCC 无锁的快照读 ● 构建于 Raft 之上,不依赖分布式文件系统 ○ 更少的第三方依赖 ○ 更高的性能(低延迟) ● 配合 TiDB 使用,需要有健全的逻辑实现 SQL 层的下推算子 TiKV 的前置需求 ● 极高的性能要求,尽可能低延迟,而且延迟需要稳定 场景的特殊性 ○ RocksDB 周边工具 ● cargo ● clippy ● rustfmt ● kcov ● perf + flamegraph Rust 2017 Roadmap ● 优化学习曲线 ● 完善工具链和 IDE ● 补全异步和并发编程工具包 ● 有足够的工具和范式开发高性能、健壮的、可扩展的后端服务程序 ● 大多数常用包都达到 1.0 的稳定性 ● ... 总结0 码力 | 29 页 | 506.53 KB | 1 年前3
WebAssembly 简介 - 陈思衡WebAssembly System Interface (简称 WASI),它定义了一组 WASM 模块可以调用的系统调用接口。WASI 的目的是让 WASM 模块可以访问底层系统的功能,比如文件系统、网络等。这使得 WASM 可以作为一个更广泛的 运行时,不仅仅局限于浏览器环境。WASI 当前定义了一组 POSIX 兼容的系统调用,让 WASM 模块可以访问文件系 统。未来 WASI 还会加入更多系统接口0 码力 | 24 页 | 773.46 KB | 1 年前3
Hello 算法 1.1.0 Rust版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 10.5 重识搜索算法 . . . 时间效率:算法运行时间的长短。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为尾递归(tail recursion)。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。 ‧0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.0.0 Rust版10.3 二分查找边界 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 10.4 哈希优化策略 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 10.5 重识搜索算法 . . . 时间效率:算法运行速度的快慢。 ‧ 空间效率:算法占用内存空间的大小。 简而言之,我们的目标是设计“既快又省”的数据结构与算法。而有效地评估算法效率至关重要,因为只有 这样,我们才能将各种算法进行对比,进而指导算法设计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台 2‑4 递归调用深度 在实际中,编程语言允许的递归深度通常是有限的,过深的递归可能导致栈溢出错误。 2. 尾递归 有趣的是,如果函数在返回前的最后一步才进行递归调用,则该函数可以被编译器或解释器优化,使其在空 间效率上与迭代相当。这种情况被称为「尾递归 tail recursion」。 ‧ 普通递归:当函数返回到上一层级的函数后,需要继续执行代码,因此系统需要保存上一层调用的上下 文。0 码力 | 383 页 | 17.61 MB | 1 年前3
共 28 条
- 1
- 2
- 3













