一、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学习笔记【一】相关推荐

  1. 判断题:oracle自带的sql语言环境是pl/sql,Oracle之PL/SQL学习笔记之数据类型(三)

    Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到 ...

  2. vb.net调用oracle存储过程,vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc...

    vbnet2008连接oracle增删改查学习笔记(经典crud_含存储过程).doc 我的VBNETORACLE增删改查学习笔记(本源码在VBNET2008下测试通过)学习VBNET有一段时间了,之 ...

  3. Oracle之PL/SQL学习笔记之有名块练习

    2019独角兽企业重金招聘Python工程师标准>>> Oracle之PL/SQL学习笔记之有名块练习 存储过程案例: 案例1: 根据雇员姓名跟新雇员工资,如果雇员不存在输出没有该雇 ...

  4. oracle数据库基础知识总结,oracle数据库基础知识学习笔记

    oracle数据库基础知识学习笔记 一.oracle数据库类型: Char:  字符型(最大长度2000,定长.不足时以空格补充) Varchar2:字符型 最大长度 4000,变长,实际长度由存储的 ...

  5. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  6. oracle 百万记录 cache,学习笔记:通过案例深入学习In-Memory Database Cache 总结配置过程...

    天萃荷净 详细记录关于In-Memory Database Cache配置方法与使用案例 一.Oracle数据库创建相关用户和权限 1.创建timesten用户 store information a ...

  7. oracle 触发器登录,【学习笔记】Oracle触发器 实现指定用户登录oracle案例

    天萃荷净 触发器实现指定用户登录oracle,分享一篇关于Oracle数据库安全策略,通过Oracle触发器实现限定user用户登录Oracle数据库的方法 1.创建允许登录用户表 CREATE TA ...

  8. oracle数据库开多线程,学习笔记:Oracle表数据导入 DBA常用单线程插入 多线程插入 sql loader三种表数据导入案例...

    天萃荷净 oracle之数据导入,汇总开发DBA在向表中导入大量数据的案例,如:单线程向数据库中插入数据,多线程向数据表中插入数据,使用sql loader数据表中导入数据案例 1.Oracle数据库 ...

  9. oracle v$ 表,【学习笔记】Oralce视图 查找分析V$PARAMETER视图的基表

    天萃荷净 分享一篇关于查找分析V$PARAMETER视图的基表的案例方法 1.使用trace查找show parameter执行语句 alter session set events '10046 t ...

  10. 怎么恢复oracle的包,【学习笔记】使用dbms_backup_restore包恢复数据库

    天萃荷净 使用dbms_backup_restore包恢复数据库 Oracle提供了一个包:DBMS_BACKUP_RESTORE包是由dbmsbkrs.sql 和 prvtbkrs.plb 这两个脚 ...

最新文章

  1. Coin Slider
  2. LYVC揭秘硅谷核心基金圈投资游戏规则
  3. for each....in、for in、for of
  4. Codewars-Regex Password Validation(正则检验密码格式)
  5. 排序算法(2)----插入排序
  6. android 网络协议
  7. C++中数字和字符串的转换
  8. RedHat Enterprise Linux 7下安装 Oracle 12C
  9. AC双链路冷备份详解及配置原理
  10. python批量处理text_【RhinoPython】Rhino如何批量替换text 和Dot
  11. 机器学习 | 实战(二)Fashion-MNIST
  12. Python自省机制
  13. Java面试快问快答-Instrument机制
  14. 你真的理解devDependencies和dependencies区别吗?
  15. 阿里开发手册 学习 记忆 理解 表达 融会贯通
  16. 一千万数据,怎么快速查询
  17. python爬虫(四)cookie模拟登录和反反爬案例
  18. HDU 4009 Transfer water (最小树形图+虚根)
  19. 郑州大学计算机新媒体专业介绍,专业介绍:网络与新媒体专业
  20. 淘宝/天猫撸猫猫领喵币、京东全民营业领京豆二合一助手,自动完成双11任务,分享源码

热门文章

  1. 虚函数:多态的实现原理
  2. c 语言中虚方法有什么作用是什么,虚函数的作用?
  3. 报错:Parameter ‘XXX‘ implicitly has an ‘any‘ type.解决方法
  4. Python-声明变量
  5. Opencv(C++)笔记--模板匹配cv::matchTemplate()和最值计算cv::minMaxLoc()
  6. 操作系统基础知识用户态和内核态的区别
  7. InputStream (输入流) 与 OutputStream (输出流) 转换
  8. linux系统下的动态壁纸,桌面应用|动态壁纸给linux发行版添加活力背景
  9. Android:实现安卓小程序-记事本(备忘录)的开发
  10. Unity3D教程:播放视频的两种方式