第一篇

执 行 计 划

执行计划是指示Oracle如何获取和过滤数据、产生最终结果集,是影响SQL语句执行性能的关键因素。我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行计划。

在深入了解执行计划之前,我们先了解SQL语句的处理执行过程。当一条语句提交到Oracle后,SQL引擎会分为三个步骤对其处理和执行:解析(Parse)、执行(Execute)和获取(Fetch),分别由SQL引擎的不同组件完成。SQL引擎的组件如图1-1所示。

1. SQL编译器(SQL Compiler)

将语句编译到一个共享游标中。SQL编译器由解析器(Parser)、查询优化器(Query Optimizer)和行源生成器(Row Source Generator)组成。

q 解析器(Parser)—执行对SQL语句的语法、语义分析,将查询中的视图展开、划分为小的查询块。

q 查询优化器(Query Optimizer)—为语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(Plan Generator)生成计划,比较计划的代价,最终选择选择一个代价最小的计划。查询优化器由查询转换器(Query Transform)、代价估算器(Estimator)和计划生成器(Plan Generator)组成。

注意,上述优化器实际上指的是基于代价的优化器(Cost Based Optimizer,CBO),CBO也是当前采用的所有优化和调优技术的核心基础。

图1-1SQL引擎结构及其组件示意图

查询转换器(Query Transformer)—查询转换器决定是否重写用户的查询(包括视图合并、子查询反嵌套),以生成更好的查询计划。

代价估算器(Estimator)—代价估算器使用统计数据来估算操作的选择率(Selectivity)、返回数据集的势(Cardinality)和代价,并最终估算出整个执行计划的代价。

计划生成器(Plan Generator)—计划生成器会考虑可能的访问路径(Access Path)、关联方法和关联顺序,生成不同的执行计划,让查询优化器从这些计划中选择出代价最小的一个计划。

q 行源生成器(Row Source Generator)—行源生成器从优化器接收到优化的执行计划后,为该计划生成行源(Row Source)。行源是一个可被迭代控制的结构体,它能以迭代方式处理一组数据行、并生成一组数据行。

2. SQL执行引擎(SQL Execution Engine)

SQL执行引擎依照语句的执行计划进行操作,产生查询结果。在每一个操作中,SQL执行引擎会以迭代方式执行行源、生成数据行。

提示:当Oracle引入一些新的优化技术时,会出现一些新的组件,例如,SQL进化管理器(SPM)、SQL性能分析器(SPA)等,这些组件会与SQL引擎的组件融合,提供更好的优化和调优方法。

第1章生成和显示执行计划

任何一条SQL语句要正确运行并返回结果,SQL执行引擎都必须获得一个相应的执行计划。当缓存当中找不到与当前环境相匹配的执行计划时,SQL编译器会解析和生成一个相应的执行计划。已经生成的执行计划会驻留在缓存当中,直至其失效或者被清出缓存。

.  如果想要生成和显示一条语句的执行计划,方法有多种。大致上分为两类:从内存或者历史数据中读取曾经执行语句的执行计划;使用Explain Plan命令解析语句后,从表PLAN_TABLE获得生成的执行计划。

在本章中,我们将会了解到以下内容:

q 在Oracle中,SQL语句如何生成执行计划。

q 如何获取和显示SQL语句的执行计划。

1.1生成执行计划

在Oracle中,任何一条语句在解析过程中都会生成一个唯一的数值标识,即SQL_ID。而同一条语句,在解析过程中,可能会因为执行环境的改变(例如某些优化参数被改变)而生成多个版本的游标,不同的游标会有不同的执行计划。每个游标都会按顺序赋予一个序列号,即CHILD_NUMBER,一条语句生成的第一个游标的CHILD_NUMBER为0;相应的,Oracle会为每个执行计划生成一个哈希值以作区分。而多个不同版本的游标,其执行计划可能会相同,也可能不同。

因此,我们可以知道,一条合法的SQL语句在执行过后,在内存中最少会有一个执行计划与其游标相对应。当前实例内存(Library Cache)中的执行计划可以通过视图V$SQL_PLAN读取(RAC环境中,可以通过视图gv$sql_plan查看RAC当中其他实例上的执行计划)。在启用了自动负载知识库(Automatic Workload Repository,AWR,10g及以后版本),Oracle会将内存中的执行计划存储在历史数据当中,我们可以通过查询语句或者Oracle提供的包DBMS_XPLAN从历史数据中读取。此外,从10g开始,Oracle还提供一个自动优化工具DBMS_SQLTUNE对单个或一组语句进行自动优化,它可以在一段时间内捕捉内存中语句和执行计划来生成一组SQL集(或者称SQL调优集,SQL Tuning Set),我们同样可以从SQL集中读取和显示语句的执行计划。在11g当中,Oracle又引入了SQL执行计划管理(SQL Plan Management)的特性,可以将语句的一个或多个执行计划存储在一个执行计划基线(Plan Baseline)当中,我们同样可以读取基于执行计划基线生成的计划。

提示:AWR的历史数据、执行计划基线都是有保存期限的,可以通过相关参数设置。

除了通过执行SQL让Oracle处理引擎在内存中生成执行计划外,我们还可以通过命令Explain Plan让优化器仅对SQL语句进行解释,生成查询计划。由于语句并不会实际执行,因此它可以含有没有赋值的绑定变量。

执行Explain Plan命令后,Oracle会将解释生成的查询计划插入表SYS.PLAN_TABLE$(10g之前,表名为PLAN_TABLE;10g之后,通过公共同义词PLAN_TABLE指向SYS.PLAN_TABLE$)中。我们就可以通过查询语句或者Oracle提供的包DBMS_XPLAN从该表中读取查询计划。注意,通过Explain Plan解释出来的查询计划不会被缓存到内存中以便在语句执行时重用,我们在缓存当中看到的是类似“explain plan for [SQL]”的形式。

要注意的是,如果要解析语句的执行计划,用户必须拥有语句中对象及其依赖对象的权限。如果语句中存在视图,用户必须有对视图依赖表的查询权限。例如,当一个用户A基于表T创建了一个视图V,并将视图的查询权限赋予了用户B,那么用户B仅能通过视图查询表的数据,但无法直接调用Explain Plan命令解析基于该视图的查询的执行计划。

1.2显示执行计划

我们现在知道,有三个途径可以获取查询计划:v$sql_plan、dba_hist_sql_plan和PLAN_TABLE。如果需要读取一条SQL语句的执行计划,就需要知道该条语句的SQL_ID,如果该语句存在多个游标或者执行计划,则还需要知道游标的CHILD_NUMBER或计划的哈希值(可选)。而无论我们通过哪个途径来获取执行计划,显示方式主要是两种:语句查询和包DBMS_XPLAN显示。

1.2.1通过查询语句显示计划

通过查询语句从一些视图里读出执行计划并作格式化输出的方法都非常相似,这里以v$sql_plan视图为例,示例程序见代码清单1-1。

代码清单1-1显示执行计划(查询语句)

HELLODBA.COM]col "Query Plan_Table" format a30

-- 提示:SQL_ID可以从视图v$sql_text和dba_hist_sqltext(或stats$sqltext)等视图中查询获得。

HELLODBA.COM]select id,lpad(' ', 2*(level-1))operation' 'options' '

2 object_name' 'decode(id, 0, 'Cost='cost) "Query Plan_Table"

3 from v$sql_plan

4 start with id = 0

5 and sql_id = 'dq7gjn1yrpcyz'

6 and plan_hash_value = 616708042

7 connect by prior id = parent_id

8 and sql_id = 'dq7gjn1yrpcyz'

9 and plan_hash_value = 616708042;

ID Query Plan_Table

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

0 SELECT STATEMENT Cost=2

1 TABLE ACCESS FULL T_USERS

1.2.2通过包DBMS_XPLAN显示计划

这个包可以根据我们选择的函数以及输入的参数来格式化显示相关的执行计划,在我们随后的内容中,主要会使用(也推荐读者使用)该工具显示执行计划。

DBMS_XPLAN含有5个函数用于输出格式化的执行计划,display、display_cursor、display_awr、display_sqlset和display_sql_plan_baseline,分别用于显示Explain Plan命令解释的计划、内存中的执行计划、AWR历史数据中的计划、SQL优化集中语句的计划、执行计划基线(关于SQL优化集和执行计划基线,我们会在后面第7章中具体介绍)。它们都是管道化表函数(Pipelined Table Function),返回的结果是一个系统自定义的集合数据类型dbms_xplan_type_table。我们可以通过表函数(Table)进行映射后进行查询。

1.2.2.1DISPLAY

DISPLAY函数用于显示存储在PLAN_TABLE中的执行计划,或与PLAN_TABLE拥有相同结构的表中的执行计划。此外,如果从视图v$sql_plan_statistics_all可以获得该执行计划的相关统计数据,DISPLAY也可以格式化输出这些数据。

参数描述:

q TABLE_NAME:存储查询计划的表名(不区分大小写),默认值为PLAN_TABLE。

q STATEMENT_ID:SQL语句ID。在PLAN_TABLE中,每条语句的执行计划都会有一个唯一的ID来标识。这个ID可以在执行Explain Plan命令时,通过Set Statement_id子句来指定。如果输入为NULL,则会获取最近一条被解释的语句。

q FORMAT:输出格式。在DISPLAY函数中,有以下预定义的格式(模板)可供选择:

m 'BASIC':基本格式。输出的内容最少,仅仅输出查询计划中每个操作的ID、名称和选项以及操作的对象名。

m 'TYPICAL':典型格式。输出的内容是我们进行语句调优时大多数情况下所需要的信息。除了基本格式中的内容外,还会输出优化器估算出的每个操作的记录行数、字节数、代价和时间,以及相关的提示信息(如远程SQL、优化器建议等)。如果存在谓词(Predicate)条件,还会输出每个操作中的过滤(Filter)条件和访问(Access)条件。此外,如果查询涉及分区表,还会输出分区裁剪信息;如果查询涉及并行查询,还会输出并行操作的相关信息(如表队列信息、并行查询分布方式等)。这种格式是默认格式。

m 'SERIAL':串行执行格式。这种格式和典型格式的输出内容基本一致,不同之处在于,对并行查询,它不会输出相关的并行内容。

m 'ALL':完全格式。输出的内容相对完整。除了典型格式的内容以外,还会输出字段投射信息和别名信息。

除了这些预定义的格式外,用户还可以通过在格式化字符串中添加或者屏蔽一些关键词进行细化输出。每一个细化选项代表了输出内容中的单个信息(可能是执行计划表中的一个列,也可能是一个附加信息)。在DISPLAY函数中,以下细化控制选项可供选择:

m ROWS:优化器估算出的记录行数;

m BYTES:优化器估算出的字节数;

m COST:优化器估算出的代价;

m PARTITION:分区裁剪;

m PARALLEL:并行查询;

m PREDICATE:谓词;

m PROJECTION:字段投射;

m ALIAS:别名;

m REMOTE:分布式查询信息;

m NOTE:相关注释信息。

细化控制选项和预定格式一起使用。例如,如果你希望输出基本格式内容,并输出优化器估算出的记录行数,可以用“BASIC ROWS”作为格式字符串;而如果希望输出典型格式,但不要其中的谓词条件,则可以输入“TYPICAL -PREDICATE”作为格式字符串,即在希望被屏蔽信息的对应控制选项前加上“-”。

q FILTER_PREDS:该参数接收合法的谓词过滤条件(可以是谓词逻辑表达式,也可以包含子查询),以过滤从查询计划表中读取的内容。例如,可以输入“COST ] 10”以限制输出所有估算代价大于10的操作。

示例见代码清单1-2。

代码清单1-2显示执行计划(DISPLAY函数)

HELLODBA.COM]explain plan for select * from t_users where user_id=:A;

Explained.

HELLODBA.COM]select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT

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

Plan hash value: 371495088

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

Id Operation Name Rows Bytes Cost (%CPU) Time

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

0 SELECT STATEMENT 1 86 1 (0) 00:00:02

1 TABLE ACCESS BY INDEX ROWID T_USERS 1 86 1 (0) 00:00:02

* 2 INDEX UNIQUE SCAN T_USERS_PK 1 1 (0) 00:00:02

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

Predicate Information (identified by operation id):

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

2 - access("USER_ID"=TO_NUMBER(:A))

14 rows selected.

HELLODBA.COM]select * from table(dbms_xplan.display(null,null,'BASIC ROWS BYTES'));

PLAN_TABLE_OUTPUT

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

Plan hash value: 371495088

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

Id Operation Name Rows Bytes

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

0 SELECT STATEMENT 1 86

1 TABLE ACCESS BY INDEX ROWID T_USERS 1 86

2 INDEX UNIQUE SCAN T_USERS_PK 1

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

1.2.2.2DISPLAY_CURSOR

DISPLAY_CURSOR函数可以显示内存中一个或者多个游标的执行计划。同样,可以通过输入参数限定SQL、游标以及输出格式。

用户必须对视图V$SQLV、$SQL_PLAN和V$SQL_PLAN_STATISTICS_ALL的SELECT有权限,才能正常调用DISPLAY_CURSOR函数。

参数描述:

q SQL_ID:所显示执行计划的SQL语句的ID。该ID可以从V$SQL.SQL_ID、V$SESSION.SQL_ID或者V$SESSION.PREV_SQL_ID获得。如果没有指定SQL_ID(指定NULL),则默认会显示当前会话中最后一条执行的SQL语句。

q CURSOR_CHILD_NO:语句的子游标序号。我们知道,受到执行环境的影响,一条SQL语句可能会产生多个版本的子游标,每个子游标都会与一个执行计划相映射(多个子游标也可能映射同一个执行计划)。通过CURSOR_CHILD_NO可以限制仅显示某一个子游标的执行计划。如果不指定该参数,则会显示该语句的所有子游标的执行计划。

q FORMAT:格式化控制字符串。DISPLAY函数的格式化控制字符串的所有选项都适用于DISPLAY_CURSOR函数。由于运行语句还可以通过提示GATHER_PLAN_STATISTICS或设置系统参数STATISTICS_LEVEL为“ALL”收集语句运行的性能统计数据,因此在细化选项中还有额外的选项,以选择是否输出这些数据。

m IOSTATS:是否输出计划的输入输出(IO)统计数据;

m MEMSTATS:在启用了PGA自动管理(参数pga_aggregate_target的值大于0)的情况下,是否输出计划的输入内存统计数据(操作的内存使用量、内存读次数等);

m ALLSTATS:包含了IOSTATS和MEMSTATS的全部内容;

m LAST:以上三个选项输出的统计数据都是实际产生的数据,而非估算数据,它们是该游标所有执行所产生的数据的总和。你可以增加LAST选项以限定仅显示最后一次运行的统计数据。

此外,还有一些未公布的选项可用于该函数的输出控制。首先是预定义格式:

m 'ADVANCED':高级格式。高级格式除了会输出完全格式中的所有内容外,还会视情况输出绑定变量窥视信息和计划概要(Outline)信息;

m OUTLINE:是否以提示(HINT)的方式显示计划概要;

m PEEKED_BINDS:是否显示绑定变量窥视信息;

m BUFFSTATS:是否显示内存读次数(包括一致性读和当前读次数),该信息为IOSTATS的一部分;

m PLAN_HASH:是否显示计划的哈希值,该选项同样适用于DISPLAY函数。

示例见代码清单1-3。

代码清单1-3显示执行计划(DISPLAY_CURSOR函数)

HELLODBA.COM]var A number

HELLODBA.COM]exec :A:=5

PL/SQL procedure successfully completed.

HELLODBA.COM]select /*+gather_plan_statistics*/* from t_users where user_id=:A;

USERNAME USER_ID PASSWORD ACCOUNT_STATUS LOCK_DATE

EXPIRY_DATE DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED PROFILE

INITIAL_RSRC_CONSUMER_GROUP

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

EXTERNAL_NAME

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

SYSTEM 5 2D594E86F93B17A1 OPEN

SYSTEM TEMP 2005-11-21 16:26:09 DEFAULT

SYS_GROUP

HELLODBA.COM]select * from table(dbms_xplan.display_cursor(null,null,'BASIC LAST ALLSTATS'));

PLAN_TABLE_OUTPUT

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

EXPLAINED SQL STATEMENT:

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

select /*+gather_plan_statistics*/* from t_users where user_id=:A

Plan hash value: 371495088

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

Id Operation Name Starts E-Rows A-Rows A-Time Buffers

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

1 TABLE ACCESS BY INDEX ROWID T_USERS 1 1 1 00:00:00.01 2

* 2 INDEX UNIQUE SCAN T_USERS_PK 1 1 1 00:00:00.01 1

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

Predicate Information (identified by operation id):

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

2 - access("USER_ID"=:A)

18 rows selected.

1.2.2.3DISPLAY_AWR

DISPLAY_AWR函数显示存储在AWR历史数据的执行计划。

提示:要正常调用DISPLAY_AWR参数,必须对以下视图有权限:DBA_HIST_SQL_PLAN和DBA_HIST_SQLTEXT的SELECT。

参数描述:

q SQL_ID:所显示执行计划的SQL语句的ID。该ID可以从DBA_HIST_SQL_PLAN.SQL_ID或DBA_HIST_SQLTEXT.SQL_ID获得,该参数必须指定非空值,没有默认值;

q PLAN_HASH_VALUE:执行计划的哈希值。我们之前提到,每个执行计划都有一个哈希值。通过该值,可以显示SQL语句的特定执行计划。如果该参数未指定或为NULL,则会显示语句的所有执行计划;

q DB_ID:指定显示哪个数据库的执行计划,默认为本地数据库ID;

提示:我们可以将其他数据库的AWR数据导入本地数据库进行分析。

q FORMAT:格式化控制字符串。与DISPLAY的相同选项类似。

示例见代码清单1-4。

代码清单1-4显示执行计划(DISPLAY_AWR函数)

HELLODBA.COM]select sql_id, to_char(substr(sql_text,0,4000)) from dba_hist_sqltext where

upper(sql_text) like 'SELECT * FROM T_USERS%';

SQL_ID

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

TO_CHAR(SUBSTR(SQL_TEXT,0,4000

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

d76shb2rbmmsn

select * from t_users where user_id=:A

HELLODBA.COM]select * from table(dbms_xplan.display_awr('d76shb2rbmmsn'));

PLAN_TABLE_OUTPUT

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

SQL_ID d76shb2rbmmsn

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

select * from t_users where user_id=:A

Plan hash value: 371495088

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

Id Operation Name Rows Bytes Cost (%CPU) Time

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

0 SELECT STATEMENT 1 (100)

1 TABLE ACCESS BY INDEX ROWID T_USERS 1 86 b4e-11e2-ac53-f5305504722b'

xmlns:xapMM='http://ns.adobe.com/xap/1.0/mm/']

[xapMM:DocumentID]adobe:docid:photoshop:e217afd4-6b44-11e2-ac53-f5305504722b[/xapMM:DocumentID]

[/rdf:Description]

[/rdf:RDF]

[/x:xapmeta]

[?xpacket end='w'?]�?Adobe d� �??

�??" �? !�??

s !1AQa"q?2憽盉#罵厌3b?r傫%C4S挗瞔s?D'摚?Tdt靡?&?

剶EFごV覷(蜚竽凿鬳u厱サ耪艴fv問Χ浦骣7GWgw嚄Х亲琪8HXhx垬ǜ蓉桫)9IYiy墮┕少轾*:JZjz姎授犏 m !1AQa"q亼2”?裂?BRbr?$4C?扴%猜s?釪?T?

&6E'dtU7颍趁()鱼髣敜茨凿鬳u厱サ耪艴FVfv問Χ浦骣GWgw嚄Х亲琪8HXhx垬ǜ蓉桫9IYiy墮┕少轾*:JZjz姎授犏�? ? 颵yYx≠Yy盫砯伺]?lU俪f臸?lU俪f臸?lU俪f臸?lU俪f臸?lU俪f臸?lU資y盬ee媾Z蜎/vl俦Wf蜎vl俦Wf蜎vl俦Wf蜎vl俦WS5l?w+??2骳C?T?^lxc?J??腐�骮鄧驡?Z饩7?y编忬G???笍棝� 4

oracle层级计算推演,(特价书)Oracle 高性能SQL引擎剖析:SQL优化与调优机制详解(资深Oracle专家黄玮十年磨一剑,盖国强作序力荐)(china-pub首发)...相关推荐

  1. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一第一篇 执行计划

    第一篇 执行计划 执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL ...

  2. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一1.1 生成执行计划

    1.1 生成执行计划 在Oracle中,任何一条语句在解析过程中都会生成一个唯一的数值标识,即SQL_ID.而同一条语句,在解析过程中,可能会因为执行环境的改变(例如某些优化参数被改变)而生成多个版本 ...

  3. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.2 内部函数与操作

    2.2 内部函数与操作 实际上,在Oracle内部,执行计划的每一个数据源(Row Source)操作都与一个内部函数(qer<*>)相对应,而操作对象.谓词条件都是这些函数的参数.这些函 ...

  4. 《Oracle高性能SQL引擎剖析:SQL优化与调优机制详解》一2.3 执行计划各个列的含义...

    2.3 执行计划各个列的含义 在执行计划中,除了ID.Operation和Name之外,还有其他一些列.这些列的数据是根据需要从PLAN_TABLE.V$SQL_PLAN.V$SQL_PLAN_STA ...

  5. oracle层级计算推演,云和恩墨的两道Oracle面试题

    真题1. 对于一个NUMBER(1)的列,如果查询中的WHERE条件分别是大于3和大于等于4,那么这二者是否等价? 答案:首先对于查询结果而言,二者没有任何区别.从这一点上讲无论是指定大于3还是指定大 ...

  6. oracle层级计算推演,R语言使用层次分析法进行综合指标等级划分

    业务临时需要,需要确定多因素影响下的综合权重值,现使用层次分析法和拉格朗日多项式插值算法做简易值计算. 1.建立层次分析结构模型,分析影响综合指标的各个因素,分层级,上层受下层影响,而同层各因素之间基 ...

  7. Oracle 高性能SQL引擎剖析----执行计划

    执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...

  8. oracle数据库按日期查询,关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解...

    关于Oracle数据库日期范围查询的两种实现方法详解,oracle详解 Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通过一个实例来介绍这一过程.我们假设 ...

  9. 周末Oracle技术沙龙、盖国强、我的同事们

    9月8日周六下午2:00,我们组织了一次关于Oracle 数据库的技术沙龙.盖国强被俺"捆绑"来做嘉宾讲师.(非常感谢他对我们活动的支持,以及认真的PPT准备和长达3小时的技术交流 ...

最新文章

  1. 什么是UUID及其实现代码
  2. 【转】【React Native开发】
  3. linux-``反引号
  4. 正则 实现等长度的分割字符串
  5. PostgreSQL Oracle 兼容性之 - INDEX SKIP SCAN (递归查询变态优化) 非驱动列索引扫描优化...
  6. B Convex Polygon
  7. 电话光端机安装步骤详解
  8. 16福师计算机应用基础在线作业,16春季福师《计算机应用基础》在线作业二.doc...
  9. 5G、射频、奥特曼,这仨有联系吗?
  10. php parse url 反向,实现PHP中parse_url的逆运算http_build_url
  11. 7. 星际争霸之php设计模式--中介者模式
  12. 【高校宿舍管理系统】第六章 用户管理和年级管理
  13. Android项目中最火最常用的优秀开源项目(很有用)
  14. 面试时,如何向HR解释自己频繁跳槽?
  15. 2017年前端该学些什么(译)
  16. linux查看cpu核数命令,Linux系統下如何查看CPU型號、核心數量、頻率和溫度?
  17. 360路由器v2刷第三方固件_斐讯K2P MTK版简单几步刷入breed教程,附刷第三方固件方法...
  18. word自动添加标题以及批量生成图片题注
  19. Axure教程:用中继器制作调查问卷/考试试卷
  20. python-docx 设置标题heading的中文字体类型+设置正文的中文字体类型

热门文章

  1. Servify在Iron Pillar领投的C轮融资中募资2300万美元
  2. 从0到1介绍一下开源大数据服务平台dataService
  3. 小弟全力推荐的MFC好资料——定期更新
  4. 20小时攻克“疫苗溯源码”,在改变世界这事上有群程序猿很skr!
  5. Neovim-配置教程
  6. 方国伟:企业服务入云还有很长的路要走
  7. 毕业设计 Android人脸门禁系统
  8. supermap iobjects 组件设置坐标,投影坐标之间的转换
  9. matlab .m文件转换成exe可执行文件
  10. 博客之星竞选最后几天,放飞自我的博主们