PostgreSQL 的 SQL 查询之旅

【PostgreSQL】PostgreSQL SQL探索之旅:查询基础与进阶分析 语句是数据检索的核心,下面将从基础出发,逐步深入到更复杂的查询技巧。子句,是实现精确数据检索和有序结果呈现的关键。聚合函数是数据分析的强有力工具,结合。:基于等值、不等值、比较运算符筛选数据。:进行模糊匹配和复杂模式查找。:处理集合匹配和范围筛选。可以实现数据的分组统计。PostgreSQL的。 阅读详情

当输入 SELECT * FROM users WHERE id = 42;并执行时,这条看似简单的 SQL 语句,实际上会在 PostgreSQL 内部触发一段复杂而精密的处理流程。该过程涉及多个后台进程、精细的内存管理机制,以及数十年数据库优化研究的成果。

查询执行的五个阶段

无论查询复杂与否,在 PostgreSQL 中都会经历同一条基本路径:

解析(Parsing) → 分析(Analysis) → 重写(Rewriting) → 规划(Planning) → 执行(Execution)

SQL 文本从一端进入,查询结果从另一端返回。每一个阶段内部都包含大量细致而关键的处理逻辑。

查询的起点:SQL 发送过程

以示例查询语句为例,从提交时刻开始追踪整个执行过程。应用程序首先与 PostgreSQL 服务器建立连接,随后通过 PostgreSQL 通信协议发送查询请求。

需要重点关注的是:当发送语句 SELECT * FROM users WHERE id = 42;时,PostgreSQL 会原封不动地接收该纯文本格式的语句。无论通过 psql 终端输入、应用程序调用,还是借助 ORM 框架执行,SQL 语句最终都会以文本字符串的形式传递至服务器。

服务器在接收文本后,会进行基础校验,例如字符编码是否合法、语句格式是否完整。随后,正式进入查询处理流程。

第一阶段:解析 —— 从文本到结构

解析器是查询处理的首个环节,核心任务是将 SQL 文本转换为结构化的解析树(Parse Tree)。

在该阶段,解析器会逐字符读取 SQL 语句,并依据 PostgreSQL 定义的 SQL 语法规则进行匹配和拆解,识别其中的关键字(如 SELECT、FROM、WHERE)、表名、列名、运算符等语法要素。

这一过程类似于语言学中的句法分析,只关注语法结构本身,而不涉及语义含义。

例如,SELECT name FROM users WHERE id = 42;解析完成后,系统可以明确:

  • 存在一个 SELECT 子句,包含列引用 name。
  • 存在一个 FROM 子句,引用表 users。
  • 存在一个 WHERE 子句,包含条件表达式 id = 42。

但此时解析器并不知道 users 表是否真实存在、name 是否为有效列名,也不了解涉及字段的数据类型。这些语义层面的验证工作,将由下一阶段完成。

第二阶段:分析 —— 语义校验与绑定

分析器在解析树的基础上,构建语义有效的查询树(Query Tree),这是从“语法正确”迈向“语义正确”的关键阶段。

该阶段主要完成以下工作:

  • 对象解析:在系统目录中查找 users 表,校验其是否存在;确认 name、id 是否为合法列。
  • 类型检查:校验 id = 42 是否成立,例如 id 的数据类型是否支持与整数进行比较,对应的比较运算符是否存在。
  • 权限校验:确认当前会话是否具备访问 users 表及相关列的 SELECT 权限。
  • 语义信息补充:为查询树补充对象标识信息,如表和列对应的 OID、字段类型等。

若任一环节失败(表不存在、字段拼写错误、权限不足等),查询将在此阶段终止并返回错误。

完成该阶段后,查询的含义已被 PostgreSQL 完整理解,接下来进入自动转换处理。

第三阶段:重写 —— 自动规则转换

重写器在语义有效的查询树基础上,应用一系列自动化转换规则,生成最终待执行的查询结构。常见的转换包括:

  • 视图展开:当查询对象为视图时,重写器会将视图查询转换为对底层基表的查询。例如,若视图 active_users 的定义为 SELECT * FROM users WHERE status = 'active',则查询 SELECT * FROM active_users 会被重写为直接查询 users 表并附加过滤条件 status = 'active'。
  • 行级安全策略(RLS):若表定义了安全策略,重写器会自动注入额外的 WHERE 条件以实现访问控制。例如,存在按租户隔离数据的策略时,原查询 SELECT * FROM users WHERE id = 42 可能被重写为 SELECT * FROM users WHERE id = 42 AND tenant_id = 123。
  • 用户自定义规则:通过规则系统定义的查询重写逻辑(在现代应用中相对较少使用)。

对于简单查询,该阶段可能不会发生明显变化;但在包含视图、安全策略的复杂系统中,重写可能对查询结构产生显著影响。

第四阶段:规划 —— 寻找最优执行路径

规划器负责解决一个核心问题:如何以最低成本执行该查询。

这一阶段是 PostgreSQL 中最复杂、最具智能化特征的部分,涉及多维度决策。

访问路径选择

对于查询中涉及的每张表,规划器需要决定数据的读取方式。例如,是对 users 表执行全表顺序扫描,还是利用 id 字段上的索引直接定位目标数据行。规划器需要决定采用何种方式访问数据:

  • 顺序扫描(Sequential Scan)
  • 索引扫描(Index Scan / Bitmap Scan)

规划器会综合评估表规模、索引可用性及选择性。有时,即便存在索引,顺序扫描也可能更高效。

连接策略选择

在多表查询中,规划器需同时确定:

  • 表的连接顺序
  • 每一步连接所采用的算法

连接顺序的影响至关重要。例如,先连接表 A 和表 B,再与表 C 连接,和先连接表 B 和表 C,再与表 A 连接,两种方式的执行效率可能存在巨大差异。规划器会评估多种连接顺序,筛选出最优方案。

针对每个连接操作,PostgreSQL 支持的主要连接算法包括:

  • 嵌套循环连接(Nested Loop):适用于小数据集,或当连接操作的其中一方数据量极少的场景。
  • 哈希连接(Hash Join):在内存充足的情况下,对中大型数据集的连接操作具有较高效率。
  • 归并连接(Merge Join):适用于两个输入数据集均已排序的场景。

不同连接顺序和算法组合,对整体性能影响巨大,规划器会评估多种可能性。

统计信息的作用

所有规划决策高度依赖统计信息。PostgreSQL 通过 ANALYZE 收集并维护表统计数据,包括:

  • 表的总行数
  • 各字段的不同值数量
  • 数据分布情况

这些信息用于估算过滤条件和连接操作的结果规模,是成本评估的基础。统计信息不准确将直接导致规划决策偏差。

成本估算与最终计划

规划器会对多种候选执行计划进行成本估算,综合考虑:

  • 磁盘 I/O 成本(从磁盘或缓存中读取数据页)
  • CPU 计算成本(数据行处理、条件表达式计算)
  • 内存消耗(排序、哈希操作)

最终选择成本最低的方案作为执行计划。当查询涉及大量表连接时,PostgreSQL 会启用遗传查询优化器(Genetic Query Optimizer)以避免组合爆炸。

规划结果可通过 EXPLAIN 查看,例如:


EXPLAIN SELECT name FROM users WHERE id = 42;

第五阶段:执行 —— 生成结果

执行器依据执行计划逐步获取数据,并向客户端返回结果。PostgreSQL 采用拉取式(Pull-based)执行模型。

在该模型中,上层节点按需向下层节点请求数据,而非由下层主动推送。这种机制具备良好的内存效率,并天然支持 LIMIT 等提前终止操作。

仍以查询 SELECT name FROM users WHERE id = 42 为例,其执行计划的输出结果可能如下:

                        QUERY PLAN
-----------------------------------------------------------
 Index Scan using users_id_idx on users  (cost=0.00..8.27 rows=1 width=64)
   Filter: (id = 42)
(2 rows)

以示例查询为例,执行流程为:

  1. 执行计划的顶层节点(负责向客户端返回结果)发起数据行请求。
  2. 该请求触发索引扫描节点,向其下层节点发起数据请求。
  3. 索引扫描节点利用 users_id_idx 索引定位满足条件 id = 42 的数据行。
  4. 从磁盘或缓存中读取目标数据行,并应用过滤条件进行校验。
  5. 数据结果沿执行计划逆向传递:索引扫描节点 → 客户端。

拉取式模型具有显著的内存效率优势,因为 PostgreSQL 仅在下游节点需要数据时才执行处理操作。同时,该模型也简化了结果集限制与提前终止等功能的实现 —— 只需停止向上游节点请求数据即可。

执行器逐行处理数据,按照通信协议的要求格式化结果,然后通过网络连接将数据发送至客户端。

所有结果发送完成后,PostgreSQL 会自动执行清理操作:

  • 销毁临时内存上下文
  • 释放执行过程中获取的各类锁资源
  • 删除执行期间生成的临时文件
    至此,当前后端处理进程恢复空闲状态,准备接收下一个查询请求。

全流程回顾

以 SELECT name FROM users WHERE id = 42 为例,完整流程如下:

  1. 查询发送:应用程序建立连接,以纯文本形式发送查询语句。
  2. 解析:将文本转换为解析树,完成语法结构校验。
  3. 分析:验证语义合法性,补充元数据信息,生成查询树。
  4. 重写:执行自动转换操作,如视图展开、安全策略应用。
  5. 规划:评估访问路径、连接策略,结合统计信息生成最优执行计划。
  6. 执行:基于拉取式模型执行计划,生成并返回查询结果。
  7. 清理:释放资源,恢复进程空闲状态。

所有查询均遵循该路径,区别仅在于各阶段的复杂程度。

核心价值

理解 PostgreSQL 查询执行流程,能够带来以下核心价值:

  1. 编写更高效的查询语句:掌握规划器的工作原理,可针对性地优化查询结构,例如理解部分查询无法使用索引的原因、连接顺序对性能的影响,以及公用表表达式(CTE)与子查询的适用场景差异。
  2. 精准诊断性能问题:当查询执行缓慢时,可通过 EXPLAIN 命令定位问题环节,判断是规划器选择了低效执行路径、统计信息过期,还是缺少必要的索引。
  3. 设计更合理的数据库架构:基于查询执行机制的理解,能够优化索引设计、表分区方案以及视图的使用方式。
  4. 认知数据库底层复杂度:一条简单的 SELECT 语句背后,隐藏着连接管理、内存分配、语法校验、语义分析、规则应用、成本优化以及拉取式执行等一系列复杂机制,而这一切都在后台透明运行。

原文链接:

https://internals-for-interns.com/posts/sql-query-roadtrip-in-postgres/

作者:Jesús Espino

MySQL、Oracle、SQL Server 和 PostgreSQL 的分页查询实现对比 在处理大量数据时,分页查询是一个非常重要的操作。不同的数据库系统提供了不同的实现方式,开发者应该根据具体的使用场景和性能要求选择合适的分页查询方案。 阅读详情

相关推荐

Postgresql 实时监控慢查询sql语句

AND now() - query_start > interval '1 second' -- 自定义慢查询阈值(如1秒)pg_stat_statements.max = 10000 -- 保留最多 10,000 条 SQL 记录。log_min_duration_statement = 1000 -- 记录执行超过 1 秒的查询。-- 显示最耗时的前10条查询。now() - query_start AS duration, -- 查询已运行时间。

zyb378747350的专栏 1333

pg数据库执行sql文件_PostgreSQL SQL执行流程

每种数据库都有自己的SQL执行流程图,PostgreSQL也不例外。下面这张图基本上概括了PG处理SQL的整个逻辑。我下面分开来细讲一下:1.MainMain是整个后台的入口,基本上不处理任何逻辑,只是简单的分发处理逻辑。但是像检查当前用户是否是”root”,还是会做的。因为我们知道,root用户是不能起动PG server的。2.Postmaster著名的postmaster 后台进程就是由此代...

weixin_29021291的博客 2250

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+

Postgresql的查询执行过程

在Postgresql中,由于DML语句的执行过程相似,因此使用同一的数据结构加以表示,这个结构就是执行计划树(Plan Tree)接下来,DML语句经过查询编译器处理后,会生成一个或多个执行计划树,每个执行计划树所代表的动作被称为一个原子操作,Postgresql会将执行计划树作为输入交给Executor执行。

weixin_50502586的博客 602

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取

基于Sentinel-2(哨兵2)遥感卫星的植被覆盖度提取 一、Sentinel-2简单介绍 哨兵-2系列卫星的主要载荷多光谱成像仪拥有13个谱段,从可见光到近红外再到短波红外,空间分辨率从10m到60m,能实现全所未有的陆地海洋监测水平。其幅宽高达290KM,且A、B双星组合,覆盖能力比美国Landsat8卫星强很多。目前哨兵-2A和哨兵-2B已经实现了5天的重访时间,即使在之前仅有单颗卫星时,...

weixin_44143671的博客 2万+

防止加入域主机脱离域的控制(管理员权限)

一、简介   当公司所有主机加入到域后,SA首要工作就是防止加入域的主机脱离域的控制。让我发现该工作的必要性是一程序猿,前一天刚配完禁止执行QQ、微信执行,第二天就看到那家伙在用微信聊天,肯定是用回旧的本地账号登陆了。   本人所在公司安装软件的类型繁杂,无管理员权限运行不少软件会报错,不得不授予「域账号」本地管理员权限。过大的权限带也来了一系列后果:用户可随意退出域、创建本地管理员...

der69615的博客 3173

一条sql是如何执行的详解

SQL 查询的执行过程分为解析、查询重写、查询规划、查询执行和结果返回五个主要步骤。每个步骤都对应特定的任务,从解析 SQL 到最终返回结果,确保查询尽可能高效地执行听忆.-优快云博客🎈众口难调🎈从心就好。

边走、边悟、迟早变好 3427

Arcmap计算土方量教程

1. 创建现状TIN 结果数据: 2. 创建设计TIN 结果数据: 注意:现状TIN和设计TIN构建时候的坐标系不同,设置坐标系见最后的注意事项第1点,就是import(导入)那步骤,现状TIN构建时选择高程点数据或者等高线数据,设计TIN构建时候选择洱海面数据 3. TIN转栅格 改成你要存的数据库,注意中间不要有汉字 结果数据(设计TIN转栅格的同理) 4. 裁剪现状TIN转成的栅格 结果数据: 5. 计算土方量 结果数据: ...

欢迎关注,共同进步! 5014

postgrel的SQL 的执行顺序

视图本身不能直接创建索引,但是视图的查询可以依赖于其基础表的索引。如果查询视图的列与表的索引匹配,PostgreSQL 可能会选择使用这些索引来优化查询。然而,优化器在执行查询时可能会根据具体情况做出优化,例如重新排列操作的顺序或使用索引来提高查询性能。这意味着视图定义的查询会被嵌入到主查询中,作为一部分执行计划。优化器会尝试优化整个查询,包括视图的展开部分和主查询部分。SELECT 子句用于选择要返回的列或表达式,并且在这一步中计算所有 SELECT 子句中的表达式。

xianyinsuifeng的博客 1204

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 246

YOLOv5/v7/v8首发革新改进——轻巧、创新的LADH检测头

本文介绍了一种原创改进的轻量化非对称多级压缩LADH检测头,该检测头能够实现即插即用,并在YOLOv5/v7/v8检测器中取得了显著的性能提升。本文将介绍一种原创改进的轻量级非对称多级压缩LADH(Lightweight Asymmetric Dual-Head)检测头,该检测头能够实现即插即用,并显著提升YOLO检测器的性能。因此,我们提出了一种非对称多级压缩的方法,即对不同类别的检测头采用不同的压缩比例。然而,为了进一步提高YOLO的性能,我们进行了一项原创改进,设计了一种轻巧且创新的LADH检测头。

IpyVariable的博客 2725

PostgreSQL SQL执行流程

每种数据库都有自己的SQL执行流程图,PostgreSQL也不例外。下面这张图基本上概括了PG处理SQL的整个逻辑。我下面分开来细讲一下: 1.Main ...

2876

SST专题(2-2)MMC-SST 输入级的工作原理及数学模型

本文研究了MMC-SST和iMMC-SST的电路结构及工作原理。系统由前级MMC电路和后级DC/DC电路组成,MMC负责电能转换和能量存储,DC/DC电路进行电压电流调节。重点分析了半桥型子模块(SM)的开关组态和工作原理,建立了平均值模型,推导了上下桥臂电压方程和环流特性。研究表明,通过合理控制子模块充放电模态可维持端口电压平衡,上下桥臂电压调控可影响网侧功率吸收,而环流特性对中压直流侧电压具有重要影响。

嵌入式老牛的博客 767

Olares 1.12.6 下载客户端路径迁移实战:qBittorrent、NZBGet、Transmission 与 Deluge 统一挂载结构适配指南

本文将围绕 Olares V1.12.6 的“统一目录挂载结构”变化,讲解 qBittorrent、NZBGet、Transmission、Deluge 四类下载客户端默认下载路径的完整迁移方法。读完本文,你将掌握旧/新路径的映射关系、每个客户端的具体修改步骤,以及更新后 qBittorrent WebUI 出现登录要求时的配置级排查与免密访问恢复方案。 ## 一、为什么要改路径:统一目录挂载结

gitblog_01127的博客 143

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中,Pod 的状态为 **`CrashLoopBackOff`** 表示某个容器在启动后崩溃,Kubernetes > 尝试重启该容器,但由于持续崩溃,重启的间隔时间逐渐增加。下面将详细介绍 `CrashLoopBackOff > `状态的原因、解决方案及相关命令的输出解释。

颜淡慕潇 8379

假人有限元模型

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

SQL进阶之旅 Day 30:SQL性能调优实战案例

今天的内容围绕SQL性能调优实战案例SQL性能调优的核心概念与原理实际业务场景中的SQL优化方法不同数据库引擎(MySQL、PostgreSQL)的执行计划分析多个真实案例的优化过程与效果SQL性能调优的最佳实践与注意事项通过本节的学习,你已经掌握了如何通过索引、查询重构、执行计划分析等方式,提升SQL的执行效率。如何通过执行计划分析SQL性能瓶颈掌握索引设计与使用技巧学习多表JOIN、子查询、分组聚合的优化方法了解MySQL与PostgreSQL在性能调优上的异同。

在未来等你的专栏 959

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SQL进阶之旅 Day 10:执行计划解读与优化

执行计划是数据库管理系统(DBMS)在执行SQL语句之前生成的一个详细步骤说明。它描述了数据库如何访问表、使用哪些索引、如何处理JOIN操作以及如何计算聚合函数等。执行计划的基本组成和作用。MySQL与PostgreSQL在执行计划上的差异。如何通过执行计划优化查询性能。实际案例分析和性能测试结果。推荐的最佳实践和注意事项。这些技能可以直接应用到日常的数据库开发和优化工作中,帮助你快速定位和解决慢查询问题,提升系统的整体性能。明天我们将继续深入学习复杂JOIN查询优化技巧,敬请期待!

在未来等你的专栏 1309

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

PostgreSQL中In, Exists在SQL查询中到底有无区别

SQL查询当中,In和Exists子查询到底有无区别?记得很多年以前,确实是有相关的使用戒条的,或者说存在一些使用的惯用法。试图完全抹开两者的区别,就有点过了。两者的主要区别:从目的上讲,IN和EXISTS都是SQL中用于子查询的操作符。IN操作符是用来检查一个值是否在一组值中。例如EXISTS操作符是用来检查一个子查询是否至少返回一个记录。1. 语义上的区别:IN关键字用来查询在某个列表中的数据,EXISTS关键字用来查询是否存在子查询返回的数据。

iihero@优快云 3292

PostgreSQL查询优化:让你的SQL查询更高效

在数据库应用中,查询是一项频繁的操作。查询优化旨在通过调整数据库查询语句和索引设计,提高查询性能,减少响应时间,从而使系统更加高效运行。对于特定的数据类型和查询需求,可以考虑创建自定义索引。这需要实现相应的操作符和查询支持。-- 示例:在自定义类型上创建GiST索引。

竹林幽深 2280

postgresql分页查询-sql详细操作步骤

postgresql之分页limit查询sql PostgreSQL 中的 limit 子句用于限制 SELECT 语句中查询的数据的数量。 – pageSize:每页显示条数 – pageNum:从第几条开始查询 – - pageNum= (pageSize-1)*页数 下面会有详细解释 目录postgresql之分页limit查询sql1.LIMIT 子句的 SELECT 语句1)sql格式2)sql测试2. LIMIT 子句与 OFFSET 子句一起使用1)sql格式2)sql测试 1.LIMIT

wuyuanshun的博客 1万+

postgresql中基础sql查询

SQL使用SELECT和FROM查询表中的数据,PostgreSQL提供了无表查询的扩展,使用。去除查询结果中的重复值;支持两种格式的代码注释。子句过滤表中的数据;

Java_Fly1的博客 1398

postgres 显示变量_sql - 如何在PostgreSQL查询中声明变量

sql - 如何在PostgreSQL查询中声明变量如何声明变量以用于PostgreSQL 8.3查询?在MS SQL Server中,我可以这样做:DECLARE @myvar INTSET @myvar = 5SELECT *FROM somewhereWHERE something = @myvar我如何在PostgreSQL中做同样的事情? 根据文档变量被简单地声明为“名称类型;”,但这...

weixin_39638603的博客 3760

如何在Oracle、MySQL、PostgreSQL上终止会话或取消SQL查询

数据库维护过程中难免会遇到一些不正常的SQL或会话进程正在占用系统大量资源,临时需要终止查询或kill会话,在Oracle, MySQL, Postgresql数据库中不同的操作。

weixin_tank88921的博客 2468

postgreSQL的sql语句

postgreSQL的sql语句

weixin_57259781的博客 1031

PostgreSQL教程(十):SQL语言(三)之查询

从数据库中检索数据的过程或命令叫做查询。在 SQL 里SELECT命令用于指定查询。SELECT命令的一般语法是下面几个小节描述选择列表、表表达式和排序声明的细节。WITH查询等高级特性将在最后讨论。假设有一个表叫做table1,这条命令将table1中检索所有行和所有用户定义的列(检索的方法取决于客户端应用。例如,psql程序将在屏幕上显示一个 ASCII 形式的表格, 而客户端库将提供函数来从检索结果中抽取单个值)。选择列表声明意味着所有表表达式提供的列。

mr~li的博客 1695

PostgreSQL 18 从新手到大师:实战指南 - 1.6 SQL高级查询

本文介绍了PostgreSQL中的SQL高级查询技术,包括JOIN操作、子查询和聚合函数。主要内容如下: JOIN操作:详细讲解了INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN等7种连接类型,并提供了用户表和订单表的实际示例。 子查询:阐述了标量、行、列和表子查询4种类型,展示了在WHERE、FROM、HAVING子句中的使用场景,包括EXISTS子查询的应用。 聚合函数:介绍了COUNT、SUM、AVG等基本聚合函数,以及GROUP BY和HAVING的使用方法,提供了

AI 题库 —— 软件编程老兵专属分享阵地,聚焦青少年编程等级考、Python/C++ 信息学奥赛、机器人技术等级考试备考干货,依托智能题库资源,用 5 年一线教学经验助力编程学习高效备考! 1036
上一篇: 让源码安装不再困难:IvorySQL 一键安装脚本的实现细节解析
下一篇: 用 PostgreSQL 实践 Palantir 本体论
IvorySQL
博客等级 码龄5年 744粉丝 555原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值