当前位置:   article > 正文

达梦数据库-绑定SQL执行计划_达梦 绑定执行计划

达梦 绑定执行计划

案例背景:

        1、客户生产环境分页查询在收集统计信息后,查询变得缓慢。

        2、语句本身属于弱选择性语句。语句的访问路径,优化器选择了全表扫描+排序,在排序部分cost消耗很大。

        3、语句中,排序列和条件列存在组合索引,添加索引访问hint后,发现组合索引访问的cost要高于全表扫描+排序,实际使用组合索引访问的效率要高于全表扫描+排序(索引自身是有序的)。

问题解决:

        (1)、删除统计信息,优化器选择索引访问。(不是所有环境都适用)

        (2)、客户反馈问题得到优化。

问题测试与分析:

1、创建测试表

  1. CREATE TABLE "SYSDBA"."TEST_4"
  2. (
  3. "SEQID" INT , --唯一值,作为排序
  4. "OWNER" VARCHAR(128),
  5. "OBJECT_NAME" VARCHAR(128),
  6. "SUBOBJECT_NAME" VARCHAR(128),
  7. "OBJECT_ID" DEC,
  8. "DATA_OBJECT_ID" VARCHAR(1),
  9. "OBJECT_TYPE" VARCHAR(18),
  10. "CREATED" TIMESTAMP(6),
  11. "LAST_DDL_TIME" TIMESTAMP(6),
  12. "TIMESTAMP" TIMESTAMP(6),
  13. "STATUS" VARCHAR(7), --查询列
  14. "TEMPORARY" VARCHAR(1),
  15. "GENERATED" VARCHAR(1),
  16. "SECONDARY" VARCHAR(1),
  17. "NAMESPACE" VARCHAR(1),
  18. "EDITION_NAME" VARCHAR(1),
  19. "STATUS_INI" varchar(1) --查询列
  20. ) STORAGE(ON "MAIN", CLUSTERBTR) ;

  2、测试数据分布

select STATUS,STATUS_INI,count(*) from test_4 group by STATUS,STATUS_INI

        

3、创建唯一索引,组合索引

4、收集统计信息

  1. BEGIN
  2. dbms_stats.gather_table_stats(
  3. ownname=>'SYSDBA',
  4. tabname=>'TEST_4',
  5. cascade=>TRUE,
  6. estimate_percent=>100,
  7. method_opt=>'FOR ALL COLUMNS SIZE AUTO',--每列收集直方图
  8. no_invalidate=>FALSE);
  9. END;
  10. /

5、测试语句(全表扫描+排序)

使用全表扫描+排序,执行时间约12s,cost=96527

  1. select * from (
  2. select a1.*,rownum rn from (
  3. select t.* from test_4 t where
  4. status ='VALID'
  5. and status_ini = 'a'
  6. order by seqid
  7. )a1
  8. where rownum <= 1500000
  9. )s1
  10. where s1.rn > 1000000

6、测试语句(索引读)

使用索引读,执行时间约2.8s,cost=102545

  1. select * from (
  2. select a1.*,rownum rn from (
  3. select /*+ index(t,INDEX_TEST4_2)*/t.* from test_4 t
  4. where status ='VALID'
  5. and status_ini = 'a'
  6. order by seqid
  7. )a1
  8. where rownum <= 1500000
  9. )table_alias
  10. where table_alias.rn > 1000000

绑定执行计划:

1、需要绑定的sql

  1. select * from (
  2. select a1.*,rownum rn from (
  3. select t.* from test_4 t
  4. where status ='VALID'
  5. and status_ini = 'a'
  6. order by seqid
  7. )a1
  8. where rownum <= 1500000
  9. )table_alias
  10. where table_alias.rn > 1000000

2、当前执行计划

3、启用语句增加HINT

sp_set_para_value(1,'ENABLE_INJECT_HINT',1);

4、SQL语句绑定HINT

  1. SF_INJECT_HINT(
  2. 'select * from (
  3. select a1.*,rownum rn from (
  4. select t.* from test_4 t
  5. where status =''VALID''
  6. and status_ini = ''a''
  7. order by seqid
  8. )a1
  9. where rownum <= 1500000
  10. )s1
  11. where s1.rn > 1000000;',
  12. 'index(t,INDEX_TEST4_2)',
  13. 'index_test4',
  14. null,
  15. true,
  16. FALSE
  17. );

通过SYSINJECTHINT系统表可以查看相关信息:

select * from SYSINJECTHINT;

5、查看效果

6、删除指定的INJECTHINT规则:

SF_DEINJECT_HINT('INDEX_TEST4');

达梦数据库 - 新一代大型通用关系型数据库 | 达梦在线服务平台

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/880986
推荐阅读
相关标签
  

闽ICP备14008679号