【Oracle Hint】Oracle Hint学习笔记【一】
一、Oracle Hint的一些基本概念
Oracle数据库中的优化器又叫查询优化器(Query Optimizer)。
它是SQL分析和执行的优化工具,它负责生成、制定SQL的执行计划。
Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO)
RBO: Rule-Based Optimization 基于规则的优化器
CBO: Cost-Based Optimization 基于代价的优化器
CBO(基于代价的优化器)在绝大多数情况下它会选择正确的优化器,但有时它也会选择很差的执行计划。
在Oracle 中,通过为语句添加 Hints(提示)来实现干预优化器优化的目的。
Oracle Hints的语法:
{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */
或者
{DELETE|INSERT|SELECT|UPDATE} --+ hint [text] [hint[text]]...
- Hints只应用在它们所在sql语句块(statement block,由select、update、delete关键字标识)上,对其它SQL语句或语句的其它部分没有影响。如:对于使用union操作的2个sql语句,如果只在一个sql语句上有Hints,则该Hints不会影响另一个sql语句。
- “+”号表示该注释是一个Hints,该加号必须立即跟在”/*”的后面,中间不能有空格。
- "hint"是下面介绍的具体提示之一,如果包含多个提示,则每个提示之间需要用一个或多个空格隔开。
- 如果在查询中指定了表别名,那么提示必须也使用表别名。
Hint的分类 | 常见Hint关键字 | |
---|---|---|
1 | 优化器模式 | ALL_ROWS(CBO)、FIRST_ROWS(CBO)、RULE(RBO) |
2 | 访问路径(是全表扫描,还是索引扫描) | FULL、INDEX、NO_INDEX、INDEX_JOIN等 |
3 | 表之间的连接类型 | HASH JOIN 、MERGE JOIN 、NESTED LOOP |
4 | 表之间的连接顺序 | USE_MERGE、USE_NL、USE_HASH |
5 | 语句的并行程度 | PARALLEL、FACT 、NO_FACT、 MERGE 、NO_MERGE等 |
二、表之间的连接类型
1. NESTED LOOP 一般用在连接的表中有索引,并且索引选择性较好的时候
对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择。在嵌套循环中,内表被外表驱动,外表返回的每一行都要在内表中检索找到与它匹配的行,因此整个查询返回的结果集不能太大(大于1 万不适合),要把返回子集较小表的作为外表(CBO 默认外表是驱动表),而且在内表的连接字段上一定要有索引。
可以用ORDERED 提示来改变CBO默认的驱动表,使用USE_NL(table_name1 table_name2)强制CBO 执行嵌套循环连接。
USE_NL(A B) 内外表,由form后的表顺序决定,存在LOADING时,以LOADING指定为准
USE_NL(A) A为内表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ya9Z9MOn-1643026474562)(Oracle Hint学习笔记.assets/1642989717081.png)]
2. HASH JOIN 一般用在两个表的数据量差别很大的时候
散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(或数据源)利用连接键在内存中建立散列表,然后扫描较大的表并探测散列表,找出与散列表匹配的行。
这种方式适用于较小的表完全可以放于内存中的情况,这样总成本就是访问两个表的成本之和。但是在表很大的情况下并不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。
可以用USE_HASH(table_name1 table_name2)提示来强制使用散列连接。使用散列连接HASH_AREA_SIZE 初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理。
Hash Join的执行计划第1个是hash表(build table),第2个探查表(probe table),一般不叫内外表,nested loop才有内外表
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mjG0MQEo-1643026474564)(Oracle Hint学习笔记.assets/1359475771_5689.png)]
3. SORT MERGE JOIN 用在没有索引,并且数据已经排序的情况
merge join需要首先对两个表按照关联的字段进行排序,分别从两个表中取出一行数据进行匹配,如果合适放入结果集;不匹配将较小的那行丢掉继续匹配另一个表的下一行,依次处理直到将两表的数据取完。merge join的很大一部分开销花在排序上,也是同等条件下差于hash join的一个主要原因。可以使用USE_MERGE(table_name1 table_name2)来强制使用排序合并连接.
其他关键字说明
LEADING 在一个多表关联的查询中,该Hint指定由哪个表作为驱动表,告诉优化器首先要访问哪个表上的数据。
select /*+leading(t1,t) */ * from scott.dept t,scott.emp t1 where t.deptno=t1.deptno;
ORDERED 按照From后面的表的顺序来选择驱动表,Oracle 建议在选择驱动表上使用Leading,它更灵活一些。
三、实际执行测试
1.NESTED LOOP
1.1 oracle 使用use_nl(a b)时,顺序use_nl(a b) use_nl(b a) 不会影响执行计划
1.2 ordered use_nl(a) 强制指定内表,括号中的表一定为内表(数据量大的表)
1.3 ordered use_nl(a b) 强制指定内外表,如果没有join,from后的第一个表为外表,第二个表为内表
ordered use_nl(a b) 强制指定内外表,如果有join,左连接时左表为外表,
右连接时右表为外表,
内连接时第一个表为外表,
外连接时,分别以第一\二个表为外表,做一次union
1.4 LEADING(a) 强制指定外表(驱动表)
建表sql
--drop table tmpa;
--drop table tmpb;
create table tmpa as select rownum a, object_id b, OBJECT_NAME c from DBA_objects where rownum<=10000;
create table tmpb as select rownum a, object_id b, OBJECT_NAME c from DBA_objects where rownum<=10;
CREATE UNIQUE INDEX tmpa_idx_1 ON tmpa (a,b);
CREATE UNIQUE INDEX tmpb_idx_1 ON tmpa (a,b);
1.1 use_nl(a b) 、use_nl(b a)
SELECT /*+use_nl(a b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+use_nl(b a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 2 | 1 | 26 |
SELECT /*+use_nl(a b) */ * FROM tmpb b LEFT JOIN tmpa a on b.a =a.a ;
SELECT /*+use_nl(b a) */ * FROM tmpb b LEFT JOIN tmpa a on b.a =a.a ;
SELECT /*+use_nl(b a) */ * FROM tmpa a RIGHT JOIN tmpb b ON b.a =a.a ;
SELECT /*+use_nl(a b) */ * FROM tmpa a RIGHT JOIN tmpb b ON b.a =a.a ;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 2 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
SELECT /*+use_nl(b a) */ * FROM tmpa a LEFT JOIN tmpb b ON b.a =a.a ;
SELECT /*+use_nl(a b) */ * FROM tmpa a LEFT JOIN tmpb b ON b.a =a.a ;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 10858 | 10000 | 400000 | |
NESTED LOOPS (OUTER) | [NULL] | 10858 | 10000 | 400000 | |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 1 | 1 | 14 |
1.2 ordered use_nl(a) 强制指定驱动表
SELECT /*+ordered use_nl(a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN | [NULL] | 18 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
SELECT /*+ordered use_nl(b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 10858 | 10 | 400 | |
NESTED LOOPS | [NULL] | 10858 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 1 | 1 | 14 |
SELECT /*+ordered use_nl(a) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 2 | 1 | 26 |
SELECT /*+ordered use_nl(b) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS | [NULL] | 3 | 0 | 0 | |
STATISTICS COLLECTOR | [NULL] | 3 | 0 | 0 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 0 | 0 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 15 | 1 | 26 |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
SELECT /*+ordered use_nl(a) */ * FROM tmpa a RIGHT join tmpb b on a.a = b.a;
SELECT /*+ordered use_nl(a) */ * FROM tmpb b left join tmpa a on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 2 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
SELECT /*+ordered use_nl(b) */ * FROM tmpa a RIGHT join tmpb b on a.a = b.a;
SELECT /*+ordered use_nl(b) */ * FROM tmpb b left join tmpa a on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN (OUTER) | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 18 | 10 | 400 | |
STATISTICS COLLECTOR | [NULL] | 3 | 0 | 0 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 15 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 0 | 0 | 0 |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
1.3 ordered use_nl(a b)
SELECT /*+ordered use_nl(a b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+ordered use_nl(b a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 10858 | 10 | 400 | |
NESTED LOOPS | [NULL] | 10858 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 1 | 1 | 14 |
SELECT /*+ordered use_nl(a b) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
SELECT /*+ordered use_nl(b a) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 2 | 1 | 26 |
SELECT /*+ordered use_nl(a b) */ * FROM tmpa a RIGHT join tmpb b on a.a = b.a;
SELECT /*+ordered use_nl(b a) */ * FROM tmpa a RIGHT join tmpb b on a.a = b.a;
SELECT /*+ordered use_nl(a b) */ * FROM tmpb b left join tmpa a on a.a = b.a;
SELECT /*+ordered use_nl(b a) */ * FROM tmpb b left join tmpa a on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 2 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
1.4 LEADING 指定驱动表
SELECT /*+LEADING(a) use_nl(b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(a) use_nl(b) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
SELECT /*+LEADING(a) use_nl(b,a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(a) use_nl(a,b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(a) use_nl(b,a) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
SELECT /*+LEADING(a) use_nl(a,b) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 10858 | 10 | 400 | |
NESTED LOOPS | [NULL] | 10858 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 1 | 1 | 14 |
SELECT /*+LEADING(b) use_nl(a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(b) use_nl(a) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
SELECT /*+LEADING(b) use_nl(a,b) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(b) use_nl(b,a) */ * FROM tmpa a, tmpb b WHERE a.a = b.a;
SELECT /*+LEADING(b) use_nl(b,a) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
SELECT /*+LEADING(b) use_nl(a,b) */ * FROM tmpb b, tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
NESTED LOOPS | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 2 | 1 | 26 |
--此时没生效 仍然以b为外部表
SELECT /*+LEADING(a) use_nl(b) */ * FROM tmpa a RIGHT JOIN tmpb b on a.a = b.a;
SELECT /*+LEADING(a) use_nl(b) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN (OUTER) | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 18 | 10 | 400 | |
STATISTICS COLLECTOR | [NULL] | 3 | 0 | 0 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 15 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 0 | 0 | 0 |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
SELECT /*+LEADING(b) use_nl(a) */ * FROM tmpa a RIGHT JOIN tmpb b on a.a = b.a;
SELECT /*+LEADING(b) use_nl(a) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 23 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 23 | 10 | 400 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 2 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 1 | 1 | 0 |
2. HASH JOIN
2.1hash_join(a) hash_join(a,b)
SELECT /*+hash_join(a) */ * FROM tmpb b , tmpa a WHERE a.a = b.a;
SELECT /*+hash_join(b) */ * FROM tmpb b , tmpa a WHERE a.a = b.a;
SELECT /*+hash_join(a,b) */ * FROM tmpb b , tmpa a WHERE a.a = b.a;
SELECT /*+hash_join(b,a) */ * FROM tmpb b , tmpa a WHERE a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS | [NULL] | 3 | 0 | 0 | |
STATISTICS COLLECTOR | [NULL] | 3 | 0 | 0 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 0 | 0 | 0 |
TABLE ACCESS (BY INDEX ROWID) | TMPA | ANALYZED | 15 | 1 | 26 |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
SELECT /*+hash_join(a) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
SELECT /*+hash_join(b) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
SELECT /*+hash_join(a) */ * FROM tmpa a right JOIN tmpb b on a.a = b.a;
SELECT /*+hash_join(b) */ * FROM tmpa a right JOIN tmpb b on a.a = b.a;
SELECT /*+hash_join(a,b) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
SELECT /*+hash_join(a,b) */ * FROM tmpa a right JOIN tmpb b on a.a = b.a;
SELECT /*+hash_join(b,a) */ * FROM tmpb b left JOIN tmpa a on a.a = b.a;
SELECT /*+hash_join(b,a) */ * FROM tmpa a right JOIN tmpb b on a.a = b.a;
操作 | 对象 | 优化器 | 成本 | 基数 | 字节 |
---|---|---|---|---|---|
SELECT STATEMENT | ALL_ROWS | 18 | 10 | 400 | |
HASH JOIN (OUTER) | [NULL] | 18 | 10 | 400 | |
NESTED LOOPS (OUTER) | [NULL] | 18 | 10 | 400 | |
STATISTICS COLLECTOR | [NULL] | 3 | 0 | 0 | |
TABLE ACCESS (FULL) | TMPB | ANALYZED | 3 | 10 | 140 |
TABLE ACCESS (BY INDEX ROWID BATCHED) | TMPA | ANALYZED | 15 | 1 | 26 |
INDEX (RANGE SCAN) | TMPA_IDX_1 | ANALYZED | 0 | 0 | 0 |
TABLE ACCESS (FULL) | TMPA | ANALYZED | 15 | 10000 | 260000 |
待补充
3. SORT MERGE JOIN
待补充
附录
环境说明:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.10.0.0.0
【Oracle Hint】Oracle Hint学习笔记【一】相关推荐
- 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)
Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...
- vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...
vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...
- Oracle之PL/SQL学习笔记之有名块练习
2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...
- oracle数据库基础知识总结,oracle数据库基础知识学习笔记
oracle数据库基础知识学习笔记 一.oracle数据库类型: Char: 字符型(最大长度2000,定长.不足时以空格补充) Varchar2:字符型 最大长度 4000,变长,实际长度由存储的 ...
- oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...
天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...
- oracle 百万记录 cache,学习笔记:通过案例深入学习In-Memory Database Cache 总结配置过程...
天萃荷净 详细记录关于In-Memory Database Cache配置方法与使用案例 一.Oracle数据库创建相关用户和权限 1.创建timesten用户 store information a ...
- oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例
天萃荷净 触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法 1.创建允许登录用户表 CREATE TA ...
- oracle数据库开多线程,学习笔记:Oracle表数据导入 DBA常用单线程插入 多线程插入 sql loader三种表数据导入案例...
天萃荷净 oracle之数据导入,汇总开发DBA在向表中导入大量数据的案例,如:单线程向数据库中插入数据,多线程向数据表中插入数据,使用sql loader数据表中导入数据案例 1.Oracle数据库 ...
- oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表
天萃荷净 分享一篇关于查找分析V$PARAMETER视图的基表的案例方法 1.使用trace查找show parameter执行语句 alter session set events '10046 t ...
- 怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库
天萃荷净 使用dbms_backup_restore包恢复数据库 Oracle提供了一个包:DBMS_BACKUP_RESTORE包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚 ...
最新文章
- Coin Slider
- LYVC揭秘硅谷核心基金圈投资游戏规则
- for each....in、for in、for of
- Codewars-Regex Password Validation(正则检验密码格式)
- 排序算法(2)----插入排序
- android 网络协议
- C++中数字和字符串的转换
- RedHat Enterprise Linux 7下安装 Oracle 12C
- AC双链路冷备份详解及配置原理
- python批量处理text_【RhinoPython】Rhino如何批量替换text 和Dot
- 机器学习 | 实战(二)Fashion-MNIST
- Python自省机制
- Java面试快问快答-Instrument机制
- 你真的理解devDependencies和dependencies区别吗?
- 阿里开发手册 学习 记忆 理解 表达 融会贯通
- 一千万数据,怎么快速查询
- python爬虫(四)cookie模拟登录和反反爬案例
- HDU 4009 Transfer water (最小树形图+虚根)
- 郑州大学计算机新媒体专业介绍,专业介绍:网络与新媒体专业
- 淘宝/天猫撸猫猫领喵币、京东全民营业领京豆二合一助手,自动完成双11任务,分享源码
热门文章
- 虚函数:多态的实现原理
- c 语言中虚方法有什么作用是什么,虚函数的作用?
- 报错:Parameter ‘XXX‘ implicitly has an ‘any‘ type.解决方法
- Python-声明变量
- Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()
- 操作系统基础知识用户态和内核态的区别
- InputStream (输入流) 与 OutputStream (输出流) 转换
- linux系统下的动态壁纸,桌面应用|动态壁纸给linux发行版添加活力背景
- Android:实现安卓小程序-记事本(备忘录)的开发
- Unity3D教程:播放视频的两种方式