记录一次Sql调优的过程

工作的时候遇到一个需求,要求如下:将数据库里面的数据加载出来显示在电视机上面。

条件如下:

  1. 数据保存在Oracle中,共有34张表,所有表的结构相同
  2. 表中只有一个ID字段存在索引,因为数据的插入非常频繁,但是查询相对来说没有那么频繁
  3. 需要将所有表中一分钟之内的最新的数据取出来,并保存在一个DataTable中
  4. 所有表中的数据都是超过100W行数据的
  5. 开发语言为C#

设计一、在C#中保存所有的表名,然后遍历这些表,每张表生成一条Sql,然后每句Sql执行一次查询,最后将所有的数据汇总到一个DataTable中。

这种方式操作非常简单,但是效率低下,34张表就需要执行34此数据库连接。非常浪费资源!

设计二、为了解决掉设计一的问题,决定在C#中生成所有的Sql然后通过union all 连接成1条Sql然后执行一次查询得出结果

Sql部分截图如下:

 

此方法解决掉了多次连数据库的巨大资源消耗,但是存在下面的一个问题,因为create_time字段是没有索引的,所以以上的代码虽然在Sql中实现了查询一分钟之内的数据,但是时间上需要5S左右的查询时间,这对于一个几乎需要实施刷新的Web程序几乎是不可接受的,因为刷新前会出现大概5S的空白页面,用户体验非常不好。

打开执行计划查看

 

可以看出,因为create_time字段没有索引,所以走的是全表扫描,探后还需要进行排序,最大的消耗就在这里,因为每张表的数据量比较大,所以效率比较低。

设计三、为了解决设计二中查询速度慢的问题,决定将需求分成两个地方执行,数据库部分和C#部分,数据库部分只查询最新的一条数据,对于数据是否满足一分钟内的要求,则在C#中进行判断。对Sql的调整如下

 

修改后的查询只需0.2s左右,查看执行计划

 

这里的资源消耗非常低,也用到了ID字段的索引。

通过这次的优化,现在网页可以1s内打开,同时刷新前不再出现长时间的白屏现象。

 

以上就是这次的调优经历,因为我对Sql调优不是非常熟悉,所以记录这个过程,用于提醒自己要更加深入了解。

如果看到这篇文章的大神有更好的方法可以使用,烦请不吝赐教!

原文地址:https://www.cnblogs.com/ckym/p/14793831.html