优化sql,返回行数少情况下,NL比hash快好多

sql如下

select  t.id, t.value, tt.sort as sortno
  from ENGINEERING_TYPE t
  left join ENGINEERING_TYPE tt
    on t.parentid = tt.id
 where t.delete_flag = 0
   and t.hasson = 0
 order by sortno, t.sort

sql很简单,相当于自连接 ,返回行数12行,非常小,但是运行5s左右才出结果

看一下执行计划

可以看到,表与表之间走了hash join,我们的一般规律在返回行数较大时,超过万行时,通常使用hash join,在返回行数很少是使用NL连接

修改sql

select /*+ use_nl(t,tt) leading(t) */ t.id, t.value, tt.sort as sortno
  from ENGINEERING_TYPE t
  left join ENGINEERING_TYPE tt
    on t.parentid = tt.id
 where t.delete_flag = 0
   and t.hasson = 0
 order by sortno, t.sort

执行计划如下

执行计划变了,由hash变成了NL

sql的执行速度明显提升,返回实现在0.03秒左右,秒杀。

sql在选择走什么方式的连接的时候,首先要看驱动表与被驱动表返回的行数,这是最基本的判断。

时间: 2024-10-06 22:52:58

优化sql,返回行数少情况下,NL比hash快好多的相关文章

MySQL分页优化中的“INNER JOIN方式优化分页算法”到底在什么情况下会生效?

本文出处:http://www.cnblogs.com/wy123/p/7003157.html 最近无意间看到一个MySQL分页优化的测试案例,并没有非常具体地说明测试场景的情况下,给出了一种经典的方案,因为现实中很多情况都不是固定不变的,能总结出来通用性的做法或者说是规律,是要考虑非常多的场景的,同时,面对能够达到优化的方式要追究其原因,同样的做法,换了个场景,达不到优化效果的,还要追究其原因.个人对此场景在不用情况表示怀疑,然后自己测试了一把,果然发现一些问题,同时也证实了一些预期的想法.

Mybatis执行Update返回行数为负数

获取mybatis的update行数,总是返回负数.后来在官网上找到原因,是由于defaultExecutorType的引起的,defaultExecutorType有三个执行器SIMPLE.REUSE和BATCH.其中BATCH可以批量更新操作缓存SQL以提高性能,但是有个缺陷就是无法获取update.delete返回的行数.defaultExecutorType的默认执行器是SIMPLE. 名称 描述 SIMPLE 执行器执行其它语句 REUSE 可能重复使用prepared stateme

使用union all 遇到的问题(俩条sql语句行数的和 不等于union all 后的 行数的和 !);遗留问题 怎么找到 相差的呐俩条数据 ?

1 create table buyer as 2 SELECT b.id AS bankid 3 FROM v_product_deal_main m, base_member b 4 WHERE b.id = m.BUYERID 5 AND m.DEALDATE <= to_date('20160630', 'yyyymmdd') 6 AND m.STATE = 9 7 AND b.state = 0; 8 ---441947 9 --seller方 10  create table sel

Hibernate 查询sql结果行数的几种方法

一.前言 这个东西,难度几乎没有,就是繁琐. 一条简单的select count(*) from table_name 都能有多种书写方式. 总是忘,这里记录下. 一 .通过Criteria 查询 Criteria criteriaCount = getCriteria(); criteriaCount = criteriaCount.add(Restrictions.eq("dispatchTaskId", dispatchTaskId)); criteriaCount.setPro

sql返回行id

1.sql语句中 insert into tableName() output inserted.id values() 2 .存储过程中 ALTER PROCEDURE dbo.getBuyMedicID (     @id int output,     @AllsumMoney money     ) AS begin     INSERT INTO     t_buyMedic(sumMoney,buyDate)     VALUES(@AllsumMoney,getdate())   

EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值

一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为  -1 ,sqlserver 里面  还没有测试过 using (var ctx = new MyDbContext()) { ctx.Database.ExecuteSqlCommand("UPDATE Person SET Name = 'Michael' WHERE PersonID = 1"); } 二 : Database.SqlQuery<T>   EF5执行sql查询语句

SQL Server SQL性能优化之--数据库在“简单”参数化模式下,自动参数化SQL带来的问题

数据库参数化的模式 数据库的参数化有两种方式,简单(simple)和强制(forced),默认的参数化默认是“简单”,简单模式下,如果每次发过来的SQL,除非完全一样,否则就重编译它(特殊情况会自动参数化,正是本文想说的重点)强制模式就是将adhoc SQL强制参数化,避免每次运行的时候因为参数值的不同而重编译,这里不详细说明. 这首先要感谢“潇湘隐者”大神的提示, 当时也是遇到一个实际问题, 发现执行计划对数据行的预估,怎么都不对,有观察到无论怎么改变参数,SQL语句执行前都没有重编译,疑惑了

mysql优化SQL语句消耗

开启SQL的慢日志查询 配置文件文件中填写如下配置并重启mysql log_queries_not_using_indexes #这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快. log-bin=mysql-bin   slow_query_log=on     long_query_time=2     log_queries_not_using_indexes=on   slow-query-log-file=/var/lib/mysql/slo

优化SQL

1. 通过 show status和应用特点了解各种 SQL的执行频率 通过 SHOW STATUS 可以提供服务器状态信息,也可以使用 mysqladmin extende d-status 命令获得. SHOW STATUS 可以根据需要显示 session 级别的统计结果和 global级别的统计结果. 如显示当前session: SHOW STATUS like "Com_%"; 全局级别:show global status;       以下几个参数对 Myisam 和 I