循序渐进丨MogDB 百问百答(第5期)_sql

为了能够帮助大家循序渐进地了解MogDB、认识其特性和能力、熟悉它的使用,我们特推出「MogDB百问百答」连载,每期放出20个FAQ,希望能对您有参考价值!(感谢问题整理与回答人员:高云龙、彭冲、黄超、杨有田)

 往期回顾 

第一期 FAQ 1~20

第二期 FAQ 21~40

第三期 FAQ 41~60

第四期 FAQ 61~80

  Q 81  

私有用户有什么特殊之处?

私有用户的数据不能被其他用户访问,即使是超级用户也只能查看私有用户下的对象结构,而看不到其数据,私有用户的用户属性仅其自己可以移除,超户没有权限。

  Q 82  

MogDB 有诊断报告么?

MogDB 提供了性能诊断报告WDR,类似于 Oracle 的AWR报告,WDR依赖数据库的snapshot,若要生成此报告需要开启数据库参数enable_wdr_snapshot,且至少要两份snapshot。

  Q 83  

怎么做数据库snapshot?

开启enable_wdr_snapshot参数后,数据库默认会每小时做一次snapshot,snapshot数量默认保留8天,我们也可以通过函数create_wdr_snapshot()来手工创建快照。

  Q 84  

怎么生成WDR报告?

当snapshot数量符合要求后,我们可以先通过类似'toggle between unaligned and aligned output mode'这样的方式指定WDR报告的位置和报告格式,然后通过generate_wdr_report()函数来生成wdr报告。详细信息参考:

https://docs.mogdb.io/zh/mogdb/v3.0/wdr-snapshot-schema

  Q 85  

MogDB 如何显示SQL的执行计划信息?

MogDB 可以通过不同的EXPLAIN用法,显示不同详细程度的执行计划信息。常见有如下几种:

EXPLAIN statement:只生成执行计划,不实际执行。其中statement代表SQL语句。

EXPLAIN ANALYZE statement:生成执行计划,进行执行,并显示执行的概要信息。显示中加入了实际的运行时间统计,包括在每个规划节点内部花掉的总时间(以毫秒计)和它实际返回的行数。

EXPLAIN PERFORMANCE statement:生成执行计划,进行执行,并显示执行期间的全部信息。

  Q 86  

可以显示运行时SQL的状态进度么?

MogDB 3.0新增一个"SQL运行状态观测功能",此功能可以帮忙找到某条正在运行SQL的性能瓶颈,详细信息参考:https://docs.mogdb.io/zh/mogdb/v3.0/22-sql-running-status-observation

  Q 87  

可以查看历史SQL的执行计划么?

在statement_history视图中有个query_plan字段用来记录历史SQL的执行计划,默认情况下这个字段是空值,需要修改track_stmt_stat_level参数为L1才会记录执行计划。

PS:目前只支持在主库查询历史SQL。

  Q 88  

如何收集 MogDB 的统计信息?

信息收集可以全库进行,也可以指定数据库对象,收集统计信息有两种方式,分别是主动收集和自动收集,默认情况由数据库参数来控制,由autovacuum线程对达到参数阈值的SQL进行统计分析;我们也可以手动执行analyze来主动进行收集。

  Q 89  

什么时候需要手动收集统计信息?

当我们发现数据库性能下降、进行索引维护、导入大量数据或进行大量数据变更后,都需要主动执行analyze操作,使数据库及时更新统计信息。

  Q 90  

如何查看某个表是否需要进行analyze?

可以在视图pg_stat_user_tables中查看每个表的analyze的执行情况,包括analyze执行次数和最近一次执行时间,同时结合n_live_tup、n_dead_tup两个字段的占比来决定是否需要手工处理。

  Q 91  

数据库节点有几种角色?

MogDB 目前支持3种数据库角色:primary、standby和cascade standby,其中primary负责数据读写并将wal信息传给standby;standby可以接收primary发过来的wal,也能将wal传给cascade_standby角色,同时也提供数据读服务;cascade_standby可以接收standby发过来的wal也可以提供数据读服务。

  Q 92  

三种角色在架构部署有什么限制么?

primary和standby两种角色之间可以是同步关系也可以是异步关系,在逻辑区域划分上可以在不同的AZ;cascade_standby只能提供异步关系,同时要求必须要与standby在同一个AZ。

  Q 93  

如何进行角色切换?

角色切换分为计划内切换(switchover)和故障切换(failover),需要手工或借助高可用工具来完成,基础工具是gs_ctl。当primary和standby角色状态正常情况下可以使用switchover,如果primary角色不可用,则需要使用failover。

  Q 94  

应该将多少服务器内存分配给数据库?

MogDB 数据库有个参数max_process_memory来限制整个实例可以使用服务器内存的总大小,以此来规避操作系统的OOM报错,一般情况我们会在一台服务器上部署一个数据库实例,这时我们建议将服务器内存的80% - 90%给这个实例,剩余内存给其他程序,比如监控;但如果服务器上部署多套数据库实例,那就需要根据实例所承载的业务进行提前规划好内存分配规则。

  Q 95  

如何查看当前实例数据库内存使用情况?

当前实例下数据库内存的分配可以通过gs_total_memory_detail视图来查看,这个视图里需要特别关注带max、used和peak的字段,分别代表参数最大值,已使用情况及历史峰值。

  Q 96  

如何查看与会话相关内存使用情况?

可以通过视图gs_session_memory_detail来查看内存的总体分布情况,建议使用SQL:

select contextname,pg_size_pretty(sum(totalsize)),pg_size_pretty(sum(freesize)) from gs_session_memory_detail group by contextname order by sum(totalsize) desc limit 10;

  Q 97  

MogDB 支持哪些类型索引?

行存表(ASTORE存储引擎)支持的索引类型:btree(行存表缺省值)、hash、gin、gist、brin、bloom。

行存表(USTORE存储引擎)支持的索引类型:ubtree。

列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。

全局临时表不支持GIN索引和Gist索引。

  Q 98  

如何查看索引的定义?

可以通过视图pg_indexes视图的indexdef字段查看索引定义,执行SQL:

select schemaname,tablename,indexname,indexdef from pg_indexes ;

  Q 99  

如何判断索引是否失效,索引失效的原因有哪些?

在pg_index视图中有个字段indisvalid表示该索引是否有效,但这个字段的含义是指索引是否完整创建完成,并不代表索引是否被引用,我们所说的索引失效更多的是索引状态正常但一直未使用;索引正常却为被引用的原因有:

1、数据倾斜 ;

2、非query检索条件 ;

3、索引创建不合理 ;

4、有重复索引。

  Q 100  

对于索引创建有什么建议?

添加索引可以提高查询效率,但也会为数据变更效率降低,因为数据变更不仅仅要维护表,还需要维护对应的索引,所以并不是索引数量也多越好,建议热表的索引数量不超过5个,且注意普通索引与多列索引配合。