当前位置: 首页 > news >正文

对表的连接的总结

1.嵌套循环访问的次数
SYS@ PROD>create table t1(
id number not null,
n number,
contents varchar2(4000)
);
SYS@ PROD>create table t2(
id number not null,
t1_id number not null,
n number,
contents varchar2(4000)
);
SYS@ PROD>execute dbms_random.seed(0);

SYS@ PROD>insert into t1
select rownum,rownum,dbms_random.string('a',50)
from dual
connect by level<=100
order by dbms_random.random;
SYS@ PROD>insert into t2 select rownum,rownum,rownum,dbms_random.string('b',50) from dualconnect by level<=100000 order by dbms_random.random;
SYS@ PROD>commit;
SYS@ PROD>select count(*) from t1;100
SYS@ PROD>select count(*) from t2;100000
测试:
set linesize 1000
alter session set ststistics_level=all;
select /*+leading(t1) user_nl(t2)*/* from t1,t2 where t1.id=t2.t1_id;
select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
发现执行计划里面Starts列t1表访问1次,t2表访问100次
1>SYS@ PROD>select /*+leading(t1) use_nl(t2)*/*
from t1,t2
where t1.id=t2.t1_id
and t1.n in(17,19);
SYS@ PROD>select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
发现执行计划里面Starts列t1表访问1次,t2表访问2次
2>SYS@ PROD>select /*+leading(t1) use_nl(t2)*/*
from t1,t2
where t1.id=t2.t1_id
and t1.n=19;
发现执行计划里面Starts列t1表访问1次,t2表访问1次
3>SYS@ PROD>select /*+leading(t1) use_nl(t2)*/*
from t1,t2
where t1.id=t2.t1_id
and t1.n=999999999;
发现执行计划里面Starts列t1表访问1次,t2表访问0次
结论:t1表的查询返回多少条记录,t2表就访问多少次。

HINT的含义,其中use_nl表示强制用嵌套循环的方式连接,leading(t1)表示强制先访问t1表,也就是t1表作为驱动表,增加这些HINT
提示的目的只是为了确保我们的SQL语句的执行计划在做嵌套循环连接。在嵌套循环连接中,驱动表返回多少条记录,被驱动表就访问多少次。
2.哈希连接表的访问次数
/*leading(*) use_hash(t2)*/*
结论:在HASH连接中,驱动表和被驱动表都只会访问0次或者1次。
3.排序合并的访问次数
/*leading(*) use_merge(t2)*/*
结论:排序合并连接根本就没有驱动和被驱动的概念,而嵌套循环和哈希连接要考虑驱动和被驱动情况。

三种访问顺序的比较:
1.嵌套循环连接特别要注意驱动表的顺序,小的结果集先访问,大的结果集后访问,才能保证被驱动表的访问次数降到最低,从而提升性能。
2.哈希循环顺序也重要
3.嵌套循环连接和哈希连接有驱动顺序,驱动表的顺序不同将影响连接的性能,而排序合并连接没有驱动的概念,无论哪张表都无妨。
三种访问的排序:
嵌套和哈希不需要排序,而排序合并需要排序。

适合连接条件范围的比较:
1.HASH连接查询条件不支持<>,大于和小于的写法,也不支持like的连接方式,如果加了这些连接条件,会走全表扫描。
2.排序合并连接不支持<>,也不支持like的连接条件,但支持>和<之类的连接条件。遇到
3.嵌套循环支持所有的sql连接条件的写法,没有任何限制。

最适合NL连接的场景
①两表关联返回的记录不多,最佳情况是驱动表结果集仅返回1条,或少量几条记录,而被驱动表仅匹配到1条或少量几条数据
这种情况即便t1表和t2表的记录奇大无比,也是非常迅速的。
②遇到一些不等值查询导致哈希和排序合并连接被限制使用,不得不使用NL连接。

排序合并连接上的连接条件虽然没有检索功能却有消除排序的作用。

转载于:https://www.cnblogs.com/wjmbk/p/8474073.html

相关文章:

  • 所有版本chrome、chromedriver、firefox下载链接
  • 哈工大发明“电子体毛”,让机器人学会“敏感”
  • AR增强现实将重塑出版行业的未来
  • Quaternium无人机空中停留飞行4小时40分钟,刷新无人机续航吉尼斯纪录
  • OpenSSL学习(二十一):基础-指令s_server
  • 树莓派系列教程:1.环境与系统,无显示器无键盘无网线联网并使用PuTTy与VNC图形界面远程登录...
  • Akka2使用探索6(Futures)——实现并发和异步
  • MIT博士研发绘画机器人Utensil,精通绘画和激光切割
  • 微信小程序—如何获取用户输入文本框的值
  • 输入输出重定向
  • javaweb编写分页mysql
  • linux更新内核
  • 【技巧】关于素数
  • LING 实战
  • learning koa2.x
  • 「译」Node.js Streams 基础
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • Angular2开发踩坑系列-生产环境编译
  • es的写入过程
  • java第三方包学习之lombok
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MobX
  • PAT A1092
  • SQLServer之索引简介
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Web设计流程优化:网页效果图设计新思路
  • 从输入URL到页面加载发生了什么
  • 第十八天-企业应用架构模式-基本模式
  • 回顾 Swift 多平台移植进度 #2
  • 力扣(LeetCode)357
  • 爬虫模拟登陆 SegmentFault
  • 数组的操作
  • 学习笔记:对象,原型和继承(1)
  • 一道闭包题引发的思考
  • ​Linux·i2c驱动架构​
  • ​如何防止网络攻击?
  • (Matlab)使用竞争神经网络实现数据聚类
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (分享)自己整理的一些简单awk实用语句
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)Java算法:二分查找
  • (一)UDP基本编程步骤
  • (一)认识微服务
  • (转)一些感悟
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .form文件_一篇文章学会文件上传
  • .NET Core6.0 MVC+layui+SqlSugar 简单增删改查
  • .NET Micro Framework初体验
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .net程序集学习心得