1. 首页 > 国产数据库教程 > YashanDB教程 > 正文

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 序列设计与实现

序列设计与实现的步骤:

  1. 分析业务需求,确定需要的序列
  2. 设计序列的参数(起始值、步长、最大值等)
  3. 创建序列
  4. 测试序列
  5. 优化序列设置

3.2 同义词设计与实现

同义词设计与实现的步骤:

  1. 分析业务需求,确定需要的同义词
  2. 设计同义词的名称和指向的对象
  3. 创建同义词
  4. 测试同义词
  5. 优化同义词设置

3.3 序列管理

序列管理的步骤:

  1. 查看序列
  2. 修改序列
  3. 删除序列
  4. 重置序列
  5. 管理序列权限

3.4 同义词管理

同义词管理的步骤:

  1. 查看同义词
  2. 修改同义词
  3. 删除同义词
  4. 重命名同义词
  5. 管理同义词权限

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

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息