达梦HINT

达梦HINT,全部参照官方文档。

  1. 在打开监控开关(ENABLE_MONITOR = 1、MONITOR_TIME = 1)后,可以通过查询动态视图V$LONG_EXEC_SQLS或V$SYSTEM_LONG_EXEC_SQLS来确定高负载的SQL语句,前者显示最近1000条执行时间较长的SQL语句,后者显示服务器启动以来执行时间最长的20条SQL语句。
  2. DM数据库提供自动SQL调整功能,使用查询优化向导工具(在DM性能监视工具中),输入需要进行调整的SQL语句,向导工具在分析完执行计划后会给出推荐索引的提示。
  3. SQL语言是一种相当灵活的结构化查询语言,可以利用多种不同形式的查询语句完成相同的查询功能。为了使执行效率达到最优,可以参考以下原则开发出有效的SQL语句:避免使用OR子句;避免使用困难的正则表达式(所谓困难的正则表达式是指开头和结尾都为通配符的正则表达式);灵活使用伪表SYSDUAL;SELECT项避免使用*;避免功能相似的重复索引;使用COUNT(*)统计结果行数;使用EXPLAIN来查看执行计划;UNION和UNION ALL的选择(UNION和UNION ALL的区别是前者会过滤掉值完全相同的元组,为此UNION操作符需要建立HASH表缓存所有数据并去除重复,当HASH表大小超过了ini参数指定的限制时还会做刷盘。因此若应用场景不关心重复元组,那么UNION ALL会优于UNION);优化GROUP BY...HAVING(GROUP BY最常见的实现有HASH分组HAGR和排序分组SAGR,前者需要缓存中间结果,若用户在GROUP BY的列上建立索引,那么优化器就会判断并可能使用上该索引,这时的GROUP BY 就会变成SAGR。HAVING是分组后对结果集进行的过滤,若过滤条件无关集函数操作,可以考虑将过滤条件放在WHERE而不是HAVING中。);使用优化器提示HINT。
  4. HINT的常见格式如下:SELECT /*+HINT1 [HINT2]*/ 列名 FROM 表名 WHERE_CLAUSE;或UPDATE 表名 /*+HINT1 [HINT2]*/;或DELETE FROM 表名 /*+HINT1 [HINT2]*/; 需要注意的是,若HINT的语法没有写对或指定的值不正确,DM并不会报错,而是直接忽略HINT继续执行。可以通过V$HINT_INI_INFO动态视图查询DM支持的HINT。HINT参数分为两类:HINT_TYPE为OPT表示分析阶段使用的参数;为EXEC表示运行阶段使用的参数,运行阶段使用的参数对于视图无效。
  5. 索引提示语法:表名 + INDEX + 索引名 或 /*+INDEX (表名[,]索引名) {INDEX (表名[,]索引名)}*/
  6. 不使用索引提示语法:/*+NO_INDEX (表名[,]索引名) {NO_INDEX (表名[,]索引名)}*/
  7. 可以通过指定两个表间的连接方法来检测不同连接方式的查询效率,指定的连接可能由于无法实现或代价过高而被忽略。若连接方法提示中的表名(列名)或索引名无效也会被自动忽略。如:USE_HASH(强制两个表间使用指定顺序的哈希连接,/*+USE_HASH(TAB1,TAB2)*/);NO_USE_HASH(强制两个表间不能使用指定顺序的哈希连接,/*+NO_USE_HASH(TAB1,TAB2)*/);USE_PL(强制两个表使用嵌套循环连接,/*+USE_PL(TAB1,TAB2)*/);NO_USE_PL(强制两个表之间不能使用嵌套循环连接,/*+USE_PL(TAB1,TAB2)*/);USE_NL_WITH_INDEX(当连接情况为左表+右表索引时,强制两个表间使用索引连接,/*+USE_NL_WITH_INDEX(TAB1,IDX1)*/);NO_USE_NL_WITH_INDEX(当连接情况为左表+右表索引时,强制两个表间不能使用索引连接,/*+NO_USE_NL_WITH_INDEX(TAB1,IDX1)*/);USE_MERGE(强制两个表间使用归并连接,归并连接所用的两个列都必须是索引列,/*+USE_MERGE(TAB1,TAB2)*/);NO_USE_MERGE(强制两个表间不使用归并连接,/*+NO_USE_MERGE(TAB1,TAB2)*/);SEMI_GEN_CROSS(优先采用半连接转换为等价的内连接,仅OPTIMIZER_MODE = 1时有效,/*+SEMI_GEN_CROSS OPTIMIZER_MODE(1)*/);NO_SEMI_GEN_CROSS(不采用半连接转换为等价的内连接,仅OPTIMIZER_MODE = 1有效,/*+NO_SEMI_GEN_CROSS OPTIMIZER_MODE(1)*/);USE_CVT_VAR(优先采用变量改写方式实现连接,适合驱动表数据量少而另一侧计划较复杂的场景,仅OPTIMIZER_MODE = 1有效,/*+USE_CVT_VAR OPTIMIZER_MODE(1)*/);NO_USE_CVT_VAR(不考虑变量改写方式实现连接,仅OPTIMIZER_MODE = 1有效,/*+NO_USE_CVT_VAR OPTIMIZER_MODE(1)*/);ENHANCED_NAME_JOIN(一般情况下,归并连接需要左右孩子的数据按照连接列有序,使用此优化器提示时,优化器将考虑通过插入排序操作符的方式实现归并连接,仅OPTIMIZER_MODE = 1有效)
  8. 多表连接时优化器会考虑各种可能的排列组合顺序,使用ORDER HINT指定连接顺序提示可以缩小优化器试探的排列空间。若连接顺序和连接方法提示同时指定且二者间存在自相矛盾,优化器会以连接顺序提示为准。语法:/*+ORDER (TAB1,TAB2...)*/
  9. 优化器在计划优化阶段会自动获取基表的行数,但是一些特殊类型的表行数估算并不准确,或DBA希望了解表大小对计划影响的时候,需要手动设置表的行数。语法:/+*STAT(表名,行数)+/。统计信息提示只能针对基表设置,视图和派生表等对象设置无效。若表对象存在别名则必须使用别名。行数只能使用整数,或者整数+K/M/G(千/百万/十亿)。行数提示设置后,统计信息的其它内容也会做相应的调整。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值