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

  • 时间:
  • 浏览:0

以后有人还能给出或多或少建议语录,感激不尽,谢谢

好像没什么不一样的,咋样让 好像下行速率 快了或多或少(实在差这样来越多),省去了group by 从从不的字段。

这为什么么办,建索引的目的咋样让 为了解决全表扫描,因为下行速率 太慢。

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

select * from user_indexes where table_name='KS18'

就看下 這個 表必须有一一二个 索引,咋样让 主键索引,这为什么么行,索引建上。

create index INDEX_KS18_KS0300 on KS18 (ks0300)

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



走索引了,快了或多或少(好像),以后的查询全部后要 2.4s 左右。

不错,這個 索引建的没问题图片。

再看看 KS19 的索引

select * from user_indexes where table_name='KS19'

发现有Ks130000 的索引,咋样让 咋样让 不走這個 ,依然是 Table Access Full。既然這個 显示是标志位因为全表扫描,咋样让 把标志位删了咋样?

删了以后,再看解释查询计划

还是全表扫描,那跟标志位没这样来越多关系了。既然咋样让 不行,换个思路。少关联 ks17 表,咋样让 两张表试试咋样。结果如下





依旧全表扫描,用必须 ks19 中的 ks130000索引。我记起来了,使用索引是优化器来选泽的,索引使用的流程是 先去索引数找到对应的值,在把索引树的索引对应主键给拿来,再去主键索引里边,再去取值。這個 数量大的,好像全表扫描加快下行速率 ?每一行记录全部后要 个 ROWID,ROWID才是真正的唯一的。

咋样让 语录,好像数据量大语录,要花费 in 了,每一根逐条比对,这样多去用索引。

select *

不对啊,才 36w 数据,就算全表扫描,只返回 20 条记录不以后必须 慢啊。

我发现有 ‘’ as ks30003,‘’ as ks30004 ,group by '',''

这是什么鬼东西,说好的要什么就返回什么呢?先把这有一一二个 鬼东西打上去试试。(这里 Oracle 11g 是有查询缓存的,Mysql 以后打上去了,将Sql 和结果倒进哈希表中,以后下次 Sql一样,直接返回结果,这样多再去磁盘里边拿数据了,不过Mysql 以后在5.5版本以后移除了這個 所谓的优化)咋样让 Oracle 11g 啊,查询缓存是有的,不过应该和這個 不一样。以后点击下一页时,相对于来说是快的。

一看查询计划显示,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 依旧是全表扫描。

咋样让 解决全表扫描,目前来说,我是无能为力了。