ORACLE数据库查看执行计划的方法_oracle执行程序在哪里看-程序员宅基地

技术标签: 系统优化  Oracle  

基于ORACLE的应用系统很多性能问题,是由应用系统SQL性能低劣引起的,所以,SQL的性能优化很重要,分析与优化SQL的性能我们一般通过查看该SQL的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对SQL进行优化做相应说明
一、什么是执行计划(explain plan) 

执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 

二、如何查看执行计划 

1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 

很多人以为PL/SQL的执行计划只能看到基数、优化器、耗费等基本信息,其实这个可以在PL/SQL工具里面设置的。可以看到很多其它信息,如下所示 

clip_image002

2: 在SQL*PLUS(PL/SQL的命令窗口和SQL窗口均可)下执行下面步骤 

复制代码代码如下:

SQL>EXPLAIN PLAN FOR 
SELECT * FROM SCOTT.EMP; --要解析的SQL脚本 
SQL>SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); 

clip_image004

clip_image006

3: 在SQL*PLUS下(有些命令在PL/SQL下无效)执行如下命令: 

复制代码代码如下:

SQL>SET TIMING ON             --控制显示执行时间统计数据 
SQL>SET AUTOTRACE ON EXPLAIN       --这样设置包含执行计划、脚本数据输出,没有统计信息 
SQL>执行需要查看执行计划的SQL语句 
SQL>SET AUTOTRACE OFF           --不生成AUTOTRACE报告,这是缺省模式 
SQL> SET AUTOTRACE ON           --这样设置包含执行计划、统计信息、以及脚本数据输出 
SQL>执行需要查看执行计划的SQL语句 
SQL>SET AUTOTRACE OFF 
SQL> SET AUTOTRACE TRACEONLY      --这样设置会有执行计划、统计信息,不会有脚本数据输出 
SQL>执行需要查看执行计划的SQL语句 
SQL>SET AUTOTRACE TRACEONLY STAT --这样设置只包含有统计信息 
SQL>执行需要查看执行计划的SQL语句 

SET AUTOT[RACE] {ON | OFF | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

参考文档:SQLPlus User's Guide and Reference Release 11.1

clip_image008

注意:PL/SQL Developer 工具并不完全支持所有的SQL*Plus命令,像SET AUTOTRACE ON 就如此,在PL/SQL Developer工具下执行此命令会报错

SQL> SET AUTOTRACE ON;

Cannot SET AUTOTRACE

4:SQL_TRACE可以作为参数在全局启用,也可以通过命令形式在具体SESSION启用

4.1 在全局启用,在参数文件(pfile/spfile)中指定SQL_TRACE =true,在全局启用SQL_TRACE时会导致所有进程活动被跟踪,包括后台进程以及用户进程,通常会导致比较严重的性能问题,所以在生产环境要谨慎使用。

提示:通过在全局启用SQL_TRACE, 我们可以跟踪到所有后台进程的活动,很多在文档中的抽象说明,通过跟踪文件的实时变化,我们可以清晰的看到各个进程间的紧密协调。

4.2在当前SESSION级别设置,通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效),研究SQL执行时,发现后台

错误等。

复制代码代码如下:

SQL> ALTER SESSION SET SQL_TRACE=TRUE; 
SQL> SELECT * FROM SCOTT.EMP; 
SQL> ALTER SESSION SET SQL_TRACE =FALSE; 

那么此时如何查看相关信息?不管你在SQL*PLUS抑或PL/SQL DEVELOPER工具里面执行上面脚本过后都看不到什么信息,你可以通过下面脚本查询到trace日志信息 
复制代码代码如下:

SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' || 
P.SPID || '.trc' TRACE_FILE_NAME 
FROM 
( SELECT P.SPID 
FROM V$MYSTAT M, V$SESSION S, V$PROCESS P 
WHERE M.STATISTIC# =1 
AND S.SID = M.SID 
AND P.ADDR = S.PADDR 
) P, 
( SELECT T.INSTANCE 
FROM V$THREAD T, V$PARAMETER V 
WHERE V.NAME ='thread' 
AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE)) 
) I, 
(SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T 

clip_image010

TKPROF的帮助信息如下

复制代码代码如下:

TKPROF 选项 
选项 说明 
TRACEFILE 跟踪输出文件的名称 
OUTPUTFILE 已设置格式的文件的名称 
SORT=option 语句的排序顺序 
PRINT=n 打印前 n 个语句 
EXPLAIN=user/password 以指定的用户名运行 EXPLAIN PLAN 
INSERT=filename 生成 INSERT 语句 
SYS=NO 忽略作为用户 sys 运行的递归 SQL 语句 
AGGREGATE=[Y|N] 如果指定 AGGREGATE = NO TKPROF 不聚集相同 
SQL 文本的多个用户 
RECORD=filename 记录在跟踪文件中发现的语句 
TABLE=schema.tablename 将执行计划放入指定的表而不是缺省的PLAN_TABLE 

可以在操作系统中键入 tkprof 以获得所有可用选项和输出的列表 
注 排序选项有 

排序 选项说明 
prscnt execnt fchcnt 调用分析执行提取的次数 
prscpu execpu fchcpu 分析执行提取所占用的 CPU 时间 
prsela exela fchela 分析执行提取所占用的时间 
prsdsk exedsk fchdsk 分析执行提取期间的磁盘读取次数 
prsqry exeqry fchqry 分析执行提取期间用于持续读取的缓冲区数 
prscu execu fchcu 分析执行提取期间用于当前读取的缓冲区数 
prsmis exemis 分析执行期间库高速缓存未命中的次数 
exerow fchrow 分析执行期间处理的行数 
userid 分析游标的用户的用户 ID 

TKPROF 统计数据 
Count: 执行调用数 
CPU: CPU 的使用秒数 
Elapsed: 总共用去的时间 
Disk: 物理读取次数 
Query: 持续读取的逻辑读取数 
Current: 当前模式下的逻辑读取数 
Rows: 已处理行数 
TKPROF 统计信息 
统计 含义 
Count 分析或执行语句的次数以及为语句发出的提取调用数 
CPU 每个阶段的处理时间以秒为单位如果在共享池中找到该语句对于分析阶段为 0 
Elapsed 占用时间以秒为单位通常不是非常有用因为其它进程影响占用时间 
Disk 从数据库文件读取的物理数据块如果该数据被缓冲则该统计可能很低 
Query 为持续读取检索的逻辑缓冲区通常用于 SELECT 语句 
Current 在当前模式下检索的逻辑缓冲区通常用于 DML 语句 
Rows 外部语句所处理的行对于 SELECT 语句在提取阶段显示它对于 DML 语句在执行阶段显示它 

Query 和Current 的总和为所访问的逻辑缓冲区的总数 

执行下面命令:tkprof D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trc h:\out.txtoutputfile explain=etl/etl 

clip_image012

执行上面命令后,可以查看生成的文本文件 
复制代码代码如下:

TKPROF: Release 10.2.0.1.0 - Production on 星期三 5月 23 16:56:41 2012 
Copyright (c) 1982, 2005, Oracle. All rights reserved. 
Trace file: D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trc 
Sort options: default 
******************************************************************************** 
count = number of times OCI procedure was executed 
cpu = cpu time in seconds executing 
elapsed = elapsed time in seconds executing 
disk = number of physical reads of buffers from disk 
query = number of buffers gotten for consistent read 
current = number of buffers gotten in current mode (usually for update) 
rows = number of rows processed by the fetch or execute call 
******************************************************************************** 
ALTER SESSION SET SQL_TRACE = TRUE 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 0 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 1 0.00 0.00 0 0 0 0 
Misses in library cache during parse: 0 
Misses in library cache during execute: 1 
Optimizer mode: CHOOSE 
Parsing user id: 89 (ETL) 
******************************************************************************** 
begin :id := sys.dbms_transaction.local_transaction_id; end; 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 2 0.00 0.00 0 0 0 0 
Execute 2 0.00 0.00 0 0 0 2 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 4 0.00 0.00 0 0 0 2 
Misses in library cache during parse: 0 
Optimizer mode: CHOOSE 
Parsing user id: 89 (ETL) 
******************************************************************************** 
SELECT * 
FROM 
SCOTT.EMP 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 2 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 1 0.00 0.00 0 7 0 14 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 4 0.00 0.00 0 7 0 14 
Misses in library cache during parse: 1 
Optimizer mode: CHOOSE 
Parsing user id: 89 (ETL) 
Rows Execution Plan 
------- --------------------------------------------------- 
SELECT STATEMENT MODE: CHOOSE 
TABLE ACCESS MODE: ANALYZED (FULL) OF 'EMP' (TABLE) 
******************************************************************************** 
ALTER SESSION SET SQL_TRACE = FALSE 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 1 0.00 0.00 0 0 0 0 
Execute 1 0.00 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 2 0.00 0.00 0 0 0 0 
Misses in library cache during parse: 1 
Optimizer mode: CHOOSE 
Parsing user id: 89 (ETL) 
******************************************************************************** 
OVERALL TOTALS FOR ALL NON-RECURSIVE STATEMENTS 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 5 0.00 0.00 0 0 0 0 
Execute 5 0.00 0.00 0 0 0 2 
Fetch 1 0.00 0.00 0 7 0 14 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 11 0.00 0.00 0 7 0 16 
Misses in library cache during parse: 2 
Misses in library cache during execute: 1 
OVERALL TOTALS FOR ALL RECURSIVE STATEMENTS 
call count cpu elapsed disk query current rows 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
Parse 0 0.00 0.00 0 0 0 0 
Execute 0 0.00 0.00 0 0 0 0 
Fetch 0 0.00 0.00 0 0 0 0 
------- ------ -------- ---------- ---------- ---------- ---------- ---------- 
total 0 0.00 0.00 0 0 0 0 
Misses in library cache during parse: 0 
user SQL statements in session. 
internal SQL statements in session. 
SQL statements in session. 
statement EXPLAINed in this session. 
******************************************************************************** 
Trace file: D:\ORACLE\PRODUCT\10.2.0\DB_1\RDBMS\TRACE/wgods_ora_3940.trc 
Trace file compatibility: 10.01.00 
Sort options: default 
session in tracefile. 
user SQL statements in trace file. 
internal SQL statements in trace file. 
SQL statements in trace file. 
unique SQL statements in trace file. 
SQL statements EXPLAINed using schema: 
ETL.prof$plan_table 
Default table was used. 
Table was created. 
Table was dropped. 
lines in trace file. 
elapsed seconds in trace file. 

4.3跟踪其它用户的进程,在很多时候我们需要跟踪其它用户的进程,而不是当前用户,可以通过ORACLE提供的系统包 
DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION来完成。 
例如: 
复制代码代码如下:

SELECT SID, SERIAL#, USERNAME FROM V$SESSION WHERE USERNAME = 'ETL' 
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,TRUE); 
EXEC DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION(61,76,FALSE); 

5 利用10046事件 
复制代码代码如下:

ALTER SESSION SET TRACEFILE_IDENTIFIER = 10046; 
ALTER SESSION SET EVENTS='10046 trace name context forever, level 8'; 
SELECT * FROM SCOTT.EMP; 
ALTER SESSION SET EVENTS ='10046 trace name context off'; 
然后你可以用脚本查看追踪文件的位置 
SELECT T.VALUE || '/' || LOWER(RTRIM(I.INSTANCE, CHR(0))) || '_ora_' || 
P.SPID || '.trc' TRACE_FILE_NAME 
FROM 
( SELECT P.SPID 
FROM V$MYSTAT M, V$SESSION S, V$PROCESS P 
WHERE M.STATISTIC# =1 
AND S.SID = M.SID 
AND P.ADDR = S.PADDR 
) P, 
( SELECT T.INSTANCE 
FROM V$THREAD T, V$PARAMETER V 
WHERE V.NAME ='thread' 
AND (V.VALUE = 0 OR T.THREAD# = TO_NUMBER(V.VALUE)) 
) I, 
(SELECT VALUE FROM V$PARAMETER WHERE NAME='user_dump_dest') T 
查询结果为wgods_ora_28279.trc文件, 但是去相应目录却没有找到对应的追踪文件,而是如下trace文件:wgods_ora_28279_10046.trc 

6 利用10053事件 

有点类似10046,在此略过、 

7 系统视图 

通过下面一些系统视图,你可以看到一些零散的执行计划的相关信息,有兴趣的话可以多去研究一下。 
复制代码代码如下:

SELECT * FROM V$SQL_PLAN 
SELECT * FROM V$RSRC_PLAN_CPU_MTH 
SELECT * FROM V$SQL_PLAN_STATISTICS 
SELECT * FROM V$SQL_PLAN_STATISTICS_ALL 
SELECT * FROM V$SQLAREA_PLAN_HASH 
SELECT * FROM V$RSRC_PLAN_HISTORY 

三、看懂执行计划 

1.执行顺序 

执行顺序的原则是:由上至下,从右向左 

由上至下:在执行计划中一般含有多个节点,相同级别(或并列)的节点,靠上的优先执行,靠下的后执行 

从右向左:在某个节点下还存在多个子节点,先从最靠右的子节点开始执行。 

当然,你在PL/SQL工具中也可以通过它提供的功能来查看执行顺序。如下图所示: 

clip_image014

2.执行计划中字段解释

clip_image016

SQL> 
名词解释: 
recursive calls           递归调用 
db block gets           从buffer cache中读取的block的数量当前请求的块数目,当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的正常情况下,一个查询提取的块是在查询查询开始的那个时间点上存在的数据库,当前块是在这个时候存在数据块,而不是这个时间点之前或者之后的的数据块数目。 
consistent gets          从buffer cache中读取的undo数据的block的数量数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块,,这里的概念是在你处理你这个操作的时侯需要在一致性读状态上处理多个块,这些块产生的主要原因是因为你在查询过程中,由于其它会话对数据 块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所要需要对回滚 段中的数据块的前映像进行查询,以保证数据的一致性。这样就产生了一致性读。 

physical reads           物理读 就是从磁盘上读取数据块的数量。其产生的主要原因是: 
                  1:在数据库高速缓存中不存在这些块。 
                  2:全表扫描 
                  3:磁盘排序 
redo size              DML生成的redo的大小 
sorts (memory)           在内存执行的排序量 
sorts (disk)            在磁盘执行的排序量 
2091 bytes sent via SQL*Net to client     从SQL*Net向客户端发送了2091字节的数据 
416 bytes received via SQL*Net from client  客户端向SQL*Net发送了416字节的数据。 
参考文档:SQLPlus User's Guide and Reference Release 11.1 

clip_image018

db block gets 、 consistent gets 、 physical reads这三者的关系可以概括为:逻辑读指的是ORACLE从内存读到的数据块块数量,一般来说是: 
consistent gets + db block gets. 当在内存中找不到所需要的数据块的话,就需要从磁盘中获取,于是就产生了物理读。 
3.具体内容查看 
1> Plan hash Value 
这一行是这一条语句的的hash值,我们知道ORACLE对每一条ORACLE语句产生的执行计划放在SHARE POOL里面,第一次要经过硬解析,产生hash值。下次再执行时比较hash值,如果相同就不会执行硬解析。 
2> COST 

COST没有单位,是一个相对值,是SQL以CBO方式解析执行计划时,供ORACLE来评估CBO成本,选择执行计划用的。没有明确的含义,但是在对比是就非常有用。 
公式:COST=(Single Block I/O COST + MultiBlock I/O Cost + CPU Cost)/ Sreadtim 

3> 对上面执行计划列字段的解释: 
Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。) 
    Operation:当前操作的内容。 
    Name:操作对象 
    Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。 
    Bytes:表示执行该步骤后返回的字节数。 
    Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。 
    Time:Oracle 估计当前操作的时间。 
4.谓词说明: 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
2 - filter("B"."MGR" IS NOT NULL) 
4 - access("A"."EMPNO" = "B"."MGR") 
    Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。 
    Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。 
    在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。 
5、 动态分析 
如果在执行计划中有如下提示: 
Note 
------------ 
-dynamic sampling used for the statement 
这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。我们从而推断这个表可能没有做过分析。 
这里会出现两种情况: 
(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。 
(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。 

四、表访问方式 

1.Full Table Scan (FTS) 全表扫描 

2.Index Lookup 索引扫描 
There are 5 methods of index lookup: 
index unique scan --索引唯一扫描 
通过唯一索引查找一个数值经常返回单个ROWID,如果存在UNIQUE或PRIMARY KEY约束(它保证了语句只存取单行的话),ORACLE 
经常实现唯一性扫描 
Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index. 
index range scan --索引局部扫描 
Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) . 
使用一个索引存取多行数据,在唯一索引上使用索引范围扫描的典型情况是在谓词(WHERE 限制条件)中使用了范围操作符号(如>, < <>, >=, <=,BWTEEN) 
index full scan --索引全局扫描 
Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order. 
index fast full scan --索引快速全局扫描,不带order by情况下常发生 
Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index. 
index skip scan --索引跳跃扫描,where条件列是非索引的前提情况下常发生 
Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search. 
3.Rowid 物理ID扫描 
This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yellowd1/article/details/46508705

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法