有个徒弟问我,要创建一个索引,去优化一个SQL,但是创建了索引之后其他 SQL 也要用 这个索引,其他SQL慢死了,要优化的SQL又快。遇到这种问题咋搞?

一般遇到这种问题还是很少的。处理的方法很多。我简单的给大家介绍一种方法。

还是直接看我实验操作步骤吧。

  1. SCOTT账户里面创建一个测试表和一个索引
  2. SQL> create table test as select * from dba_objects;
  3.  
  4. 表已创建。
  5. SQL> create index idx_test on test(object_id);
  6.  
  7. 索引已创建。
  1. SQL> set lines 200 pages 200
  2. SQL> set autot trace
  3. SQL> select * from test where object_id=10;
  4. 执行计划
  5. ----------------------------------------------------------
  6. Plan hash value: 2473784974
  7. ----------------------------------------------------------------------------------------
  8. | Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  9. ----------------------------------------------------------------------------------------
  10. |   0 | SELECT STATEMENT            |          |     1 |   207 |     2   (0)| 00:00:01 |
  11. |   1 |  TABLE ACCESS BY INDEX ROWID| TEST     |     1 |   207 |     2   (0)| 00:00:01 |
  12. |*  2 |   INDEX RANGE SCAN          | IDX_TEST |     1 |       |     1   (0)| 00:00:01 |
  13. ----------------------------------------------------------------------------------------
  14. Predicate Information (identified by operation id):
  15. ---------------------------------------------------
  16.    2 - access("OBJECT_ID"=10)
  17. Note
  18. -----
  19.    - dynamic sampling used for this statement (level=6)
  20. 统计信息
  21. ----------------------------------------------------------
  22.          44  recursive calls
  23.           0  db block gets
  24.         136  consistent gets
  25.           4  physical reads
  26.           0  redo size
  27.        1404  bytes sent via SQL*Net to client
  28.         420  bytes received via SQL*Net from client
  29.           2  SQL*Net roundtrips to/from client
  30.           0  sorts (memory)
  31.           0  sorts (disk)
  32.           1  rows processed
  33. 然后人工设置索引统计信息 把集群银子搞大(非常大)
  34. SQL> begin
  35.   2    dbms_stats.set_index_stats(ownname  => 'SCOTT',
  36.   3                               indname  => 'IDX_TEST',
  37.   4                               numrows  => 100000000000,
  38.   5                               numlblks => 100000,
  39.   6                               numdist  => 100000,
  40.   7                               avglblk  => 100000,
  41.   8                               avgdblk  => 100000,
  42.   9                               clstfct  => 100000000000);
  43.  10  end;
  44.  11  /
  45. PL/SQL 过程已成功完成。
  46.  
  47. SQL> select * from test where object_id=10;
  48. 执行计划
  49. ----------------------------------------------------------
  50. Plan hash value: 1357081020
  51. --------------------------------------------------------------------------
  52. | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
  53. --------------------------------------------------------------------------
  54. |   0 | SELECT STATEMENT  |      |     1 |   207 |   290   (1)| 00:00:04 |
  55. |*  1 |  TABLE ACCESS FULL| TEST |     1 |   207 |   290   (1)| 00:00:04 |
  56. --------------------------------------------------------------------------
  57. Predicate Information (identified by operation id):
  58. ---------------------------------------------------
  59.    1 - filter("OBJECT_ID"=10)
  60. Note
  61. -----
  62.    - dynamic sampling used for this statement (level=6)
  63. 统计信息
  64. ----------------------------------------------------------
  65.           0  recursive calls
  66.           0  db block gets
  67.        1039  consistent gets
  68.           0  physical reads
  69.           0  redo size
  70.        1404  bytes sent via SQL*Net to client
  71.         420  bytes received via SQL*Net from client
  72.           2  SQL*Net roundtrips to/from client
  73.           0  sorts (memory)
  74.           0  sorts (disk)
  75.           1  rows processed
  76. 这个时候,所有的SQL都不会走这个索引了,你想让某个SQL走索引,直接hint 让它走就ok

  77. SQL> select /*+ index(test idx_test) */ * from test where object_id=10;
  78. 执行计划
  79. ----------------------------------------------------------
  80. Plan hash value: 2473784974
  81. ----------------------------------------------------------------------------------------
  82. | Id  | Operation                   | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
  83. ----------------------------------------------------------------------------------------
  84. |   0 | SELECT STATEMENT            |          |     1 |   207 |  1446K  (1)| 04:49:20 |
  85. |   1 |  TABLE ACCESS BY INDEX ROWID| TEST     |     1 |   207 |  1446K  (1)| 04:49:20 |
  86. |*  2 |   INDEX RANGE SCAN          | IDX_TEST |     1 |       |    15  (94)| 00:00:01 |
  87. ----------------------------------------------------------------------------------------
  88. Predicate Information (identified by operation id):
  89. ---------------------------------------------------
  90.    2 - access("OBJECT_ID"=10)
  91. Note
  92. -----
  93.    - dynamic sampling used for this statement (level=6)
  94. 统计信息
  95. ----------------------------------------------------------
  96.           0  recursive calls
  97.           0  db block gets
  98.           4  consistent gets
  99.           0  physical reads
  100.           0  redo size
  101.        1404  bytes sent via SQL*Net to client
  102.         420  bytes received via SQL*Net from client
  103.           2  SQL*Net roundtrips to/from client
  104.           0  sorts (memory)
  105.           0  sorts (disk)
  106.           1  rows processed

  107. 这样还没完,因为要是有人收集了统计信息,会覆盖我们set的统计信息,所以收集完统计信息之后,要再跑一下那个set的统计信息就ok了。

  108. 如何让索引只能被一个SQL使用的更多相关文章

      1. 数据库中聚合索引(MySQLSQL Server区别)
      1. 一.聚集索引和非聚集索引 聚集索引:类似字典的拼音目录.表中的数据按照聚集索引的规则来存储的.就像新华字典.整本字典是按照A-Z的顺序来排列.这也是一个表只能有一个聚集索引的原因.因为这个特点,具体索 ...

      1. 怎样让索引仅仅能被一个SQL使用
      1. 有个徒弟问我,要创建一个索引,去优化一个SQL,可是创建了索引之后其它 SQL 也要用 这个索引,其它SQL慢死了.要优化的SQL又快.遇到这样的问题咋搞? 一般遇到这样的问题还是非常少的.处理的方法 ...

      1. Oracle ORA-14102: 只能指定一个 LOGGING NOLOGGING 子句
      1. oracle 11g ,在通过命令impdp向一个数据库用户导入数据时,出现错误: ORA-14102: 只能指定一个 LOGGING NOLOGGING 子句 造成此问题的原因是:当导入的表里没 ...

      1. 给隔壁的妹子讲『一个SQL语句是如何执行的?』
      1. 前言 SQL作为Web开发是永远离开不的一个话题,天天写SQL,可是你知道一个SQL是如何执行的吗? select name from user where id = 1; 上面是一个简单的查询语句, ...

      1. 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了
      1. 今天收到运营同学的一个 SQL,有点复杂,尤其是这个 SQL explain 都很长时间执行不出来,于是我们后台团队帮忙解决这个 SQL 问题,却正好发现了一个隐藏很深的线上问题. select a. ...

      1. Oracle数据库该如何着手优化一个SQL
      1. 这是个终极问题,因为优化本身的复杂性实在是难以总结的,很多时候优化的方法并不是用到了什么高深莫测的技术,而只是一个思想意识层面的差异,而这些都很可能连带导致性能表现上的巨大差异. 所以有时候我们应该先 ...

      1. 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式。
      1. 当没有用 EXISTS 引入子查询时,在选择列表中只能指定一个表达式.比如 select * from T_Employee where FNumber not in ( select top 5*  ...

      1. 一个 Sql语句优化的问题- STATISTICS 统计信息
      1. 前段时间,同事遇到一个 Sql语句的问题,一个列表分页功能响应在30 s以上,看数据库里面的数据条数,数据量也不大,相关字段的一些索引也都有,可就是慢.于是找出具体的sql 语句出来分析,分页功能主要 ...

      1. scala实现一个sql执行引擎-(上)
      1. 前言 在实时计算中,通常是从队列中收集原始数据,这种原始数据在内存中通常是一个java bean,把数据收集过来以后,通常会把数据落地到数据库,供后面的ETL使用.举个一个简单的例子,对一个游戏来说, ...

    1.  
    2. 随机推荐

        1. python输出最大公约数和最小公倍数
        1. def myfun(): num1 = int(input('输入num1')) num2 = int(input('输入num2')) list1=[] for i in range(1, max( ...

        1. 【水滴石穿】douban-movies-react-native
        1. 这个项目的话,倒是可以做一个支架页面,就是你需要什么东西,你就可以在里面加,不过也是比较难的地方 就是数据流,数据处理的部分.react可以处理数据的方式很多,没有见过类似于古老的vue时候可以使用的 ...

        1. hackerrank--- challenges/fp-update-list
        1. 纯属为了练习haskell, 竟然贴代码都没办法高亮. challenges/fp-update-list Update the values of a list with their absolut ...

        1. linux类库之log4j-LogBack-slf4j-commons-logging
        1. log4j http://commons.apache.org/proper/commons-logging/ http://logging.apache.org/log4j/2.x/ The Com ...

        1. SiteMesh:一个优于Apache TilesWeb页面布局、装饰框架
        1. 一.SiteMesh项目简介 OS(OpenSymphony)的SiteMesh是一个用来在JSP中实现页面布局和装饰(layout and decoration)的框架组件,能够帮助网站开发人员较容 ...

        1. CSS3个性化圆形按钮登录表单
        1. 在线演示 本地下载

        1. 第三十二讲:UML类图(下)
        1. 一个类能够看到另外一个类的属性和方法,那么这两个类是关联的.

        1. springboot 数据访问【转】【补】
        1. 六.SpringBoot与数据访问 1.JDBC pom.xml配置 <dependencies> <dependency> <groupId>org.spring ...

        1. 大话鸿蒙操作系统(一)-- 先聊聊 Fuchsia OS
        1. 大话鸿蒙操作系统(一) 第一篇先不聊鸿蒙操作系统,聊聊 Google 的新系统 Fuchsia OS. 先看看 Fuchsia OS 介绍. 为什么 Google 要造新的 Fuchsia OS 操作 ...

        1. TIJ——Chapter Six:Access Control
        1. package:the library unit The levels of access control from "most access" to "least ac ...