技术开发 频道

达梦数据库的性能优化 应对数据膨胀

  系统缓冲区RECYCLE

  这是DM新引入的缓冲区,专门用于缓冲临时表空间。RECYCLE的淘汰算法与BUFFER完全一样,但是它有独立的HASH表, LRU和更新链。 引入 RECYCLE的目的是防止某些复杂查询的中间结果挤占大量的BUFFER空间,降低BUFFER的命中率,从而增加额外的 IO操作。

  使用RECYCLE的场景主要有:

  ●大表的散列连接,在内存达到HJ_BUF_SIZE时使用

  ●排序,大数据量的排序操作,

  ●蓄水池操作符,如:NTTS, SPL, HTAB等,这些操作符需要把数据收集在一起

  ●临时表数据

  ●MAL系统中,堆积的邮件

  ●并行查询中,堆积的消息

  ●大字段的临时数据

  RECYCLE的配置可以从V$DM_INI查到,单位M

  SQL>select * from v$dm_ini where para_name = 'RECYCLE';
  行号       PARA_NAME PARA_VALUE
  ---------- --------- ----------
  1          RECYCLE   64

  2. 利用缓存

  DM的缓存机制,可以避免系统重复的SQL解析工作,比如对于非常耗时的SQL语句解析,极大提升系统性能。SQL缓存池的大小用CACHE_POOL_SIZE来设置, 缺省为10M。

  如果应用程序对SQL语句都是先准备,再绑定参数,然后反复执行,那么就不需要计划缓存了。在这样理想的模式下,每一种SQL语句都使用不同的语句句柄,并在应用程序启动之后不久就进行了准备,执行时使用相应的语句句柄,并给定不同的参数。但是这个理想模式要求有良好的应用设计,有限或很少的SQL语句形式,限制太多。因此DM数据库系统提供了计划缓存机制。

  计划缓存由USE_PLN_POOL参数控制,当USE_PLN_POOL = 0,禁止计划缓存;当USE_PLN_POOL = 1,SQL语句需要完全匹配,才能使用计划。比如:

  Selct * from t1 where id = 1;
  Select * from t1 where id = 2;

  虽然这两个语句很相似,计划也基本上一样,但是因为常量不同,不能重用计划。因此使用精确匹配,会造成大量类似重复的计划。精确匹配一般应该使用在语句非常复杂,查询很耗时的分析型场景。这类场景语句中,常量取值的不同对计划的影响很大。

  当USE_PLN_POOL = 2时,使用模糊匹配模式。系统首先试图做精确匹配,如果没有找到合适的计划,则需要做语法分析,把常量提取出来,把语句转换为参数的形式,再从计划缓存中查找合适的计划。如果找到,则提取该计划运行,否则就需要做关系变换和代价分析,并把新生成的计划放入缓存中。

  模糊匹配适用于大部分OLTP应用,但是系统还是需要做一遍语法分析,需要把常量分解出来,并重新把语法树反拼成一个字符串,这个过程还把多余空格,注释去掉,因此,下列两个语句都匹配成同一个计划:

  Select * from t1 where id = 1;
  Select /* this is a test */ * from t1 where id = 2;
0
相关文章