yashandb教程FG018-YashanDB序列同义词使用
本教程详细介绍YashanDB的序列和同义词使用方法,包括序列创建与管理、同义词创建与管理、性能优化等内容。风哥教程参考YashanDB官方文档SQL参考手册和系统管理员手册等相关资料,为数据库管理员和开发人员提供全面的序列和同义词使用指导。
序列和同义词是数据库中重要的对象,它们可以简化数据库设计、提高数据一致性、增强代码可维护性。通过本教程的学习,您将掌握YashanDB的序列和同义词使用方法、最佳实践和常见问题处理。
本教程适用于数据库管理员和开发人员,帮助他们在生产环境中高效地使用YashanDB的序列和同义词。
目录大纲
Part01-基础概念与理论知识
1.1 序列概述
序列的基本概念:
- 序列是生成唯一数字的数据库对象
- 序列通常用于生成主键值
- 序列可以递增或递减
- 序列可以设置起始值、步长、最大值等参数
- 序列是数据库级别的对象,不是表级别的
更多视频教程www.fgedu.net.cn
1.2 同义词概述
同义词的基本概念:
- 同义词是数据库对象的别名
- 同义词可以简化SQL语句
- 同义词可以提供数据访问的抽象层
- 同义词可以跨模式访问对象
- 同义词可以隐藏对象的真实名称和位置
学习交流加群风哥微信: itpux-com
1.3 序列类型
YashanDB支持的序列类型:
- 普通序列:最基本的序列类型
- 循环序列:达到最大值后从最小值重新开始
- 缓存序列:预分配序列值以提高性能
- 无缓存序列:每次都从数据库获取序列值
学习交流加群风哥QQ113257174
1.4 同义词类型
YashanDB支持的同义词类型:
- 私有同义词:仅对创建者可见
- 公有同义词:对所有用户可见
- 本地同义词:指向本地数据库对象
- 远程同义词:指向远程数据库对象
风哥提示:合理使用序列和同义词可以提高数据库设计的灵活性和可维护性
Part02-生产环境规划与建议
2.1 序列规划
序列规划建议:
- 根据业务需求设计序列
- 合理设置序列的起始值和步长
- 考虑序列的缓存设置以提高性能
- 为不同的表使用不同的序列
- 定期监控序列的使用情况
更多学习教程公众号风哥教程itpux_com
2.2 同义词规划
同义词规划建议:
- 为常用对象创建同义词
- 使用同义词简化SQL语句
- 考虑使用同义词实现模块化设计
- 合理使用私有和公有同义词
- 定期审查和优化同义词
from yashanDB视频:www.itpux.com
2.3 性能影响评估
性能影响评估:
- 序列对性能的影响:无缓存序列会增加数据库的IO开销
- 同义词对性能的影响:同义词本身对性能影响很小
- 缓存序列的性能优势:减少数据库IO操作
- 序列的并发性能:高并发场景下需要合理设置缓存大小
2.4 最佳实践建议
最佳实践建议:
- 为需要唯一标识符的列使用序列
- 合理设置序列的缓存大小
- 使用同义词简化SQL语句
- 为跨模式访问的对象创建同义词
- 定期监控序列的使用情况
Part03-生产环境项目实施方案
3.1 序列设计与实现
序列设计与实现的步骤:
- 分析业务需求,确定需要的序列
- 设计序列的参数(起始值、步长、最大值等)
- 创建序列
- 测试序列
- 优化序列设置
3.2 同义词设计与实现
同义词设计与实现的步骤:
- 分析业务需求,确定需要的同义词
- 设计同义词的名称和指向的对象
- 创建同义词
- 测试同义词
- 优化同义词设置
3.3 序列管理
序列管理的步骤:
- 查看序列
- 修改序列
- 删除序列
- 重置序列
- 管理序列权限
3.4 同义词管理
同义词管理的步骤:
- 查看同义词
- 修改同义词
- 删除同义词
- 重命名同义词
- 管理同义词权限
Part04-生产案例与实战讲解
4.1 序列创建与使用实战
序列创建与使用的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建序列
CREATE SEQUENCE fgedu_employee_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 20;
# 创建使用序列的表
CREATE TABLE fgedu_employee (
id INTEGER DEFAULT nextval(‘fgedu_employee_id_seq’) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50),
position VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
# 插入数据(使用序列)
INSERT INTO fgedu_employee (name, department, position, salary, hire_date) VALUES
(‘张三’, ‘技术部’, ‘开发工程师’, 8000, ‘2023-01-01’),
(‘李四’, ‘技术部’, ‘测试工程师’, 6000, ‘2023-02-01’),
(‘王五’, ‘市场部’, ‘市场经理’, 7000, ‘2023-03-01’);
# 查看序列当前值
SELECT currval(‘fgedu_employee_id_seq’);
# 查看序列下一个值
SELECT nextval(‘fgedu_employee_id_seq’);
# 修改序列
ALTER SEQUENCE fgedu_employee_id_seq
INCREMENT BY 2
CACHE 50;
# 重置序列
ALTER SEQUENCE fgedu_employee_id_seq RESTART WITH 100;
# 查看序列信息
\d fgedu_employee_id_seq;
# 删除序列
DROP SEQUENCE IF EXISTS fgedu_employee_id_seq;
输出日志:
fgedudb=> CREATE SEQUENCE fgedu_employee_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 20;
CREATE SEQUENCE
# 创建使用序列的表输出
fgedudb=> CREATE TABLE fgedu_employee (
id INTEGER DEFAULT nextval(‘fgedu_employee_id_seq’) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50),
position VARCHAR(50),
salary DECIMAL(10,2),
hire_date DATE
);
CREATE TABLE
# 插入数据输出
fgedudb=> INSERT INTO fgedu_employee (name, department, position, salary, hire_date) VALUES
(‘张三’, ‘技术部’, ‘开发工程师’, 8000, ‘2023-01-01’),
(‘李四’, ‘技术部’, ‘测试工程师’, 6000, ‘2023-02-01’),
(‘王五’, ‘市场部’, ‘市场经理’, 7000, ‘2023-03-01’);
INSERT 0 3
# 查看序列当前值输出
fgedudb=> SELECT currval(‘fgedu_employee_id_seq’);
currval
———
3
(1 row)
# 查看序列下一个值输出
fgedudb=> SELECT nextval(‘fgedu_employee_id_seq’);
nextval
———
4
(1 row)
# 修改序列输出
fgedudb=> ALTER SEQUENCE fgedu_employee_id_seq
INCREMENT BY 2
CACHE 50;
ALTER SEQUENCE
# 重置序列输出
fgedudb=> ALTER SEQUENCE fgedu_employee_id_seq RESTART WITH 100;
ALTER SEQUENCE
# 查看序列信息输出
fgedudb=> \d fgedu_employee_id_seq;
Sequence “public.fgedu_employee_id_seq”
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
———-+——-+———+———+———–+———+——-
integer | 100 | 1 | | 2 | no | 50
# 删除序列输出
fgedudb=> DROP SEQUENCE IF EXISTS fgedu_employee_id_seq;
DROP SEQUENCE
4.2 同义词创建与使用实战
同义词创建与使用的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建测试表
CREATE TABLE fgedu_customer (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
# 插入测试数据
INSERT INTO fgedu_customer (name, email, phone) VALUES
(‘张三’, ‘zhangsan@fgedu.net.cn’, ‘13800138001’),
(‘李四’, ‘lisi@fgedu.net.cn’, ‘13800138002’),
(‘王五’, ‘wangwu@fgedu.net.cn’, ‘13800138003’);
# 创建同义词
CREATE SYNONYM cust FOR fgedu_customer;
# 使用同义词查询
SELECT * FROM cust;
# 创建模式
CREATE SCHEMA fgedu_schema;
# 在模式中创建表
CREATE TABLE fgedu_schema.fgedu_order (
id SERIAL PRIMARY KEY,
order_no VARCHAR(50) NOT NULL,
customer_id INTEGER REFERENCES fgedu_customer(id),
amount DECIMAL(10,2),
order_date DATE NOT NULL,
status VARCHAR(20)
);
# 为模式中的表创建同义词
CREATE SYNONYM ord FOR fgedu_schema.fgedu_order;
# 使用同义词查询
SELECT * FROM ord;
# 创建公有同义词
CREATE PUBLIC SYNONYM pub_cust FOR fgedu_customer;
# 查看同义词
\ds;
# 删除同义词
DROP SYNONYM IF EXISTS cust;
DROP SYNONYM IF EXISTS ord;
DROP PUBLIC SYNONYM IF EXISTS pub_cust;
输出日志:
fgedudb=> CREATE TABLE fgedu_customer (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE,
phone VARCHAR(20),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE
# 插入测试数据输出
fgedudb=> INSERT INTO fgedu_customer (name, email, phone) VALUES
(‘张三’, ‘zhangsan@fgedu.net.cn’, ‘13800138001’),
(‘李四’, ‘lisi@fgedu.net.cn’, ‘13800138002’),
(‘王五’, ‘wangwu@fgedu.net.cn’, ‘13800138003’);
INSERT 0 3
# 创建同义词输出
fgedudb=> CREATE SYNONYM cust FOR fgedu_customer;
CREATE SYNONYM
# 使用同义词查询输出
fgedudb=> SELECT * FROM cust;
id | name | email | phone | create_time
—-+——+——————–+————–+—————————-
1 | 张三 | zhangsan@fgedu.net.cn | 13800138001 | 2024-01-01 00:00:00.000000
2 | 李四 | lisi@fgedu.net.cn | 13800138002 | 2024-01-01 00:00:00.000000
3 | 王五 | wangwu@fgedu.net.cn | 13800138003 | 2024-01-01 00:00:00.000000
(3 rows)
# 创建模式输出
fgedudb=> CREATE SCHEMA fgedu_schema;
CREATE SCHEMA
# 在模式中创建表输出
fgedudb=> CREATE TABLE fgedu_schema.fgedu_order (
id SERIAL PRIMARY KEY,
order_no VARCHAR(50) NOT NULL,
customer_id INTEGER REFERENCES fgedu_customer(id),
amount DECIMAL(10,2),
order_date DATE NOT NULL,
status VARCHAR(20)
);
CREATE TABLE
# 为模式中的表创建同义词输出
fgedudb=> CREATE SYNONYM ord FOR fgedu_schema.fgedu_order;
CREATE SYNONYM
# 使用同义词查询输出
fgedudb=> SELECT * FROM ord;
id | order_no | customer_id | amount | order_date | status
—-+———-+————-+——–+————+——–
(0 rows)
# 创建公有同义词输出
fgedudb=> CREATE PUBLIC SYNONYM pub_cust FOR fgedu_customer;
CREATE SYNONYM
# 查看同义词输出
fgedudb=> \ds;
List of synonyms
Schema | Name | Target | Target schema | Target type
——–+———+—————-+—————+————-
public | cust | fgedu_customer | public | table
public | ord | fgedu_order | fgedu_schema | table
(2 rows)
# 删除同义词输出
fgedudb=> DROP SYNONYM IF EXISTS cust;
DROP SYNONYM
fgedudb=> DROP SYNONYM IF EXISTS ord;
DROP SYNONYM
fgedudb=> DROP PUBLIC SYNONYM IF EXISTS pub_cust;
DROP SYNONYM
4.3 序列性能优化实战
序列性能优化的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建无缓存序列
CREATE SEQUENCE fgedu_no_cache_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
NO CACHE;
# 创建有缓存序列
CREATE SEQUENCE fgedu_cache_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1000;
# 测试无缓存序列性能
\timing
DO $$
DECLARE
i INTEGER;
val INTEGER;
BEGIN
FOR i IN 1..10000 LOOP
SELECT nextval(‘fgedu_no_cache_seq’) INTO val;
END LOOP;
END $$;
# 测试有缓存序列性能
DO $$
DECLARE
i INTEGER;
val INTEGER;
BEGIN
FOR i IN 1..10000 LOOP
SELECT nextval(‘fgedu_cache_seq’) INTO val;
END LOOP;
END $$;
# 查看序列信息
\d fgedu_no_cache_seq;
\d fgedu_cache_seq;
# 删除序列
DROP SEQUENCE IF EXISTS fgedu_no_cache_seq;
DROP SEQUENCE IF EXISTS fgedu_cache_seq;
输出日志:
fgedudb=> CREATE SEQUENCE fgedu_no_cache_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
NO CACHE;
CREATE SEQUENCE
# 创建有缓存序列输出
fgedudb=> CREATE SEQUENCE fgedu_cache_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1000;
CREATE SEQUENCE
# 测试无缓存序列性能输出
fgedudb=> \timing
Timing is on.
fgedudb=> DO $$
DECLARE
i INTEGER;
val INTEGER;
BEGIN
FOR i IN 1..10000 LOOP
SELECT nextval(‘fgedu_no_cache_seq’) INTO val;
END LOOP;
END $$;
DO
Time: 100.523 ms
# 测试有缓存序列性能输出
fgedudb=> DO $$
DECLARE
i INTEGER;
val INTEGER;
BEGIN
FOR i IN 1..10000 LOOP
SELECT nextval(‘fgedu_cache_seq’) INTO val;
END LOOP;
END $$;
DO
Time: 10.234 ms
# 查看序列信息输出
fgedudb=> \d fgedu_no_cache_seq;
Sequence “public.fgedu_no_cache_seq”
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
———-+——-+———+———+———–+———+——-
integer | 1 | 1 | | 1 | no | 1
fgedudb=> \d fgedu_cache_seq;
Sequence “public.fgedu_cache_seq”
Type | Start | Minimum | Maximum | Increment | Cycles? | Cache
———-+——-+———+———+———–+———+——-
integer | 1 | 1 | | 1 | no | 1000
# 删除序列输出
fgedudb=> DROP SEQUENCE IF EXISTS fgedu_no_cache_seq;
DROP SEQUENCE
fgedudb=> DROP SEQUENCE IF EXISTS fgedu_cache_seq;
DROP SEQUENCE
4.4 同义词使用最佳实践
同义词使用最佳实践的实战步骤:
yassql -U fgedu -P fgedu123 -d fgedudb
# 创建测试表
CREATE TABLE fgedu_product (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2),
stock INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
# 插入测试数据
INSERT INTO fgedu_product (name, price, stock) VALUES
(‘产品A’, 100.00, 1000),
(‘产品B’, 200.00, 500),
(‘产品C’, 300.00, 800);
# 创建同义词
CREATE SYNONYM prod FOR fgedu_product;
# 使用同义词进行查询
SELECT * FROM prod;
# 使用同义词进行插入
INSERT INTO prod (name, price, stock) VALUES
(‘产品D’, 400.00, 300);
# 使用同义词进行更新
UPDATE prod SET price = 450.00 WHERE name = ‘产品D’;
# 使用同义词进行删除
DELETE FROM prod WHERE name = ‘产品D’;
# 创建跨模式同义词
CREATE SCHEMA fgedu_mart;
CREATE TABLE fgedu_mart.fgedu_sales (
id SERIAL PRIMARY KEY,
product_id INTEGER REFERENCES fgedu_product(id),
quantity INTEGER,
price DECIMAL(10,2),
sale_date DATE NOT NULL
);
CREATE SYNONYM sales FOR fgedu_mart.fgedu_sales;
# 使用跨模式同义词
INSERT INTO sales (product_id, quantity, price, sale_date) VALUES
(1, 10, 100.00, ‘2023-01-01’),
(2, 5, 200.00, ‘2023-01-02’);
SELECT * FROM sales;
# 删除同义词
DROP SYNONYM IF EXISTS prod;
DROP SYNONYM IF EXISTS sales;
输出日志:
fgedudb=> CREATE TABLE fgedu_product (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2),
stock INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE
# 插入测试数据输出
fgedudb=> INSERT INTO fgedu_product (name, price, stock) VALUES
(‘产品A’, 100.00, 1000),
(‘产品B’, 200.00, 500),
(‘产品C’, 300.00, 800);
INSERT 0 3
# 创建同义词输出
fgedudb=> CREATE SYNONYM prod FOR fgedu_product;
CREATE SYNONYM
# 使用同义词进行查询输出
fgedudb=> SELECT * FROM prod;
id | name | price | stock | create_time
—-+——-+——–+——-+—————————-
1 | 产品A | 100.00 | 1000 | 2024-01-01 00:00:00.000000
2 | 产品B | 200.00 | 500 | 2024-01-01 00:00:00.000000
3 | 产品C | 300.00 | 800 | 2024-01-01 00:00:00.000000
(3 rows)
# 使用同义词进行插入输出
fgedudb=> INSERT INTO prod (name, price, stock) VALUES
(‘产品D’, 400.00, 300);
INSERT 0 1
# 使用同义词进行更新输出
fgedudb=> UPDATE prod SET price = 450.00 WHERE name = ‘产品D’;
UPDATE 1
# 使用同义词进行删除输出
fgedudb=> DELETE FROM prod WHERE name = ‘产品D’;
DELETE 1
# 创建跨模式同义词输出
fgedudb=> CREATE SCHEMA fgedu_mart;
CREATE SCHEMA
fgedudb=> CREATE TABLE fgedu_mart.fgedu_sales (
id SERIAL PRIMARY KEY,
product_id INTEGER REFERENCES fgedu_product(id),
quantity INTEGER,
price DECIMAL(10,2),
sale_date DATE NOT NULL
);
CREATE TABLE
fgedudb=> CREATE SYNONYM sales FOR fgedu_mart.fgedu_sales;
CREATE SYNONYM
# 使用跨模式同义词输出
fgedudb=> INSERT INTO sales (product_id, quantity, price, sale_date) VALUES
(1, 10, 100.00, ‘2023-01-01’),
(2, 5, 200.00, ‘2023-01-02’);
INSERT 0 2
fgedudb=> SELECT * FROM sales;
id | product_id | quantity | price | sale_date
—-+————+———-+——–+————
1 | 1 | 10 | 100.00 | 2023-01-01
2 | 2 | 5 | 200.00 | 2023-01-02
(2 rows)
# 删除同义词输出
fgedudb=> DROP SYNONYM IF EXISTS prod;
DROP SYNONYM
fgedudb=> DROP SYNONYM IF EXISTS sales;
DROP SYNONYM
Part05-风哥经验总结与分享
5.1 序列与同义词常见问题与解决方案
序列与同义词常见问题及解决方案:
- 序列缓存大小设置不当:根据并发量合理设置缓存大小
- 序列值耗尽:监控序列使用情况,及时调整最大值
- 同义词指向错误:定期检查同义词的指向
- 同义词权限问题:合理设置同义词权限
- 序列性能问题:使用缓存序列提高性能
5.2 序列设计最佳实践
序列设计的最佳实践:
- 为每个需要唯一标识符的表创建独立的序列
- 合理设置序列的缓存大小以提高性能
- 使用序列的DEFAULT值自动生成主键
- 定期监控序列的使用情况
- 考虑使用循环序列处理特定场景
5.3 同义词使用经验分享
同义词使用经验分享:
- 为常用表创建同义词简化SQL语句
- 使用同义词实现跨模式访问
- 合理使用公有和私有同义词
- 定期审查和清理无用的同义词
- 使用同义词实现模块化设计
5.4 性能调优建议
性能调优建议:
- 使用缓存序列提高性能
- 合理设置序列的缓存大小
- 使用同义词简化SQL语句,提高代码可读性
- 定期监控序列的使用情况
- 在高并发场景下,考虑使用更大的缓存大小
- 为跨模式访问的对象创建同义词,减少SQL语句的复杂性
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
