LightDB基础题
1、 在LightDB/PostgreSQL中,有表a,定义为:create table a(id int primary key, rand int, comm varchar(128))。如何一条语句生成一张1000万记录的表,且满足id从1001万-2000万,rand为0-1000000之间的随机整数,comm为随机生成的UUID
分析:1000万张表,一般意义来讲,算大表了,至少需要考虑以下几个方面的问题:
- 内存是否够装下全表,否则一边插入一边刷盘,会导致CPU等待IO时闲等,可以考虑将内存buffer搞大,采用IO性能好一点的磁盘。
- 1000万的表,并具备主键约束,一边插入一边建立索引,每一次插入都将引起索引更新,因此,可以考虑先插入数据, 再建立主键。
- PG默认情况下,自动语句级事务,会导致每插入一行就提交一次事务,为减轻频繁事务提交带来的额外开销,根据业务需要,可以考虑分批插入或1000万全插入之后再提交事务。
代码如下:
create table a( id int, rand int, comm varchar(128)); -- Create the PL/pgSQL function to insert random records CREATE OR REPLACE FUNCTION insert_random_records(record_count INTEGER) RETURNS VOID AS $$ DECLARE batch_size INTEGER := 1000; i INTEGER; id_val INTEGER := 10000001; -- Modified to start from 10000001 rand_val INTEGER; comm_val VARCHAR(128); BEGIN FOR i IN 1..record_count LOOP rand_val := floor(random() * 1000001); comm_val := md5(random()::text || clock_timestamp()::text); EXECUTE 'INSERT INTO a (id, rand, comm) VALUES ($1, $2, $3)' USING id_val, rand_val, comm_val; id_val := id_val + 1; -- Increment id_val by one in each step IF i % batch_size = 0 THEN -- Yield the control back to the caller to handle transactions PERFORM pg_sleep(0.01); END IF; END LOOP; END; $$ LANGUAGE PLPGSQL; BEGIN; -- Start the transaction SELECT insert_random_records(10000000); -- Call the function to insert the records COMMIT; -- Commit the transaction ALTER TABLE a ADD CONSTRAINT pk_a_id PRIMARY KEY (id);
2、 有两张表a和b,没有索引,数据量分别为1万行和1000万行,要执行下列SQL语句:
select count(1) from a,b where a.id=b.id
A.hash join B. nest loop join C. merge join
为什么?
a表足够小到内存全装下去,hash join比较合适,选A
3、 hash join和哪几个GUC相关?
- enable_hashjoin
- enable_hashagg
- min_parallel_table_scan_size
- max_parallel_workers_per_gather
- work_mem
- hash_mem_multiplier
4、 什么情况下hash join无法生效?
- enable_hashjoin未开启
- 非常小的表
- work_mem不够大
- 内存被其它会话占了,导致可用内存不够
5、 并行执行(parallel)是什么意思?
有一些查询可以被分配到多个backend进程上执行,执行完后,由发起并发执行的backend对结果归总,比如并行扫表,并行join。
6、 一个加了/*+ Parallel(a 4 hard)*/优化器提示的SQL未走并行执行计划,通常有哪些原因?
1,代价评估之后有更合适的执行计划
2,系统资源不足
3,系统配置的限制了max_parallel_workers,或当前可用的并行workers达到了上限
4,表比较小,没必要并行
5,某些函数非parallel安全
7、 如何判断一个函数是否为parallel safe?
1,整个逻辑都是只读的,通常是并行安全的
2,逻辑无关联/依赖,数据彼此独立的插入操作。
3,依赖的数据对象是只读的。
不确定的话可以查文档,或者通过查pg_proc表进行判定。
8、 在LightDB里,哪几种分页查询语法正确的?
1,select * from t LIMIT m offset n;
9、 修改分布式LightDB参数的正确步骤
//TO CHECK
10、 修改高可用LightDB参数的正确步骤
//TO CHECK
11、 如何查看LightDB集群的状态
1, EM工具
2,查表:pg_dist_node, cannopy_tables, cannopy_shards, 以及ltcluster工具
12、 LightDB日常采用哪些性能测试工具?
1,tpcc
2,ltbench
13、 LightDB支持哪些操作系统版本和CPU架构
x86_64(intel/amd),centos7/RHEL7/rockylinux8/麒麟v10sp1
x86_64(海光), 麒麟V10/V10SP1
arm64 CentOS7/RHEL7 /rockylinux8/麒麟V10SP1/麒麟V10SP2
14、 如何查看一个SQL语句的执行计划
explain query;
15、 如何查看一个SQL语句的实际执行计划
explain analyze
16、 哪个命令可以查询包含enable的所有GUC参数
show %enable%
17、 如何查看一张表的大小
select pg_relation_size('a');
18、 如何查看一张分布式表的大小
select pg_total_relation_size('a');
19、 如何查看一张表是否已经缓存在共享缓冲(shared_buffers)中
利用lt_buffercache, 结合pg_class相关信息
20、 如何删除表的主键
ALTER TABLE a DROP CONSTRAINT pk_a_id;
21、 如何通过SQL查询到当前lightdb实例的版本
select version();
22、 如何查询当前lightdb实例的角色(primary/standby)
select pg_is_in_recovery();
23、 Lightdb支持哪些方式导入CSV或文本数据?
COPY FROM
24、 Lightdb支持哪些方式导出CSV或文本数据?
COPY FROM
25、 LightDB分布式表支持哪些类型?一般什么情况下建议使用哪种表?
1,reference table, 存储于cn结点。
2,distributed table,于DN结点存数据。
26、 如何查看当前数据库的实时活动、正在执行哪些SQL,当前语句执行了多久?
当前实现活动的状态记录在pg_state相关数据结构中,通常可以用pwr进行查询,如需求实时数据,可以通过视图
pg_stat_activity进行查询。
27、 如何查看主从节点的滞后延时以及滞后WAL大小(转换为字节数)?
select * from pg_stat_replication;
28、 internal函数是什么函数?internal如何创建?它和动态加载函数在开发上有什么差别?38.9 38.10.3
internal函数和动态加载的函数均可用c语言进行开发,internal需要配置pg_proc.dat文件手动指定相关参数及oid。
29、 PL过程是LightDB内置的吗?它是如何实现的?38.8
PL过程通过extenstion进行加载。
30、 自定义PL/pgSQL、PL/oraSQL、SQL函数、过程的内部执行过程
均按语句块一行一行解析,解析出来语句后走gram语法分析,然后进入正常的执行流程。
31、 LightDB执行c语言编写的函数时,会从哪些路径查找对应的so。38.10
环境变量:LD_LIBRARY_PATH
32、 新修改的c语言函数的so何时会生效?新启动一个会话的时候,每次会话启动访问都会加载,不是实例级别缓存。38.10
非shared_preload_library的扩展,可动态加载。
33、 某些函数在BODY最后声明了STRICT,其作用是什么?
若函数参数传入NULL, 立即 返回NULL
34、 Datum代表什么?
用于任意指针的对象,与具体的对象通常有相应的转换接口。
35、 Oid代表什么?
定义上是一个整数,可理解为一个对象ID,比如数据库对象,表对象,函数对象,等。
36、 LightDB支持哪些事务隔离级别,默认是什么隔离级别?
read commited (默认)
repeatable read
serializable
37、 LightDB默认自动提交吗?如何关闭?
默认语句级自动提交,
可通过\set AUTOCOMMIT off关闭。
\echo :AUTOCOMMIT
38、 ltsql和libpq是什么关系?
ltsql是命令行sql终端。libpq是用于postgresql底层封包通迅的库,其中封装了postgresq客户端与服务端通迅的协议细节。
39、 在SQL中,intN的N单位是什么?在c语言中,intN的N单位是什么?
均为字节数。
40、 C语言编写的函数支持哪些传参类型?
值传递,指针传递(指针本质上也是值传递),C语言不支持引用传递。
41、 tid, cid, xid分别代表什么含义?何时会生成这些id
tuple id: 元组ID,创建元组时。
cid:command id,插入元组时。
xid:事务ID,开始事务时。
42、 请描述分析java应用中内存中包含对象的过程以及步骤,找到占用内存最大的那个类
43、 查看sql的执行计划
explain query;
44、 查看sql的解释计划
pg_parse_tree
45、 查看正在执行的sql的执行计划
select query from pg_stat_activity where state = 'active' ;
46、 如何查看一个包含order by的sql语句是否使用了临时文件
explain query, 然后查看是否有"external merge" or "external sort,"
47、 执行计划是在什么时候生成的?
parse -> plan -> plan optimize -> execution plan 生成 -> execute plan
48、 如何查看对象的依赖关系
SELECT d.objid AS dependent_object_id, d.deptype AS dependency_type, t1.relname AS dependent_object_name, d.refobjid AS referenced_object_id, t2.relname AS referenced_object_name, d.classid AS class_id FROM pg_depend d LEFT JOIN pg_class t1 ON d.objid = t1.oid LEFT JOIN pg_class t2 ON d.refobjid = t2.oid WHERE t1.relname = 'table_name';
49、 一个实例有两个db,如何查看所有表上的锁及被谁占用?
select * from pg_locks;
50、 如何查询lightdb中的所有定时任务及其最近的执行状态
\c postgres;
select * from cron.job;
select * from cron.job_run_details;
51、 分布式数据库是实例级别还是db级别?如何确定当前是否为分布式数据库模式
db级别,可通过查询有无安装citus插件,以及有无分布式表。
52、 高可用部署下,修改参数的正确步骤
53、 lt_initdb和initdb
lt_initdb会创建lightdb相关扩展以及初始化相关GU参数,lt_initdb最终会调用initdb. initdb是pg自带的。
54、 分布式部署下,修改参数的正确步骤
55、 如何确定一个参数是否可会话级修改、可通过reload加载生效
SELECT name, setting, source FROM pg_settings WHERE name = 'guc_parameter';
如果source为user, 表示这是会话级的,其它值表示为实例级的。如果实例级的参数reload了,不会影响user级的。
56、 lt_hba.conf的作用是什么?
会话连接网络访问控制,认证参数,以及机制预设。
57、 优化器提示的作用是什么?是哪个extension控制优化器提示的?
优化器提示的用于辅组生成执行计划,pg_hint_plan。
58、 PWR的作用是什么?
参考AWR的功能设定进行实现,主要用于监控数据运行时的各项指标,如机器基本配置信息,SQL各种计划统计,DBTIME统计,等。
59、 PWR的采集频率如何?存储在什么地方?
PWR中数据源于pg_stat_activity等相关模块,C端每1秒钟采集一次进入内存表(lt_stat_cost_1s),之后每1分钟将此表的数据归档入lt_stat_cost_60s, 每10分钟,通过take_sample函数归档入lt_stat_cost_600s。
60、 PSH的作用是什么?
61、 PSH的采集频率如何?存储在什么地方?
62、 EM agent的作用是什么?
63、 如何查看agent中的所有采集任务、频率?
64、 所有的压测,建议最小的表记录数、执行次数、时长分别为多久?
65、 Hugepage的作用是什么?如何确定需要多大的hugepage?如何确定hugepage是否对lightdb生效了?
Hugepage可用于lightdb共享存储,相比于普通内存,大页内存页表更大,tlb查找更快,大页内存页表常驻内存可减少页表中断提高内存性能。需要多大的hugepage处决于数据库实例的数据大小。检查 是否生效,可通过 lt_controldata /clusterpath | grep “Huge Pages”进行查看。
66、 agent cpu高如何排查是谁造成?什么工具、如何定位?如何确定是哪个方法、哪个类
67、 agent 内存高如何排查,提供示例dump,找出具体对象?
68、 在PL/pgSQL中,哪些方式支持事务?
存储过程和函数均不支持在内部进行提交,回滚,等。必须受外面调用此存储过程或函数的一方进行事务控制 。
69、 lightdb函数支持哪些特性
1、返回void,2,返回表, 3、call调用 4、可以带出参,也可传入参数。5,可递归,6,支持错误处理,7,支持基本逻辑控制。
70、 PL/pgSQL函数&过程和shell一样,也支持按位置定义参数
CREATE FUNCTION add_em(integer, integer) RETURNS integer AS $$
SELECT $1 + $2;
$$ LANGUAGE SQL;