暂无图片
MySQL 以下SQL如何优化?
我来答
分享
暂无图片 匿名用户
MySQL 以下SQL如何优化?
暂无图片 10M
with g_z as
(
    select cast(og3.id as text) cd, og2.gongzhong clss2 from public.ods_gongzhong og3
    left outer join public.ods_gongzhong og2 on og3.pid = og2.id
    where og2.gongzhong is not null
)
, b_gz as 
(
    select distinct user_id as dis_user_id
    ,count( user_id ) as user_id_cnt
    , view_count
    ,o_ctiy."name" as ctiy_cnt
    ,UNNEST(regexp_split_to_array( profession , '\,')) gz_num
    ,gz_cnt.clss2
    from public.ods_gczdw 
    left join ods_area o_ctiy on province_id = o_ctiy.pid
    left join g_z gz_cnt on ods_gczdw.gz_num = g_z.cd
    where to_char(to_timestamp( add_time ) ,'yyyy-mm-dd') 
    between '2021-01-01' and '2021-09-01'
    group by dis_user_id,view_count,o_ctiy."name"
)
select * from b_gz

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
薛晓刚

add_time 建立索引,然后

where add_time  >  '2021-01-01' and  add_time< '2021-09-01'

不过前提条件是这9个月数据不要太多。如果9个月有上千万,或者一共就10个月。都效果不好。需要缩短时间范围。

暂无图片 评论
暂无图片 有用 0
DarkAthena

首先,你这真是MYSQL?确定不是POSTGRESQL??

  1. ods_gongzhong 的数据量有多少?和下面的ods_gczdw 相比是怎样的?
  2. 在b_gz 中为什么会出现 distinct 和group by 同时存在?确定没有逻辑问题?
  3. 中间的正则切分转数组目的是什么?切出来有多少?
  4. 再就是和楼上一样,字段作为查询条件时,字段本身不要进行格式化处理,你的add_time是什么类型什么值,后面条件直接就用对应的类型的就好了
暂无图片 评论
暂无图片 有用 0
chengang

没有表信息,没有索引信息,没有执行计划

从语句上看,我觉得可以有两点可以优化。
1、第一个with 其实可以直接使用inner join (但我估计优化器已给你优化成了inner join )
2、建一个 to_char(to_timestamp( add_time ) ,‘yyyy-mm-dd’) 的函数索引。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏