目录
1.1 循环嵌套关联 ( NESTED LOOPS JOIN) :大小表关联
1.3 排序合并关联 (SORT MERGE JOIN):有索引的两张表.
首先两个表关联后,小表为内侧表,大表作为外侧表,确定外侧表和内侧表的连接后,将外侧表作为驱动表,内侧表作为被驱动表,根据驱动表的连接条件进行筛选.最后获得驱动表的数据合集.
运用场景: 大小表关联,被驱动表的数据不能超过内存,或者直接使用索引得到匹配的记录.
小表驱动大表:
FOR (20条数据)
FOR { 20 W 条数据 }
--小表在外面 ,表连接只需20次
大表驱动小表:
FOR (202条数据)
FOR { 20 条数据 }
-- 大的在外面的话,表连接需要20w次
总结: 小表驱动大表的主要目的就是减少表的连接次数,加快查询速度.
-- 两张数据相差不大,并且还是等值关联.在关联的时候,会先对关联字段做哈希值计算,计算完,再拿哈希值匹配.
-- 先对关联字段做一个排序,再拿排好顺序的数据做关联,适合有索引的两张表.如果有索引,就可以排除排序,这样可以大大提高这种连接操作的连接速度,特别是对于较大的表。
1、/*+ PARALLEL(表名1,并行数)[(表名2,并行数)……] */ --指定开启多少个并行|并发(一般为2、4、8……)
2、/*+ INDEX(表名,索引名) */ --指定索引扫描
3、/*+ FULL(表名) */ --指定全表扫描
4、/*+ USE_NL(表名1,表名2) */ --指定用NESTED LOOP连接
5、/*+ USE_HASH(表名1,表名2) */ --指定用HASH连接
6、/*+ USE_MERGE(表名1,表名2) */ --指定用SORT MERGE JOIN
7、/*+ LEADING(表名1,表名2) */ --指定表1作为被驱动表
8、/*+ APPEND */ --数据直接插入到高水位上面(与insert连用)直接往后面插,无视前面的水位置
案例
-- 优化器自动选择的是 SORT MERGE关联
- SELECT
- *
- FROM EMP E
- JOIN DEPT D
- ON E.DEPTNO = D.DEPTNO;
--根据提示符选择的关联方式
- SELECT /*+ USE_NL(E, D) LEADING(D, E) */
- *
- FROM EMP E
- JOIN DEPT D
- ON E.DEPTNO = D.DEPTNO;
-- 在使用 DELETE 删除数据时,会因为碎片问题,存在高水位线
-- 高水位线存在的话,会导致后面的数据插入性能降低
-- 解决高水位的方法:
insert /*+ APPEND */ into 表名
--对数据进行备份,使用 TRUNCATE TABLE 方式 干掉数据,然后重新导入数据
-- 截断表
TRUNCATE TABLE
- CREATE TABLE B
- AS
- SELECT * FROM A
- -- 不会复制水位线