记一次比较 Low 的 SQL 优化经历

  • 时间:
  • 浏览:1

我发现有 ‘’ as ks10003,‘’ as ks10004 ,group by '',''

这是那先 鬼东西,说好的要那先 就返回那先 呢?先把这只能 鬼东西加在试试。(这里 Oracle 11g 是有查询缓存的,Mysql 原因加在了,将Sql 和结果装在哈希表中,原因下次 Sql一样,直接返回结果,不需要再去磁盘上边拿数据了,不过Mysql 原因在5.5版本已经 移除了什儿 所谓的优化)已经 Oracle 11g 啊,查询缓存是有的,不过应该和什儿 不一样。原因点击下一页时,相对于来说是快的。

这为什么我么我回事,建索引的目的而是为了处置全表扫描,原因速率单位太慢。

先从过滤条件入手,ks18 的 ks01000

select * from user_indexes where table_name='KS18'

看到下 什儿 表只能只能 索引,而是主键索引,这为什么我么我行,索引建上。

create index INDEX_KS18_KS01000 on KS18 (ks01000)

执行结果,2.421s。还行,看看解释查询计划



走索引了,快了什儿 (好像),已经 的查询回会 2.4s 左右。

不错,什儿 索引建的没问題。

再看看 KS19 的索引

select * from user_indexes where table_name='KS19'

发现有Ks110000 的索引,已经 而是不走什儿 ,依然是 Table Access Full。既然什儿 显示是标志位原因全表扫描,只能 把标志位删了怎样才能?

删了已经 ,再看解释查询计划

还是全表扫描,那跟标志位没只能 来没人 多关系了。既然只能 不行,换个思路。少关联 ks17 表,而是两张表试试怎样才能。结果如下





依旧全表扫描,用只能 ks19 中的 ks110000索引。我记起来了,使用索引是优化器来确定的,索引使用的流程是 先去索引数找到对应的值,在把索引树的索引对应主键给拿来,再去主键索引上边,再去取值。什儿 数量大的,好像全表扫描更慢?每一行记录回会个 ROWID,ROWID才是真正的唯一的。

只能 句子,好像数据量大句子,大概 in 了,每二根逐条比对,不需要去用索引。

一看查询计划显示,ks19 表关联时,扫描了全表,一张表 36w 数据全扫描了。这为什么我么我行,看看是哪个条件原因的。找到相应的耗时的过滤条件行数,发现是删除标记原因的。



既然全表扫描了,那加个索引试试?两张表的删除标记都加在索引。

create index Index_ks19_bae001 on ks19 (bae001)

create index Index_ks17_bae001 on ks17 (bae001)

加在已经 ,没用,根本只能 走索引,还是 Table Access Full (全表扫描)。

原因他们还能给出什儿 建议句子,感激不尽,谢谢

不行,再看看sql,发现关联了两张未必要的表,而是 ks04 和 ks15。这为什么我么我能行,把未必要的关联加在,再试试。结果从 3.6s 左右降到了 2.891s。看来不该关联的表还是未必关联,不时需的字段,还是未必返回啊。为了准确什儿 ,我继续清缓存,继续执行句子(十次)

结果分别是

3.014s

3.185s

3.210s

3.242s

2.952s

3.042s

2.873s

2.879s

2.985s

3.032s

再看看解释查询计划

执行ALTER SYSTEM FLUSH SHARED_POOL;

ALTER SYSTEM FLUSH BUFFER_CACHE;

将刷新缓存

试试。加在了一眼看到出的未必要字段,结果如下。

只能 处置全表扫描,目前来说,我是无能为力了。

少关联了未必要的表,少了未必要的返回字段,扫描行数少了些,但,ks19 和 ks17 依旧是全表扫描。

好像没那先 不一样的,已经 好像速率单位快了什儿 (随便说说差只能 来没人 多),省去了group by 未必要的字段。

不对啊,才 36w 数据,就算全表扫描,只返回 20 条记录不原因只能 慢啊。

select *

小结一下