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;

posted on 2023-07-21 17:20  aodb  阅读(44)  评论(0编辑  收藏  举报