记录亿级数据的SQL优化

记录亿级数据的SQL优化

Scroll Down

记录亿级数据的SQL优化

开发工具:ads12
数据库:DB2

1.表数据量

image.png

表说明:
数据量最大的是气和水的小时数据(GASFACHOURDATA-126512537 WATERFACHOURDATA-82943265)合计有2亿的数据
GASFACHOURDATA:气小时数据 其中包括排口 企业标号
WATERFACHOURDATA:水小时数据 其中包括排口 企业标号
POLLUTANTSET 排口的信息表 其中包括排口 企业标号 排口的报警上限
其他是一些表是企业的基本信息表 企业排口数据 企业分类信息表
合计数据为:2亿多数据

2.需求

现在需要得到某个企业某天的污染物排放数据,判断是否到达报警上线,排口的排放数据,标准数据

3.SQL书写

1.相关索引

image.png
image.png

1.count(*) count(1) count(索引)的查询效率

先看看count(*) count(1) count(索引)在亿级数据的查询效率如何(以ADS的查询时间为参考)
image.png
image.png
image.png

count(*)与count(索引)差距不大就8秒 但是count(1)就慢了许多,重复几次的实验,差不多要慢2-4秒

2.SQL书写思路

写SQL要追求效率,但是要建立在正确的逻辑关系上
我们由于气和水的表结构是一样的 索引的创建情况也是一样的 我们只用把气的写好在把水的UNION ALL起来就可以了

1.梳理表关系

YWZDJK.POLLUTANTSET与YWZDJK.GASFACHOURDAT由PSCODE企业编号和OUTPUTCODE排口编号

2.SQL书写:

1.字段肯定不要*
2.尽量避免索引失效(对索引进行运算、like如果百分号不在右边,or会导致索引和条件失效最好实用union起来)
3.对于关联的表需要进行多条件处理,使用辅助表来梳理关系,更有助于SQL的书写
4.减少表的重复查询 能拿到的字段最好关联处理就一次拿到,后面进行处理
现在考虑谁去关联谁了
5.大数据量的表最好把数据进行筛选了 在进行处理
6.小表去驱动大表
测试:
小表驱动大表 20W数据
image.png
大表驱动小表 20w数据
image.png
差距不大,但是最好使用小表去驱动大表
7.现在关联上了表,需要查询当天的时间的数据 由于表是小时数据 如果直接条件直接等时间(a.MONITORTIME ='2020-02-21')只查的出来当天时间12点的数据
如果SQL对数据时间进行处理
image.png
索引已失效
image.png
使用范围来进行对时间处理
image.png
image.png
最后处理的SQL执行时间:
image.png

祝君好梦!