精华内容
下载资源
问答
  • sql语句,having优化

    2017-01-19 07:56:38
    sql中的having速度很慢,怎么优化呢? SELECT sd.send_detail_id, sd.amount, SUM(IFNULL(pb.qty,0)) AS c FROM p_host_send s INNER JOIN p_host_send_detail sd ON sd.send_id = s.send_id LEFT JOIN p_host_...
  • MySql 的group by having 优化案例

    千次阅读 2017-12-08 09:45:17
    (select * from pay_award_log group by uid having award_time between UNIX_TIMESTAMP(‘2017-12-07 0:0:0’) and UNIX_TIMESTAMP(‘2017-12-07 23:59:59’) and operator = 175587 ) as award_count 这样子的...

    Background:
    1.pay_award_log为一张审核表,表有重复的记录,数据约51W条
    2.award_time字段有btree索引,operator字段没有索引,根据operator和award_time查询频率是一样的
    3.operator为后台审核人,uid是用户字段,用户在一天内可能有多条记录,求175587这个后台人员一天内审核的用户数,需要根据uid排除重复的记录

    select count(*) no from
    (select * from pay_award_log group by uid having award_time between UNIX_TIMESTAMP(‘2017-12-07 0:0:0’) and UNIX_TIMESTAMP(‘2017-12-07 23:59:59’) and operator = 175587 ) as award_count
    这样子的查询需要耗时0.6-0.8秒,处女座程序员是绝对接收不了这样的龟速的,况且一个页面还有多条这样的sql要查询,一个页面有9条这样的查询,打开这个统计的页面要7-8秒真的是超级慢!

    分析SQL:
    1.这里查询慢group by是一个很关键的因素,考虑干掉他,用程序去去重
    2.多条这样的sql就是where operator = 175587、operator = xxxxx这样的,直接去掉operator, 保留一个索引的where条件,用程序去过滤条件
    3.再把统计为昨天的数据增加上缓存,今天的数据也增加上缓存,当天的数据缓存时间设置短点5-30分钟这样
    整个优化方案下来页面访问速度提升到0.3S,比之前的访问速度提升了25倍,有缓存的情况下直接秒读

    展开全文
  • Having转Not Exists优化

    2019-11-17 00:31:10
    Having如果相关查询,有时候会产生Filter,下面我们看看转换方法。 1.数据准备 DROP table Student; CREATE TABLE Student (StuName VARCHAR2(10) NOT NULL, SClass VARCHAR2(10) , Subject VARCHAR2(10), ...

    Having如果相关查询,有时候会产生Filter,下面我们看看转换方法。

    1.数据准备

    DROP table Student;

    CREATE TABLE Student

    (StuName VARCHAR2(10) NOT NULL,

     SClass VARCHAR2(10) ,

     Subject VARCHAR2(10),

     Team VARCHAR2(10),

     Score INTEGER);

     

    insert into Student values('A1','1','数学','A',60);

    insert into Student values('A2','1','数学','B',90);

    insert into Student values('A3','1','英语','A',80);

    insert into Student values('A4','1','英语','B',40);

    insert into Student values('A5','2','数学','A',60);

    insert into Student values('A6','2','数学','B',60);

    insert into Student values('A7','2','英语','B',80);

    insert into Student values('A8','2','英语','B',100);

    commit;

     

    2.检索要求

    检索每个班级中,科目平均分大于所有小组平均分的班级名,科目名,科目平均分

    即上图黄色标注部分。

    3.SQL优化

    select s.SClass,s.Subject, avg(s.Score)

    from Student s

    group by s.SClass,s.Subject

    having avg(s.score)

        >all(select avg(s1.Score)

                from Student s1

                   where s.SClass=s1.SClass

                   group by s1.Team);

    Having过滤走了Filter连接。

    with tmp as

    (select s.SClass,

            s.Subject,

                  avg(s.Score) over(partition by s.SClass,s.Subject) as avg_Subject,

                  avg(s.score) over(partition by s.SClass,s.Team) as avg_Team

     from Student s)

    select distinct t.SClass,t.Subject,t.avg_Subject

    from tmp t

    where not exists (select 1

                      from tmp t2

                                  where t.SClass=t2.SClass

                                    and t.avg_Subject<=t2.avg_Team);

    查询把with查询展开了,然后走了Hash连接。

    这里如果聚合运算可以大幅度减少数据量,建议with不展开。具体不在验证。

    展开全文
  • 按照age分组然后选择公司数量...-- having子句可以对过滤后的数据进行处理,但是having子句不能单独使用,不能代替where,必须和group by子句联合使用 +-----+-------------+ | age | max(salary) | +-----+-----------

    按照age分组然后选择公司数量最大为800000之上的元组,则我们得到

    mysql> select age,max(salary) from user1 group by age having max(salary)>800000;-- having子句可以对过滤后的数据进行处理,但是having子句不能单独使用,不能代替where,必须和group by子句联合使用
    +-----+-------------+
    | age | max(salary) |
    +-----+-------------+
    | 900 |    90000000 |
    +-----+-------------+
    1 row in set (0.00 sec)
    
    mysql> select age,max(salary) from user1 where salary>800000 group by age;-- 优化,先用where进行条件过滤,然后group by。能用where尽量先用where
    +-----+-------------+
    | age | max(salary) |
    +-----+-------------+
    | 900 |    90000000 |
    +-----+-------------+
    1 row in set (0.00 sec)

     

    展开全文
  • where有关的优化:使用where代替having

    千次阅读 2019-02-21 11:42:21
    一、使用where字句代替having字句  1、select语句汇总,where字句过滤行  2、having字句是分组后才过滤  3、行被分组需要时间,降低分组的行数可以提高效率,所以使用where 字句代替havingz字句 验证 select ...

    注意:时间差不明显是因为数据比较少,数据多的话更好验证 


    一、使用where字句代替having字句 
    1、select语句汇总,where字句过滤行 
    2、having字句是分组后才过滤 
    3、行被分组需要时间,降低分组的行数可以提高效率,所以使用where 字句代替havingz字句

    验证

    select JOB,max(sal)  from emp
    group by JOB 
    having JOB<>'CLERK';
    
    
    select JOB,max(sal)  from emp
    where JOB<>'CLERK'
    group by JOB ;


    二、使用<=代替< 
    empno<7901与empno<=7900的区别 
    1、使用empno<7901会定位到7901,然后再去找比7901小的数据 
    2、使用empno<=7900d自己定位到7900 
    3、在查询数据量大,并且在循环语句中使用这2个比较操作符时,区别就很明显

    验证

    select * from emp where empno<7901;
    select * from emp where empno<=7900;

    --------------------- 
    作者:单身贵族男 
    原文:https://blog.csdn.net/zhou920786312/article/details/72857428

    展开全文
  • having

    2012-08-14 17:11:14
    使用 HAVING 子句选择行  HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。...
  • where字句有关的优化 注意:时间差不明显是因为数据比较少,数据多的话更好验证 使用where字句代替having字句 1select语句汇总,where字句过滤行 2having字句是分组后才过滤 3行被分组需要时间,降低分组的行数...
  • 优化经历 第一版:将结果放入子查询实现where查询 SELECT school_id,shuliang from ( SELECT b.* , COUNT(school_id) shuliang FROM Sheet1 a join tag b ON a.学校编号=b.school_id GROUP BY school_id ) t WHERE...
  • having 子句

    2010-05-19 14:08:00
    使用 HAVING 子句选择行 HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING ...
  • having使用

    2009-06-30 18:15:00
    使用 HAVING 子句选择行HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING ...
  • ![这是不加HAVING 条件的,时间不到1S]...使用HAVING 添加条件赛选,为了赛选Ks_Student_List(课消表) 学员课消次数大于3,效率极低,不明原因,请大神指点
  • HAVING用法详解

    2018-10-11 15:58:09
    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以...
  • ORACLE HAVING

    千次阅读 2015-02-04 15:56:38
    在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。 语法: SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name ...
  • Having 语句

    2014-08-17 18:27:22
    理解应用 WHERE、GROUP BY 和 HAVING 子句的正确顺序对编写高效的查询代码会有所帮助:   WHERE 子句用来筛选 FROM 子句中指定的操作所产生的行。  GROUP BY 子句用来分组 WHERE 子句的输出。  ...
  • Oracle HAVING子句

    2011-10-18 18:56:00
    使用 HAVING 子句选择行  HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING...
  • sql:常用:having 子句

    2018-12-15 13:15:35
    HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与聚合函数一起使用。 HAVING 子句可以让我们... 以下sql只查一次未优化 SELECT COUNT(company_name) AS countnum, company_name, ...
  • SQL HAVING 子句

    2015-10-17 14:46:25
    HAVING 子句 在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。 SQL HAVING 语法 SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator ...
  • SQL HAVING用法详解

    2019-11-19 13:52:56
    HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似。WHERE 搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING 语法与 WHERE 语法类似,但 HAVING 可以...
  • having 语句的使用

    2010-05-25 22:41:00
    使用 HAVING 子句选择行HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING ...
  • having语句的用法

    2009-10-13 01:32:00
    使用 HAVING 子句选择行 HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 子句和 SELECT 语句交互的方式类似。WHERE 子句搜索条件在进行分组操作之前应用;而 HAVING 搜索条件在进行分组操作之后应用。HAVING ...
  • 文章目录SQL语句优化概述SQL语句优化是提高性能的重要环节SQL语句优化的一般性原则常见SQL优化方法共享SQL语句减少访问数据库的次数SELECT语句中避免使用`*`WHERE子句中的连接顺序利用DECODE函数来减少处理时间删除...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,727
精华内容 17,090
关键字:

having优化