SQL层 #
一、SQL层概述 #
1.1 SQL层架构 #
text
SQL 层架构
┌─────────────────────────────────────────────────────────────┐
│ │
│ 客户端连接 │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ PostgreSQL 协议层 │ │
│ │ 连接管理 / 协议解析 / 认证授权 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ SQL 解析器 │ │
│ │ 词法分析 → 语法分析 → AST │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 查询优化器 │ │
│ │ 逻辑优化 → 物理优化 → 执行计划 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 执行引擎 │ │
│ │ 本地执行 / 分布式执行 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 事务层 / 分布式层 │
│ │
└─────────────────────────────────────────────────────────────┘
1.2 核心组件 #
| 组件 | 职责 |
|---|---|
| 协议层 | PostgreSQL协议兼容 |
| 解析器 | SQL语法解析 |
| 优化器 | 查询优化 |
| 执行引擎 | 查询执行 |
二、PostgreSQL协议兼容 #
2.1 协议支持 #
text
PostgreSQL 协议支持
┌─────────────────────────────────────────────────────────────┐
│ │
│ 支持的功能: │
│ ├── 连接认证 │
│ ├── 简单查询 │
│ ├── 扩展查询 │
│ ├── 预处理语句 │
│ ├── 绑定参数 │
│ └── 结果集获取 │
│ │
│ 客户端兼容: │
│ ├── psql │
│ ├── pgAdmin │
│ ├── psycopg2 (Python) │
│ ├── pgx (Go) │
│ ├── node-postgres (Node.js) │
│ ├── JDBC (Java) │
│ └── 大多数 PostgreSQL 客户端 │
│ │
└─────────────────────────────────────────────────────────────┘
2.2 连接示例 #
bash
# 使用 psql 连接
psql -h localhost -p 26257 -U root -d defaultdb
# 使用连接字符串
psql "postgresql://root@localhost:26257/defaultdb?sslmode=disable"
python
# Python psycopg2
import psycopg2
conn = psycopg2.connect(
host='localhost',
port=26257,
user='root',
database='defaultdb'
)
go
// Go pgx
package main
import (
"context"
"github.com/jackc/pgx/v5"
)
func main() {
conn, _ := pgx.Connect(context.Background(),
"postgresql://root@localhost:26257/defaultdb?sslmode=disable")
defer conn.Close(context.Background())
}
三、SQL解析器 #
3.1 解析流程 #
text
SQL 解析流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 输入: SELECT * FROM users WHERE id = 1 │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 词法分析 (Lexer) │ │
│ │ │ │
│ │ SELECT → 关键字 │ │
│ │ * → 标识符 │ │
│ │ FROM → 关键字 │ │
│ │ users → 标识符 │ │
│ │ WHERE → 关键字 │ │
│ │ id → 标识符 │ │
│ │ = → 操作符 │ │
│ │ 1 → 字面量 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 语法分析 (Parser) │ │
│ │ │ │
│ │ 生成抽象语法树 (AST): │ │
│ │ │ │
│ │ SelectStmt │ │
│ │ │ │ │
│ │ ┌─────┼─────┐ │ │
│ │ │ │ │ │ │
│ │ Fields From Where │ │
│ │ │ │ │ │ │
│ │ * users Comparison │ │
│ │ │ │ │
│ │ ┌────┴────┐ │ │
│ │ │ │ │ │
│ │ id = 1 │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
3.2 支持的SQL语法 #
sql
-- DDL
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
ALTER TABLE users ADD COLUMN age INT;
DROP TABLE users;
-- DML
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
UPDATE users SET name = 'Bob' WHERE id = '...';
DELETE FROM users WHERE id = '...';
-- DQL
SELECT * FROM users WHERE name = 'Alice';
SELECT u.name, COUNT(o.id) FROM users u JOIN orders o ON u.id = o.user_id GROUP BY u.name;
-- DCL
CREATE USER admin WITH PASSWORD 'password';
GRANT ALL ON DATABASE mydb TO admin;
四、查询优化器 #
4.1 优化流程 #
text
查询优化流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 输入: AST │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 逻辑优化 (Logical Optimization) │ │
│ │ │ │
│ │ ├── 谓词下推 (Predicate Pushdown) │ │
│ │ ├── 投影下推 (Projection Pushdown) │ │
│ │ ├── 常量折叠 (Constant Folding) │ │
│ │ ├── 子查询展开 (Subquery Unnesting) │ │
│ │ └── JOIN 重排序 (Join Reordering) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 物理优化 (Physical Optimization) │ │
│ │ │ │
│ │ ├── 索引选择 (Index Selection) │ │
│ │ ├── JOIN 策略选择 (Join Strategy) │ │
│ │ ├── 聚合策略选择 (Aggregation Strategy) │ │
│ │ └── 分布策略选择 (Distribution Strategy) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 输出: 执行计划 │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 查看执行计划 #
sql
-- 基本执行计划
EXPLAIN SELECT * FROM users WHERE id = 1;
-- 详细执行计划
EXPLAIN ANALYZE SELECT * FROM users WHERE id = 1;
-- 执行计划示例
EXPLAIN SELECT u.name, o.order_no
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.id = 1;
-- 输出示例:
-- │
-- • hash join │
-- │ │
-- ├── • scan │
-- │ table: users@primary │
-- │ spans: [1-1] │
-- │ │
-- └── • scan │
-- table: orders@idx_user_id │
-- spans: [1-1] │
4.3 优化提示 #
sql
-- 强制使用索引
SELECT * FROM users@idx_email WHERE email = 'test@example.com';
-- 强制使用特定索引
SELECT /*+ Index(users idx_email) */ * FROM users WHERE email = 'test@example.com';
-- 禁用索引
SELECT /*+ NoIndex(users) */ * FROM users WHERE email = 'test@example.com';
五、执行引擎 #
5.1 执行模式 #
text
执行引擎模式
┌─────────────────────────────────────────────────────────────┐
│ │
│ 本地执行 (Local Execution): │
│ ├── 单节点操作 │
│ ├── 小数据量查询 │
│ └── 低延迟 │
│ │
│ 分布式执行 (Distributed Execution): │
│ ├── 多节点并行 │
│ ├── 大数据量查询 │
│ └── 高吞吐 │
│ │
│ 执行计划树: │
│ │
│ ┌─────────┐ │
│ │ Root │ │
│ │ (结果) │ │
│ └────┬────┘ │
│ │ │
│ ┌──────────┼──────────┐ │
│ │ │ │ │
│ ┌────┴────┐┌────┴────┐┌────┴────┐ │
│ │ Join ││ Join ││ Join │ │
│ └────┬────┘└────┬────┘└────┬────┘ │
│ │ │ │ │
│ ┌────┴────┐┌────┴────┐┌────┴────┐ │
│ │ Scan ││ Scan ││ Scan │ │
│ │ Node 1 ││ Node 2 ││ Node 3 │ │
│ └─────────┘└─────────┘└─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
5.2 执行算子 #
sql
-- 常见执行算子
-- Scan: 表扫描
EXPLAIN SELECT * FROM users;
-- • scan
-- Index Join: 索引连接
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
-- • index join
-- Hash Join: 哈希连接
EXPLAIN SELECT * FROM users u JOIN orders o ON u.id = o.user_id;
-- • hash join
-- Merge Join: 归并连接
EXPLAIN SELECT * FROM users u JOIN orders o ON u.id = o.user_id ORDER BY u.id;
-- • merge join
-- Aggregation: 聚合
EXPLAIN SELECT COUNT(*) FROM users;
-- • group by (hash)
-- Sort: 排序
EXPLAIN SELECT * FROM users ORDER BY name;
-- • sort
-- Limit: 限制
EXPLAIN SELECT * FROM users LIMIT 10;
-- • limit
5.3 向量化执行 #
text
向量化执行
┌─────────────────────────────────────────────────────────────┐
│ │
│ 传统执行 (Volcano Model): │
│ ├── 一次处理一行 │
│ ├── 函数调用开销大 │
│ └── CPU缓存利用率低 │
│ │
│ 向量化执行 (Vectorized Execution): │
│ ├── 一次处理一批行 │
│ ├── 减少函数调用 │
│ ├── CPU缓存友好 │
│ └── SIMD指令优化 │
│ │
│ 示例: │
│ SELECT SUM(amount) FROM orders; │
│ │
│ 传统: 逐行累加 │
│ 向量化: 批量累加 │
│ │
└─────────────────────────────────────────────────────────────┘
六、DDL处理 #
6.1 Schema变更 #
sql
-- 在线Schema变更
-- CockroachDB 支持在线DDL,不阻塞读写
-- 添加列
ALTER TABLE users ADD COLUMN age INT DEFAULT 0;
-- 添加索引
CREATE INDEX idx_email ON users(email);
-- 修改列类型
ALTER TABLE users ALTER COLUMN name TYPE VARCHAR(200);
-- 删除列
ALTER TABLE users DROP COLUMN age;
-- 查看Schema变更状态
SHOW JOBS;
6.2 Schema变更流程 #
text
Schema 变更流程
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 提交DDL语句 │
│ │ │
│ ▼ │
│ 2. 验证Schema │
│ │ │
│ ▼ │
│ 3. 创建Job │
│ │ │
│ ▼ │
│ 4. 后台执行 │
│ ├── 添加新版本Schema │
│ ├── 数据回填 (如需要) │
│ └── 删除旧版本Schema │
│ │ │
│ ▼ │
│ 5. 完成变更 │
│ │
│ 特点: │
│ ├── 非阻塞 │
│ ├── 可取消 │
│ └── 可恢复 │
│ │
└─────────────────────────────────────────────────────────────┘
七、统计信息 #
7.1 统计信息收集 #
sql
-- 创建统计信息
CREATE STATISTICS users_stats FROM users;
-- 查看统计信息
SHOW STATISTICS FOR TABLE users;
-- 自动统计信息收集
-- CockroachDB 自动收集统计信息
-- 手动收集
ANALYZE users;
7.2 统计信息内容 #
text
统计信息内容
┌─────────────────────────────────────────────────────────────┐
│ │
│ 表级统计: │
│ ├── 行数 (row count) │
│ └── 表大小 (table size) │
│ │
│ 列级统计: │
│ ├── 不同值数量 (distinct count) │
│ ├── NULL值比例 (null fraction) │
│ ├── 直方图 (histogram) │
│ └── 最常见值 (MCV) │
│ │
│ 索引统计: │
│ ├── 索引大小 │
│ └── 索引选择性 │
│ │
└─────────────────────────────────────────────────────────────┘
八、会话管理 #
8.1 会话变量 #
sql
-- 查看会话变量
SHOW ALL;
-- 设置时区
SET TIME ZONE 'Asia/Shanghai';
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 设置查询超时
SET statement_timeout = '30s';
-- 设置结果格式
SET database = 'mydb';
8.2 连接池配置 #
python
# Python psycopg2 连接池
import psycopg2
from psycopg2 import pool
connection_pool = psycopg2.pool.ThreadedConnectionPool(
minconn=5,
maxconn=20,
host='localhost',
port=26257,
user='root',
database='defaultdb'
)
# 获取连接
conn = connection_pool.getconn()
# 释放连接
connection_pool.putconn(conn)
九、总结 #
SQL层要点:
| 组件 | 功能 |
|---|---|
| 协议层 | PostgreSQL兼容 |
| 解析器 | SQL解析 |
| 优化器 | 查询优化 |
| 执行引擎 | 查询执行 |
下一步,让我们学习存储层!
最后更新:2026-03-27