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

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

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

在SCOTT账户里面创建一个測试表和一个索引
SQL> create table test as select * from dba_objects; 表已创建。
SQL> create index idx_test on test(object_id); 索引已创建。
SQL> set lines 200 pages 200
SQL> set autot trace
SQL> select * from test where object_id=10; 运行计划
----------------------------------------------------------
Plan hash value: 2473784974 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 207 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 207 | 2 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | IDX_TEST | 1 | | 1 (0)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("OBJECT_ID"=10) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
44 recursive calls
0 db block gets
136 consistent gets
4 physical reads
0 redo size
1404 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
然后人工设置索引统计信息 把集群银子搞大(很大)

SQL> begin
2 dbms_stats.set_index_stats(ownname => 'SCOTT',
3 indname => 'IDX_TEST',
4 numrows => 100000000000,
5 numlblks => 100000,
6 numdist => 100000,
7 avglblk => 100000,
8 avgdblk => 100000,
9 clstfct => 100000000000);
10 end;
11 / PL/SQL 过程已成功完毕。
SQL> select * from test where object_id=10;

运行计划
----------------------------------------------------------
Plan hash value: 1357081020 --------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 207 | 290 (1)| 00:00:04 |
|* 1 | TABLE ACCESS FULL| TEST | 1 | 207 | 290 (1)| 00:00:04 |
-------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 1 - filter("OBJECT_ID"=10) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
1039 consistent gets
0 physical reads
0 redo size
1404 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

这个时候。全部的SQL都不会走这个索引了,你想让某个SQL走索引。直接hint 让它走就ok了

SQL> select /*+ index(test idx_test) */ * from test where object_id=10;

运行计划
----------------------------------------------------------
Plan hash value: 2473784974 ----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 207 | 1446K (1)| 04:49:20 |
| 1 | TABLE ACCESS BY INDEX ROWID| TEST | 1 | 207 | 1446K (1)| 04:49:20 |
|* 2 | INDEX RANGE SCAN | IDX_TEST | 1 | | 15 (94)| 00:00:01 |
---------------------------------------------------------------------------------------- Predicate Information (identified by operation id):
--------------------------------------------------- 2 - access("OBJECT_ID"=10) Note
-----
- dynamic sampling used for this statement (level=6) 统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
0 redo size
1404 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed


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

最新文章

  1. java面向对象六原则一法则
  2. MMORPG大型游戏设计与开发(服务器 AI 基础接口)
  3. WPF 仪表盘 刻度盘 动态 加载中 开源
  4. mybatis 使用记录(二) 动态拼接查询条件
  5. Entity Framework 实体框架的形成之旅--数据传输模型DTO和实体模型Entity的分离与联合
  6. 【GoLang】GoLang UTF8 与 Unicode
  7. Can't connect to local MySQL Server throught socket '/var/run/mysqld/mysqld.sock'(2)
  8. hdu 1205 从整体考虑
  9. java 面向对象编程--第十章 接口
  10. linux内核系列(一)编译安装Linux内核 2.6.18
  11. POJ-1981 Circle and Points 单位圆覆盖
  12. Android UI WebView的使用:
  13. Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
  14. 谈谈ILDasm的功能限制与解除
  15. [转载]We Recommend a Singular Value Decomposition
  16. 【js】性能问题
  17. 吕鑫VC6.0-VS2015 全套C/C++、MFC新手实战入门教程、Linux视频教程 最好的基础入门教程没有之一
  18. pouchdb-find( pouchdb查询扩展插件 ,便于查询)
  19. SqlServer和Oracle中一些常用的sql语句4 局部/全局变量
  20. Web开发学习之路--Springmvc+Hibernate之初体验

热门文章

  1. Linux系统病毒防治
  2. SQL Server 2000数据库备份与恢复图解
  3. C/C++(C++类与对象)
  4. hdu 5312 Sequence(数学推导——三角形数)
  5. HDU 2886 Lou 1 Zhuang
  6. USACO milk
  7. Java程序猿的JavaScript学习笔记(6——面向对象模拟)
  8. 前台ajax验证技术采用正则表达式
  9. H.264视频编解码SoC满足高清DVR设计需求
  10. js中常用的对象—String的属性和方法