表连接的时候,通过执行计划查看到的表连接内部的逻辑:
表连接有三种内部的连接方式(查询内容的三种方法):
hash join 哈希连接
nested loops nl嵌套连接
merge join 排序归并
什么时候会出现这个hash join?
两个表格列的等值筛选
什么时候会出现NL嵌套连接?
- 两个表的列,进行非等值筛选;
- A表和B表的数据,相差很大,并且表连接的列都是有索引的,这个时候的等值连接就不会变成hash join,而是会使用nl嵌套连接。
什么时候会出现merge join 排序归并?
两个表的连接,筛选条件不是对列和列进行筛选,而是对列和值进行筛cunc
hints优化器:用来强行改变表格内部运行逻辑的方法
写在select后面,写在列名的前面
/*+ 优化器的内容 */
改变表连接的逻辑:
/* +use_hash(a b) / 强制使用哈希连接
/ +use_merge(a b)/ 强制使用排序归并
/ +use_nl(a b) / 强制使用嵌套连接
改变表格读取的顺序
/ +leading(a b) / a一定要是小表(驱动表),b一定是大表(匹配表)
改变查询表格的方法
/+ full(a) / 强制全表扫描
/+ index(表名 索引名) / 强制使用索引
并发的使用
/+ parallel(8) */ 强制使用并行的资源,来执行这个sql语句
在oracle中怎么去优化查询的sql语句/怎么优化数据库?
1.要先通过执行计划看一下sql语句执行的效率
2.查看表格的数量,如果数据量很大,就先给表格进行分区表的设置
3.给表格建适当的索引
4.检查索引失效的语句
5.使用嵌套去替换部分连接的场景
查询SMITH在哪里上班
联合查询14 4 56行
嵌套查询14 4 18行
6.使用临时表去存储一个或者多个大表筛选的结果,然后使用临时表进行表格的连接
7.or的效率比较低,可以使用union all去进行替换
8. 尽量少使用union minus intersect等集合的运算,这些都是效率很差的关键字
9.使用多线程的并发的优化器去加速执行的速度