Oracle SQL多版本VERSION_COUNT产生的可能性

Oracle数据库中执行的SQL,很多时候会因为种种原因产生多个不同的执行版本,一个游标的版本过多很容易引起数据库的性能问题,甚至故障。

有时候一个SQL的版本数量可能多达数万个,以下是我之前在恩墨讲堂分享过的一个案例。

产生SQL多版本的原因很多,通过如下的一些测试我们可以稍微来看看如何分析和找到可能的原因。

以下作为一个基础测试数据,一条基本的SQL查询:

create table t1(c1 int, c2 nvarchar2(100));

alter system flush shared_pool;

var b1 number;

var b2 varchar2(10);

exec :b1 := 1;

exec :b2 := '0';

select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

如果我们修改了优化器参数、环境变量、绑定变量等,都可能使得SQL发生重新解析,产生不同的子游标,也就是不同的VERSION。

SQL> set serveroutput on

SQL> set echo on

SQL> drop table t1 purge;

Table dropped.

SQL> create table t1(c1 int, c2 nvarchar2(100));

Table created.

SQL> alter system flush shared_pool;

System altered.

SQL> var b1 number;

SQL> var b2 varchar2(10);

SQL> exec :b1 := 1;

PL/SQL procedure successfully completed.

SQL> exec :b2 := '0';

PL/SQL procedure successfully completed.

SQL> select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

no rows selected

Rem 这里我们修改了NLS_SORT参数,再来查看SQL的游标数。

SQL> alter session set nls_sort = 'SCHINESE_RADICAL_M';

Session altered.

SQL> select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

no rows selected

SQL> exec shared_cursor('3yr4fwqux2buz')

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000088F64328

CHILD_NUMBER = 0

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000087AE2D38

CHILD_NUMBER = 1

LANGUAGE_MISMATCH = Y

--------------------------------------------------

REM 注意,以上第一个Child就是因为语言不匹配产生的(LANGUAGE_MISMATCH)

REM 以下修改了优化器模式,又一个新的子游标将会因此而产生。

SQL> alter session set optimizer_mode = first_rows;

Session altered.

SQL> select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

no rows selected

SQL> exec shared_cursor('3yr4fwqux2buz')

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000088F64328

CHILD_NUMBER = 0

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000087AE2D38

CHILD_NUMBER = 1

LANGUAGE_MISMATCH = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 000000008A1B2678

CHILD_NUMBER = 2

OPTIMIZER_MODE_MISMATCH = Y

--------------------------------------------------

REM 可以看到,第二个子游标是因为优化器模式不匹配产生的,OPTIMIZER_MODE_MISMATCH.

REM 以下步骤,我们绑定了不同长度的绑定变量,由此又可能产生新的SQL版本。

SQL> var b2 varchar2(2000);

SQL> exec :b2 := '0';

PL/SQL procedure successfully completed.

SQL> select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

no rows selected

SQL> exec shared_cursor('3yr4fwqux2buz')

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000088F64328

CHILD_NUMBER = 0

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000087AE2D38

CHILD_NUMBER = 1

LANGUAGE_MISMATCH = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 000000008A1B2678

CHILD_NUMBER = 2

OPTIMIZER_MODE_MISMATCH = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 00000000876C6E38

CHILD_NUMBER = 3

BIND_LENGTH_UPGRADEABLE = Y

--------------------------------------------------

REM 我们看到的第三个子游标就是因为绑定变量长度不同而产生的。

从Oracle 9i开始,Oracle对中文语言方式(Simplified Chinese和Traditional Chinese)提供了多种排序方式。主要由以下四种,大家可以进行修改尝试:

SCHINESE_RADICAL_M 针对简体中文,按照部首(第一顺序)、笔划(第二顺序)排序

SCHINESE_STROKE_M 针对简体中文,按照笔划(第一顺序)、部首(第二顺序)排序

SCHINESE_PINYIN_M 针对简体中文,按照拼音排序

TCHINESE_RADICAL_M 针对繁体中文,按照部首(第一顺序)、笔划(第二顺序)排序

TCHINESE_STROKE_M 针对繁体中文,按照笔划(第一顺序)、部首(第二顺序)排序

当然可以逐一尝试:

SQL> alter session set nls_sort = 'TCHINESE_RADICAL_M';

Session altered.

SQL> select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2;

no rows selected

SQL> exec shared_cursor('3yr4fwqux2buz')

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000088F64328

CHILD_NUMBER = 0

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000087AE2D38

CHILD_NUMBER = 1

LANGUAGE_MISMATCH = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 000000008A1B2678

CHILD_NUMBER = 2

OPTIMIZER_MODE_MISMATCH = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 00000000876C6E38

CHILD_NUMBER = 3

BIND_LENGTH_UPGRADEABLE = Y

--------------------------------------------------

SQL_TEXT = select /* test */ * from t1 where c1 = :b1 and c2 = :b2 order by c2

SQL_ID = 3yr4fwqux2buz

ADDRESS = 0000000088361678

CHILD_ADDRESS = 0000000087AD8AB0

CHILD_NUMBER = 4

LANGUAGE_MISMATCH = Y

--------------------------------------------------

以上测试是基于11.2.0.3版本,在Oracle 12c中,相关的可能因素已经多达64个,参考官方手册可以了解 V$SQL_SHARED_CURSOR 的更详细信息。

文中用到的shared_cursor存储过程脚本列举如下:

create or replace PROCEDURE shared_cursor(

p_sqlid IN VARCHAR2 ) AUTHID CURRENT_USER

IS

l_theCursor NUMBER;

col_cnt NUMBER;

col_rec dbms_sql.desc_tab;

col_value VARCHAR2(4000);

ret_val NUMBER;

BEGIN

l_theCursor := dbms_sql.open_cursor;

dbms_sql.parse(l_theCursor, 'select sql.sql_text, cur.*

from v$sql_shared_cursor cur, v$sql sql

where cur.sql_id = sql.sql_id

and cur.child_number = sql.child_number

and sql.sql_id = :p_sqlid', dbms_sql.native);

dbms_sql.bind_variable( l_theCursor, ':p_sqlid', p_sqlid );

dbms_sql.describe_columns(l_theCursor, col_cnt, col_rec);

FOR idx IN 1 .. col_cnt

LOOP

dbms_sql.define_column(l_theCursor, idx, col_value, 4000);

END LOOP;

ret_val := dbms_sql.execute(l_theCursor);

WHILE(dbms_sql.fetch_rows(l_theCursor) > 0)

LOOP

FOR idx IN 1 .. col_cnt

LOOP

dbms_sql.column_value(l_theCursor, idx, col_value);

IF col_rec(idx).col_name IN ('SQL_ID', 'ADDRESS', 'CHILD_ADDRESS', 'CHILD_NUMBER', 'SQL_TEXT') THEN

dbms_output.put_line(rpad(col_rec(idx).col_name, 30) || ' = ' || col_value);

elsif col_value = 'Y' THEN

dbms_output.put_line(rpad(col_rec(idx).col_name, 30) || ' = ' || col_value);

END IF;

END LOOP;

dbms_output.put_line('--------------------------------------------------');

END LOOP;

dbms_sql.close_cursor(l_theCursor);

END;

转引Oracle 12.1的V$SQL_SHARED_CURSOR说明,列举如下,供参考。

V$SQL_SHARED_CURSOR explains why a particular child cursor is not shared with existing child cursors. Each column identifies a specific reason why the cursor cannot be shared.

ColumnDatatypeDescription

SQL_ID

VARCHAR2(13)

SQL identifier

ADDRESS

RAW(4 | 8)

Address of the parent cursor

CHILD_ADDRESS

RAW(4 | 8)

Address of the child cursor

CHILD_NUMBER

NUMBER

Child number

UNBOUND_CURSOR

VARCHAR2(1)

(Y|N) The existing child cursor was not fully built (in other words, it was not optimized)

SQL_TYPE_MISMATCH

VARCHAR2(1)

(Y|N) The SQL type does not match the existing child cursor

OPTIMIZER_MISMATCH

VARCHAR2(1)

(Y|N) The optimizer environment does not match the existing child cursor

OUTLINE_MISMATCH

VARCHAR2(1)

(Y|N) The outlines do not match the existing child cursor

STATS_ROW_MISMATCH

VARCHAR2(1)

(Y|N) The existing statistics do not match the existing child cursor

LITERAL_MISMATCH

VARCHAR2(1)

(Y|N) Non-data literal values do not match the existing child cursor

FORCE_HARD_PARSE

VARCHAR2(1)

(Y|N) For internal use

EXPLAIN_PLAN_CURSOR

VARCHAR2(1)

(Y|N) The child cursor is an explain plan cursor and should not be shared

BUFFERED_DML_MISMATCH

VARCHAR2(1)

(Y|N) Buffered DML does not match the existing child cursor

PDML_ENV_MISMATCH

VARCHAR2(1)

(Y|N) PDML environment does not match the existing child cursor

INST_DRTLD_MISMATCH

VARCHAR2(1)

(Y|N) Insert direct load does not match the existing child cursor

SLAVE_QC_MISMATCH

VARCHAR2(1)

(Y|N) The existing child cursor is a slave cursor and the new one was issued by the coordinator (or, the existing child cursor was issued by the coordinator and the new one is a slave cursor)

TYPECHECK_MISMATCH

VARCHAR2(1)

(Y|N) The existing child cursor is not fully optimized

AUTH_CHECK_MISMATCH

VARCHAR2(1)

(Y|N) Authorization/translation check failed for the existing child cursor

BIND_MISMATCH

VARCHAR2(1)

(Y|N) The bind metadata does not match the existing child cursor

DESCRIBE_MISMATCH

VARCHAR2(1)

(Y|N) The typecheck heap is not present during the describe for the child cursor

LANGUAGE_MISMATCH

VARCHAR2(1)

(Y|N) The language handle does not match the existing child cursor

TRANSLATION_MISMATCH

VARCHAR2(1)

(Y|N) The base objects of the existing child cursor do not match

BIND_EQUIV_FAILURE

VARCHAR2(1)

(Y|N) The bind value's selectivity does not match that used to optimize the existing child cursor

INSUFF_PRIVS

VARCHAR2(1)

(Y|N) Insufficient privileges on objects referenced by the existing child cursor

INSUFF_PRIVS_REM

VARCHAR2(1)

(Y|N) Insufficient privileges on remote objects referenced by the existing child cursor

REMOTE_TRANS_MISMATCH

VARCHAR2(1)

(Y|N) The remote base objects of the existing child cursor do not match

LOGMINER_SESSION_MISMATCH

VARCHAR2(1)

(Y|N) LogMiner Session parameters mismatch

INCOMP_LTRL_MISMATCH

VARCHAR2(1)

(Y|N) Cursor might have some binds (literals) which may be unsafe/non-data. Value mismatch.

OVERLAP_TIME_MISMATCH

VARCHAR2(1)

(Y|N) Mismatch caused by setting session parameter ERROR_ON_OVERLAP_TIME

EDITION_MISMATCH

VARCHAR2(1)

(Y|N) Cursor edition mismatch

MV_QUERY_GEN_MISMATCH

VARCHAR2(1)

(Y|N) Internal, used to force a hard-parse when analyzing materialized view queries

USER_BIND_PEEK_MISMATCH

VARCHAR2(1)

(Y|N) Cursor is not shared because value of one or more user binds is different and this has a potential to change the execution plan

TYPCHK_DEP_MISMATCH

VARCHAR2(1)

(Y|N) Cursor has typecheck dependencies

NO_TRIGGER_MISMATCH

VARCHAR2(1)

(Y|N) Cursor and child have no trigger mismatch

FLASHBACK_CURSOR

VARCHAR2(1)

(Y|N) Cursor non-shareability due to flashback

ANYDATA_TRANSFORMATION

VARCHAR2(1)

(Y|N) Is criteria for opaque type transformation and does not match

PDDL_ENV_MISMATCH

VARCHAR2(1)

(Y|N) Environment setting mismatch for parallel DDL cursor (that is, one or more of the following parameter values have changed: PARALLEL_EXECUTION_ENABLED, PARALLEL_DDL_MODE, PARALLEL_DDL_FORCED_DEGREE, orPARALLEL_DDL_FORCED_INSTANCES)

TOP_LEVEL_RPI_CURSOR

VARCHAR2(1)

(Y|N) Is top level RPI cursor

DIFFERENT_LONG_LENGTH

VARCHAR2(1)

(Y|N) Value of LONG does not match

LOGICAL_STANDBY_APPLY

VARCHAR2(1)

(Y|N) Logical standby apply context does not match

DIFF_CALL_DURN

VARCHAR2(1)

(Y|N) If Slave SQL cursor/single call

BIND_UACS_DIFF

VARCHAR2(1)

(Y|N) One cursor has bind UACs and one does not

PLSQL_CMP_SWITCHS_DIFF

VARCHAR2(1)

(Y|N) PL/SQL anonymous block compiled with different PL/SQL compiler switches

CURSOR_PARTS_MISMATCH

VARCHAR2(1)

(Y|N) Cursor was compiled with subexecution (cursor parts were executed)

STB_OBJECT_MISMATCH

VARCHAR2(1)

(Y|N) STB is an internal name for a SQL Management Object Mismatch. A SQL Management Object Mismatch means that either a SQL plan baseline, or a SQL profile, or a SQL patch has been created for your SQL statement between the executions. Because a cursor is a read-only entity, a hard parse is forced to be able to create a new cursor that contains information about the new SQL management object related to this SQL statement.

CROSSEDITION_TRIGGER_MISMATCH

VARCHAR2(1)

(Y|N) The set of crossedition triggers to execute might differ

PQ_SLAVE_MISMATCH

VARCHAR2(1)

(Y|N) Top-level slave decides not to share cursor

TOP_LEVEL_DDL_MISMATCH

VARCHAR2(1)

(Y|N) Is top-level DDL cursor

MULTI_PX_MISMATCH

VARCHAR2(1)

(Y|N) Cursor has multiple parallelizers and is slave-compiled

BIND_PEEKED_PQ_MISMATCH

VARCHAR2(1)

(Y|N) Cursor based around bind peeked values

MV_REWRITE_MISMATCH

VARCHAR2(1)

(Y|N) Cursor needs recompilation because an SCN was used during compile time due to being rewritten by materialized view

ROLL_INVALID_MISMATCH

VARCHAR2(1)

(Y|N) Marked for rolling invalidation and invalidation window exceeded

OPTIMIZER_MODE_MISMATCH

VARCHAR2(1)

(Y|N) Parameter OPTIMIZER_MODE mismatch (for example, all_rows versus first_rows_1)

PX_MISMATCH

VARCHAR2(1)

(Y|N) Mismatch in one parameter affecting the parallelization of a SQL statement. For example, one cursor was compiled with parallel DML enabled while the other was not.

MV_STALEOBJ_MISMATCH

VARCHAR2(1)

(Y|N) Cursor cannot be shared because there is a mismatch in the list of materialized views which were stale when the cursor was built

FLASHBACK_TABLE_MISMATCH

VARCHAR2(1)

(Y|N) Cursor cannot be shared because there is a mismatch with triggers being enabled and/or referential integrity constraints being deferred

LITREP_COMP_MISMATCH

VARCHAR2(1)

(Y|N) Mismatch in use of literal replacement

PLSQL_DEBUG

VARCHAR2(1)

(Y|N) Value of the PLSQL_DEBUG parameter for the current session does not match the value used to build the cursor

LOAD_OPTIMIZER_STATS

VARCHAR2(1)

(Y|N) A hard parse is forced to initialize extended cursor sharing

ACL_MISMATCH

VARCHAR2(1)

(Y|N) Cached ACL evaluation result stored in the child cursor is not valid for the current session or user

FLASHBACK_ARCHIVE_MISMATCH

VARCHAR2(1)

(Y|N) Value of the FLASHBACK_DATA_ARCHIVE_INTERNAL_CURSOR parameter for the current session does not match the value used to build the cursor

LOCK_USER_SCHEMA_FAILED

VARCHAR2(1)

(Y|N) User or schema used to build the cursor no longer exists

Note: This sharing criterion is deprecated

REMOTE_MAPPING_MISMATCH

VARCHAR2(1)

(Y|N) Reloaded cursor was previously remote-mapped and is currently not remote-mapped. Therefore, the cursor must be reparsed.

LOAD_RUNTIME_HEAP_FAILED

VARCHAR2(1)

(Y|N) Loading of run-time heap for the new cursor (or reload of aged out cursor) failed

HASH_MATCH_FAILED

VARCHAR2(1)

(Y|N) No existing child cursors have the unsafe literal bind hash values required by the current cursor

PURGED_CURSOR

VARCHAR2(1)

(Y|N) Child cursor is marked for purging

BIND_LENGTH_UPGRADEABLE

VARCHAR2(1)

(Y|N) Bind length(s) required for the current cursor are longer than the bind length(s) used to build the child cursor

USE_FEEDBACK_STATS

VARCHAR2(1)

(Y|N) A hard parse is forced so that the optimizer can reoptimize the query with improved optimizer inputs (for example, cardinality estimates)

REASON

CLOB

Child number, id, and reason the cursor is not shared. The content of this column is structured using XML.

CON_ID

NUMBER

The ID of the container to which the data pertains. Possible values include:

0: This value is used for rows containing data that pertain to the entire CDB. This value is also used for rows in non-CDBs.

1: This value is used for rows containing data that pertain to only the root

n: Where n is the applicable container ID for the rows containing data

By eygle on 2015-09-25 13:21 |

Comments (0) |

HowTo | 3184 |

window多个oracle查版本,Oracle SQL多版本VERSION_COUNT产生的可能性相关推荐

  1. windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 此操作系统不支持此版本的 SQL Server 版本...

    windows server 2008 R2 SP1 安装SQL Server 2008 R2时提示 "此操作系统不支持此版本的 SQL Server 版本" 原因: 安装的时候输 ...

  2. sqlserver 高版本数据倒到低版本 不同SQL Server版本间的数据库恢复问题

    1:通过管理器的脚本生成向导,把数据库,表,存储过程等对象的脚本生成,然后在低版本的SQL Server下执行建立这些对象. 2:通过DTS/SSIS,将表中的数据导过去. 参考:不同SQL Serv ...

  3. oracle查视图的sql,oracle通过v$sql视图查询sql的平均执行时间(代码实例)

    oracle通过v$sql视图查询sql的平均执行时间(代码实例) select sql_text,executions 总执行次数,elapsed_time/1000 总耗时(秒), elapsed ...

  4. oracle查sysdate,oracle sysdate 时间整理

    一.获取oracle日期中的年份 在Oracle中,要获得日期中的年份,例如把sysdate中的年份取出来,并不是一件难事.常用的方法是: Select to_number(to_char(sysda ...

  5. oracle查sysdate,oracle查询有关sysdate和to_date的用法

    在Oracle数据库中,Oracle to_date()函数是我们经常使用的函数,下面就为您详细介绍Oracle to_date()函数的用法 to_date()与24小时制表示法及mm分钟的显示: ...

  6. oracle查效能,Oracle 11g物理Active Data Guard实时查询(Real-time query)特性

    table t (x varchar2(8)); Table created. secooler@ora11g> insert into t values ('Secooler'); 1 row ...

  7. oracle查sysdate,Oracle 日期查询语句小结

    查询星期几: select to_char(sysdate,'day') from dual; 查询几号: select to_char(sysdate,'dd') from dual; 查询小时数: ...

  8. oracle查tigger,Oracle Tigger触发器 范例

    --实例1------------------------ --创建触发器,当用户对test表执行DML语句时,将相关信息记录到日志表 --创建测试表 CREATE TABLE test ( t_id ...

  9. Oracle SQL 高版本相关

    本文翻译自Troubleshooting: High Version Count Issues (文档 ID 296377.1),有删改 主要内容: 什么是高版本问题 什么是共享SQL? 什么是&qu ...

  10. oracle oaf界面个性化,个性化EBS标准OAF页面(EO,+SQL全版本).doc

    个性化EBS标准OAF页面(EO,SQL全版本) 个性化EBS标准OAF页面 目录 个性化EBS标准OAF页面1 目录1 替换VO添加客户化属性(VO基于EO的版本)3 实例背景3 本例的页面:3 E ...

最新文章

  1. mc服务器村民交易修改,【原创】【教程】MCPE自定义村民交易内容
  2. bzoj 3512: DZY Loves Math IV【欧拉函数+莫比乌斯函数+杜教筛】
  3. Redhat 6.2安装Oracle 11gclient及遇到的问题分析
  4. Spring简化Java开发_spring如何简化java开发
  5. Java安全(一) : java类 | 反射
  6. 基于流程管理,提高工作质量和效率
  7. no valid Qt versions found
  8. html5基础--audio标签元素
  9. OpenShift 4 之 Hello-OpenShift
  10. 如何用活字格定制监狱管理系统
  11. 认知-认知水平:认知水平
  12. 几个国内的 apple 相关社区
  13. 360极速浏览器查看保存密码的操作步骤
  14. 【Ubuntu系统下百度Apollo7.0与LGSVL2021.3联合教程(亲测有效)】
  15. 购买的随身WiFi扣卡日记-拆掉内置的esim流量卡
  16. CSDN写文章MarkDown用到的表情包收集(转自Github)
  17. 谷歌2018博士生奖研金名单出炉,清华、上交大多人入选
  18. JAVA语言程序设计教程张席_Java语言程序设计教程
  19. 使用Github管理项目
  20. 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)

热门文章

  1. vmware+player+12+linux,Vmware player 12
  2. c语言怎样设计程序界面,「分享」C语言如何编写图形界面
  3. mariadb mysql同步_MySQL/MariaDB主主数据同步配置
  4. 刚接触mybatis,很容易分不清#{id}和#{param1}的使用情况,本篇文章详解了两者的作用以及使用情况
  5. python快速开发 数据管理网站_GitHub - AngelLiang/kingWeb: Python django后台快速开发框架...
  6. mybatis的mysql参数传递_Mybatis参数传递及返回类型
  7. Markdown插入代码
  8. REC Solar推出黑色多晶半切片PERC组件,已进入量产化
  9. kafka入门:简介、使用场景、设计原理
  10. JavaScript 学习笔记一 (入门篇)