记录亿级数据的SQL优化
开发工具:ads12
数据库:DB2
1.表数据量
表说明:
数据量最大的是气和水的小时数据(GASFACHOURDATA-126512537 WATERFACHOURDATA-82943265)合计有2亿的数据
GASFACHOURDATA:气小时数据 其中包括排口 企业标号
WATERFACHOURDATA:水小时数据 其中包括排口 企业标号
POLLUTANTSET 排口的信息表 其中包括排口 企业标号 排口的报警上限
其他是一些表是企业的基本信息表 企业排口数据 企业分类信息表
合计数据为:2亿多数据
2.需求
现在需要得到某个企业某天的污染物排放数据,判断是否到达报警上线,排口的排放数据,标准数据
3.SQL书写
1.相关索引
1.count(*) count(1) count(索引)的查询效率
先看看count(*) count(1) count(索引)在亿级数据的查询效率如何(以ADS的查询时间为参考)
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数据
大表驱动小表 20w数据
差距不大,但是最好使用小表去驱动大表
7.现在关联上了表,需要查询当天的时间的数据 由于表是小时数据 如果直接条件直接等时间(a.MONITORTIME ='2020-02-21')只查的出来当天时间12点的数据
如果SQL对数据时间进行处理
索引已失效
使用范围来进行对时间处理
最后处理的SQL执行时间:
祝君好梦!