6.1     SQL语句类别

  • DDL:数据定义语言语句。这样的喻句子有CREATE、TRUNCATE和ALTER,它们用于建数据库中之布局,设置许可等。用户可行使她维护Oracle数据词典。
  • DML:数据操作语言说话。这些言辞可以改或者访问信息,包括INSERT、UPDATE和DELETE。
  • 查询:这是用户之规范SELECT语句。查询是赖那么回数据只是不改动数据的讲话,是DML语句之子集。

BLE传输性能主要让以下几只因素影响:操作类型,Connection
Interval,每个Connection
Event内发送的帧数、每一样幅数据的长。具体参见如下链接:

6.2     怎样执行语句

对立于查询及DML语句,DDL更像是Oracle的一个间命令。它不是于片表明上扭转的查询,而是就有做事的下令。例如,如果用户用:

Create table t(x int primary key, y date);

而有趣的是,CREATE TABLE语句也堪在中间富含SELECT。我们得行使:

Create table t as select * from scott.emp;

虽像DML可以涵盖查询同一,DDL也得这么做。当DDL包含查询的早晚,查询部分会如其他其它查询同一承受拍卖。Oracle执行这些讲话的4个步骤,它们是:

  • 解析
  • 优化
  • 行源生成
  • 行语句

对DDL,通常实际上只有见面以第一个和结尾一个步骤,它用会见分析语句,然后实施其。“优化”CREATE语句毫无意义(只发一致种方法好成立内容),也非需建立一般的方案(建立表底历程不言而喻,已经在Oracle中一直编码)。应该注意到,如果CREATE语句包含了询问,那么就见面按拍卖其他查询的主意处理者查询——采用上述有手续。

https://en.wikipedia.org/wiki/Bluetooth\_low\_energy

6.2.1          解析

旋即是Oracle中其他言处理过程的率先个步骤。解析(parsing)是以早已付出的话语分解,判定它是哪种档次的口舌(查询、DML或者DDL),并且于那达成推行各种检查操作。

解析过程会实施三单重点的功效:

  • 语法检查。这个讲话是不利发挥的喻句么?它适合SQL参考手册中著录之SQL语法么?它本SQL的具备条条框框也?
  • 语义分析。这个话是否科学参照了数据库中的目标,它所引述的表和列存在么?用户可以拜这些目标,并且拥有确切的特权么?语句被发出歧义么?。
  • 反省并享池。这个话是否都深受另外的对话处理?

以下即是语法错误:

SQL> select from where 2;

select from where 2

       *

ERROR 位于第 1 行:

ORA-00936: 缺少表达式

总的说来,如果授予正确的靶子以及特权,语句就可以实行,那么用户就遇到了语义错误;如果告诉句不能够在其它条件下执行,那么用户就赶上了语法错误。

解析操作着的产一致步是如果翻我们正分析的语句是否牵线
些会话处理了。如果拍卖过,那么我们就算格外幸运,因为其恐怕已储存于同台享池。在这种情景下,就得尽软解析(soft
parse),换句话说,可以避免优化和询问方案生成等,直接进入实践阶段。这将高大地缩短执行查询的历程。另一方面,如果我们亟须对查询进行分析、优化及转变执行方案,那么将尽所谓的硬解析(hard
parse)。这种分十分重要。当开发应用之时光,我们见面希望生深高之比例之查询进行软解析,以跨越了优化/生成等,因为这些等级很占用CPU。如果我们得硬解析大量的查询,那么网即会见运作得挺慢。

  1. ### Oracle怎样使用共享池

刚好而我辈已经观望底,当Oracle解析了查询,并且经过了语法和语义检查之后,就会见翻动SGA的共享池组件,来查找是否有另外的对话已经处理过完全相同的查询。为夫,当Oracle接收到我们的言辞之后,就会见对那个进行散列处理。散列处理是赢得原始SQL文本,将其发往一下函数,并且赢得一个回到编号的进程。如果我们走访片V$表,就好实际看来这些V$表在Oracle中称之为动态性表(dynamic
performance tables),服务器会于那边也咱囤一些实用的音信。

想必由此如下方式实现访问V$表:

呢用户账号给SELECT_CATALOG_ROLE

运用其它一个具备SELECT_CATALOG_ROLE的角色(例如DBA)

一经用户不克看V$表以及V$SQL视图,那么用户就未能够就有的“试验”,但是掌握所开展的拍卖非常容易。

https://devzone.nordicsemi.com/question/3440/how-do-i-calculate-throughput-for-a-ble-link/

考试:观察不同之散列值

(1)    首先,我们且执行2独对大家来讲意图和目的都一模一样的询问:

SQL> select * from dual;

D

-

X

SQL> select * from DUAL;

D

-

X

(2)   
我们好查询动态性视图V$SQL来查这些情节,它可向我们来得刚刚运行的2个查询的散列值:

SQL> select sql_text,hash_value from v$sql

  2  where upper(sql_text)='SELECT * FROM DUAL';

SQL_TEXT

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

HASH_VALUE

----------

select * from DUAL

1708540716

select * from dual

4035109885

平常不待实际查看散列值,因为它在Oracle内部采用。当大成了这些价值后,Oracle就见面以协同享池中开展搜寻,寻找具有同等散列值的言辞。然后拿它们找到的SQL_TEXT与用户提交的SQL语句进行较,以管教共享池中的文件完全相同。这个比较步骤非常要紧,因为散列函数的特色有即是2单不等的字符串也可能散列为同样之数字。

注意:

散列不是字符串到数字的唯一映射。

总结及目前为止我们所经历之解析过程,Oracle已经:

  • 分析了询问
  • 反省了语法
  • 证了语义
  • 算了散列值
  • 找到了配合
  • 证实和我们的查询完全相同的询问(它引用了平的靶子)

当Oracle从剖析步骤中归,并且告诉已完结软解析之前,还要执行最后一宗检查。最后之步骤就是是要是证实查询是否是于平的环境遭受剖析。环境是因能影响查询方案生成的享有会话设置,例如SORT_AREA_SIZE或者OPTIMIZER_MODE。SORT_AREA_SIZE会通知Oracle,它可以在不应用磁盘存储临时结果的动静下,为排序数据提供多少内存。圈套的SORT_AREA_SIZE会生成和于小之设置不同的优化查询方案。例如,Oracle可以择一个排序数据的方案,而非是应用索引读取数据的方案。OPTIMIZER_MODE可以通Oracle实际应用的优化器。

SQL> alter session set OPTIMIZER_MODE=first_rows;

会话已更改。

SQL> select * from dual;

D

-

X

SQL> select sql_text,hash_value,parsing_user_id

  2  from v$sql

  3  where upper(sql_text)='SELECT * FROM DUAL'

  4  /

SQL_TEXT

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

HASH_VALUE PARSING_USER_ID

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

select * from DUAL

1708540716               5

select * from dual

4035109885               5

select * from dual

4035109885               5

眼看2单查询之间的界别是第一只查询利用默认的优化器(CHOOSE),刚才执行之查询是在FIRST_ROWS模式遭遇剖析。

SQL> select sql_text,hash_value,parsing_user_id,optimizer_mode

  2  from v$sql

  3  where upper(sql_text)='SELECT * FROM DUAL'

  4  /

SQL_TEXT

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

HASH_VALUE PARSING_USER_ID OPTIMIZER_

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

select * from DUAL

1708540716               5 CHOOSE

select * from dual

4035109885               5 CHOOSE

select * from dual

4035109885               5 FIRST_ROWS

在这个路的终极,当Oracle完成了有着工作,并且找到了配合查询,它便可于剖析过程被归,并且告诉已进展了一个软解析。我们鞭长莫及观这报告,因为她由Oracle在里用,来指出其本好了分析过程。如果没有找到匹配查询,就得展开硬解析。

https://atmosphere.anaren.com/wiki/Data_rates_using_BLE

6.2.2          优化

当用SQL的时节,可以通者手续,但是每个特有的查询/DML语句都使至少实现均等破优化。

优化器的做事表面上看起简单,它的对象即是找到最好的执行用户查询的途径,尽可能地优化代码。尽管它们的做事描述非常简单,但是其实所形成的办事一定复杂。执行查询可能会见有上千栽的方法,它要找到最好美好的办法。为了判定哪一样种植查询方案最符合:Oracle可能会见用2栽优化器:

  • 基于规则的优化器(Rule Based
    Optimizer,RBO)——这种优化器基于一组指出了推行查询的优选方法的静态规则集合来优化查询。这些规则直接编入了Oracle数据库的本。RBO只会异常成一种查询方案,即规则告诉其如果转移的方案。
  • 据悉开销的优化器(Cost Based
    Optimizer,CBO)——这种优化器人基于所收集之让访的实际数目的统计数据来优化查询。它在决定顶出彩方案的时段,将会使用实行数量、数据集大小相当于消息。CBO将会见转变多只(可能上千独)可能的询问方案,解决查询的准备方式,并且也每个查询方案指定一个数开销。具有低开销的询问方案以见面被使用。

OPTIMIZER_MODE是DBA能够以数据库的初始化文件中设定的体系装置。默认情况下,它的值吗CHOOSE,这好吃Oracle选取它若利用的优化器(我们立刻便见面讨论展开这种选的平整)。DBA可以选覆盖是默认值,将这个参数设置为:

  • RULE:规定Oracle应该在恐情况下采取RBO。
  • FIRST_ROWS:Oracle将要以CBO,并且特别成一个尽量快地得到查询返回的第一履行的查询方案。
  • ALL_ROWS:Oracle将要以CBO,并且特别成一个竭尽快地取查询所返的最后一行(也即抱有的实行)的询问方案。

正好使我辈当地方看到的,可以通过ALTER
SESSION命令于对话层次覆写这个参数。这对开发者希望规定其想使用的优化器以及开展测试的用还非常管用。

当今,继续讨论Oracle怎样选择所采取的优化器,及其时机。当如下条件为确实时候,Oracle就会使CBO:

  • 足足发生一个查询所参考的靶子在统计数据,而且OPTIMIZER_MODE系统或者会话参数没有设置也RULE。
  • 用户的OPTIMIZER_MODE系统/会话参数设置为RULE或者CHOOSE以外的价。
  • 用户查询而拜访需要CBO的对象,例如分区表要索引组织表。
  • 用户查询包含了RULE提示(hint)以外的其它官方提示。
  • 用户采取了才出CBO才能够明白的特定的SQL结构,例如CONNECT BY。

目前,建议持有的以还利用CBO。自从Oracle第一次于披露即曾应用的RBO被看是不合时宜的询问优化措施,使用其的时光多初特色还无法运用。例如,如果用户想要下如下特征的下,就未可知使RBO:

  • 分区表
  • 各图索引
  • 目录组织表
  • 平整之细粒度审计
  • 交互查询操作
  • 因函数的目

CBO不像RBO那样容易懂。根据定义,RBO会遵循平等组规则,所以非常容易预见结果。而CBO会使用统计数据来支配查询所利用的方案。

为分析和展示这种艺术,可以应用一个简短的救人。我们将会晤以SQL*Plus中,从SCOTT模式复制EMP和DEPT表,并且为这些发明增加主键/外键。将见面使用SQL*Plus产品中内嵌工具AUTOTRACE,比较RBO和CBO的方案。

https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android

考查:比较优化器

(1)    用户确保作为SCOTT以外的外用户登录到数据库及,然后用CREATE
TABLE命令复制SCOTT.EMP和SCOTT.DEPT表:

SQL> create table emp

  2  as

  3  select * from scott.emp;

表已创建。

SQL> create table dept

  2  as

  3  select * from scott.dept;

表已创建。

(2)    向EMP和DEPT表增加主键

SQL> alter table emp

  2  add constraint emp_pk primary key(empno);

表已更改。

SQL> alter table dept

  2  add constraint dept_pk primary key(deptno);

表已更改。

(3)    添加从EMP到DEPT的外键

SQL> alter table emp

  2  add constraint emp_fk_dept

  3  foreign key(deptno) references dept;

表已更改。

(4)   
SQL*Plus中启用AUTOTRACE工具。我们正下的AUTOTRACE命令会向我们展示Oracle可以就此来推行查询经过优化的询问方案(它不见面实际施行查询):

SQL> set autotrace traceonly explain

如若开行失败,解决方法如下:

SQL> set autotrace traceonly explain

SP2-0613: 无法验证 PLAN_TABLE 格式或实体

SP2-0611: 启用EXPLAIN报告时出错

釜底抽薪办法:

1.盖时用户登录

SQL> connect zhyongfeng/zyf@YONGFENG as sysdba;

已连接。

2.运行utlxplain.sql(在windows的C:\oracle\ora92\rdbms\admin下),即创建PLAN_TABLE

SQL> rem

SQL> rem $Header: utlxplan.sql 29-oct-2001.20:28:58 mzait Exp $ xplainpl.sql

SQL> rem

SQL> Rem Copyright (c) 1988, 2001, Oracle Corporation.  All rights reserved. 

SQL> Rem NAME

SQL> REM    UTLXPLAN.SQL

SQL> Rem  FUNCTION

SQL> Rem  NOTES

SQL> Rem  MODIFIED

SQL> Rem     mzait      10/26/01  - add keys and filter predicates to the plan table

SQL> Rem     ddas       05/05/00  - increase length of options column

SQL> Rem     ddas       04/17/00  - add CPU, I/O cost, temp_space columns

SQL> Rem     mzait      02/19/98 -  add distribution method column

SQL> Rem     ddas       05/17/96 -  change search_columns to number

SQL> Rem     achaudhr   07/23/95 -  PTI: Add columns partition_{start, stop, id}

SQL> Rem     glumpkin   08/25/94 -  new optimizer fields

SQL> Rem     jcohen     11/05/93 -  merge changes from branch 1.1.710.1 - 9/24

SQL> Rem     jcohen     09/24/93 - #163783 add optimizer column

SQL> Rem     glumpkin   10/25/92 -  Renamed from XPLAINPL.SQL

SQL> Rem     jcohen     05/22/92 - #79645 - set node width to 128 (M_XDBI in gendef)

SQL> Rem     rlim       04/29/91 -         change char to varchar2

SQL> Rem   Peeler     10/19/88 - Creation

SQL> Rem

SQL> Rem This is the format for the table that is used by the EXPLAIN PLAN

SQL> Rem statement.  The explain statement requires the presence of this

SQL> Rem table in order to store the descriptions of the row sources.

SQL>

SQL> create table PLAN_TABLE (

  2   statement_id  varchar2(30),

  3   timestamp     date,

  4   remarks       varchar2(80),

  5   operation     varchar2(30),

  6   options        varchar2(255),

  7   object_node   varchar2(128),

  8   object_owner  varchar2(30),

  9   object_name   varchar2(30),

 10   object_instance numeric,

 11   object_type     varchar2(30),

 12   optimizer       varchar2(255),

 13   search_columns  number,

 14   id  numeric,

 15   parent_id numeric,

 16   position numeric,

 17   cost  numeric,

 18   cardinality numeric,

19   bytes  numeric,

 20   other_tag       varchar2(255),

 21   partition_start varchar2(255),

 22          partition_stop  varchar2(255),

 23          partition_id    numeric,

 24   other  long,

 25   distribution    varchar2(30),

 26   cpu_cost numeric,

 27   io_cost  numeric,

 28   temp_space numeric,

 29          access_predicates varchar2(4000),

 30          filter_predicates varchar2(4000));

3.以plustrace赋给用户(因为是时下用户,所以就步可略)

SQL> grant all on plan_table to zhyongfeng;

授权成功。

4.经实行plustrce.sql(C:\oracle\ora92\sqlplus\admin\
plustrce.sql),如下

SQL> @C:\oracle\ora92\sqlplus\admin\plustrce.sql;

会晤发生以下结果:

SQL> create role plustrace;

角色已创建

SQL>

SQL> grant select on v_$sesstat to plustrace;

授权成功。

SQL> grant select on v_$statname to plustrace;

授权成功。

SQL> grant select on v_$session to plustrace;

授权成功。

SQL> grant plustrace to dba with admin option;

授权成功。

SQL>

SQL> set echo off

5.授权plustrace到用户(因为凡当下用户,这步也可简简单单)

SQL> grant plustrace to zhyongfeng;

授权成功。

(5)    启用了AUTORACE,在咱们的表上运行查询:

SQL> set autotrace on;

SQL> set autotrace traceonly explain;

SQL> select * from emp,dept

  2  where emp.deptno=dept.deptno;



Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE

   1    0   NESTED LOOPS

   2    1     TABLE ACCESS (FULL) OF 'EMP'

   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

   4    3       INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE)

鉴于没有收集其他统计信息(这是初立之阐明),所以我们脚下于这个例子中而用RBO;我们无法访问任何要CBO的奇异目标,我们的优化器目标要安装也CHOOSE。我们呢会打输出中表明我们在利用RBO。在这里,RBO优化器会选择一个快要当EMP表上拓展FULL
SCAN的方案。为了执行连接,对于当EMP表中找到的各级一样执,它还见面收获DEPTNO字段,然后下DEPT_PK索引寻找跟这个DEPTNO相匹配的DEPT记录。

苟我们简要分析已有的表(目前她实在很小),就会意识经过行使CBO,将会晤赢得一个挺差之方案。

注意:

此时此刻的一个门类针对BLE传输性能有于高要求,将以上几乎单要素依次确认,使用协议支持的不过优值,其中Connection
Interval设置也7.5ms,每一样帧数据长度也20字节,每个Connection
Event根据工作需要安装为2,依是测算起底争辩传输速度约为5600Bps。为了测试实际效果,在Android端写了一个有些序,将数据流和日戳打印出,如下:

设置Autotrace的命令

序号

列名

解释

1

SET AUTOTRACE OFF

此为默认值,即关闭Autotrace

2

SET AUTOTRACE ON

产生结果集和解释计划并列出统计

3

SET AUTOTRACE ON EXPLAIN

显示结果集和解释计划不显示统计

4

SETAUTOTRACE TRACEONLY

显示解释计划和统计,尽管执行该语句,但您将看不到结果集

5

SET AUTOTRACE TRACEONLY STATISTICS

只显示统计

[21]:TS 238.794720 PN 20780 [1]:
[21]:TS 238.795954 PN 20780 [2]:
[21]:TS 238.802182 PN 20781 [1]:
[21]:TS 238.802373 PN 20781 [2]:
[21]:TS 238.810432 PN 20782 [1]:
[21]:TS 238.832608 PN 20782 [2]:
[21]:TS 238.832650 PN 20783 [1]:
[21]:TS 238.832728 PN 20783 [2]:
[21]:TS 238.832751 PN 20784 [1]:
[21]:TS 238.832820 PN 20784 [2]:
[21]:TS 238.832843 PN 20785 [1]:
[21]:TS 238.833862 PN 20785 [2]:
[21]:TS 238.839201 PN 20786 [1]:
[21]:TS 238.839403 PN 20786 [2]:
[21]:TS 238.848280 PN 20787 [1]:
[21]:TS 238.848894 PN 20787 [2]:
……
[21]:TS 288.128815 PN 27346 [1]:
[21]:TS 288.128977 PN 27346 [2]:
[21]:TS 288.136323 PN 27347 [1]:
[21]:TS 288.136908 PN 27347 [2]:
[21]:TS 288.159292 PN 27348 [1]:
[21]:TS 288.159569 PN 27348 [2]:
[21]:TS 288.159922 PN 27349 [1]:
[21]:TS 288.165079 PN 27349 [2]:
[21]:TS 288.167879 PN 27350 [1]:
[21]:TS 288.168157 PN 27350 [2]:
[21]:TS 288.173809 PN 27351 [1]:
[21]:TS 288.173906 PN 27351 [2]:

Autotrace执行计划的各列的涵义

序号

列名

解释

1

ID_PLUS_EXP

每一步骤的行号

2

PARENT_ID_PLUS_EXP

每一步的Parent的级别号

3

PLAN_PLUS_EXP

实际的每步

4

OBJECT_NODE_PLUS_EXP

Dblink或并行查询时才会用到

中间21为数据长度、TS为日穿、PN为包号,1及2凡一个Connection
Event内之保险之档次。可以看,一般情形下,一个Connection
Event发送两轴数据,这有限幅数据的工夫距离在1ms里边,两只Connection
Event之间的光阴距离约为7ms。为了直观呈现测试结果,在PC端写了一个工具为分析抓取的LOG,主要基于包号、包之路、字节长度和日戳,统计丢包率和传输速度,如下图所著。

AUTOTRACE Statistics常因此列解释

序号

列名

解释

1

db block gets

从buffer cache中读取的block的数量

2

consistent gets

从buffer cache中读取的undo数据的block的数量

3

physical reads

从磁盘读取的block的数量

4

redo size

DML生成的redo的大小

5

sorts (memory)

在内存执行的排序量

6

sorts (disk)

在磁盘上执行的排序量

(6)   
ANALYZE通常是由DBA使用的通令,可以收集及我们的表和索引有关的统计值——它要为周转,以便CBO能够享有部分可以参见的统计信息。我们本来行使其:

SQL> analyze table emp compute statistics;

表已分析。

SQL> analyze table dept compute statistics;

表已分析。

(7)   
现在,我们的阐发就拓展了分析,将要重新运行查询,查看Oracle这次以的查询方案:

SQL> select * from emp,dept

  2  where emp.deptno=dept.deptno;



Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=14 Bytes=700)

   1    0   HASH JOIN (Cost=5 Card=14 Bytes=700)

   2    1     TABLE ACCESS (FULL) OF 'DEPT' (Cost=2 Card=5 Bytes=90)

   3    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=2 Card=14 Bytes=448)

每当此处,CBO决定以2个说明展开FULL SCAN(读取整个表),并且HASH
JOIN它们。这要是坐:

  • 咱俩最终要顾2单表中的装有执行
  • 表很小
  • 当小表中通过索引访问各国一样执行(如达到)要比了摸它们慢

 

图片 1

做事规律

CBO在决定方案的时段会设想对象的框框。从RBO和CBO的AUTOTRACE输出中得发现一个妙不可言的状况是,CBO方案包含了还多之音讯。在CBO生成的方案遭,将会见视底情节产生:

  • COST——赋予这手续的询问方案的多少值。它是CBO比较相同查询的大多单备选方案的对立出,寻找具有低整体支付的方案时所祭的内数值。
  • CARD——这个手续的主干数据,换句话说,就是是手续将要变化的施行的估算数量。例如,可以窥见DEPT的TABLE
    ACCESS(FULL)估计如回到4长条记下,因为DEPT表只出4长记下,所以这结果十分是。
  • BYTES——方案被的之手续气概生成的数额的字节数量。这是专属列集合的平分行大小就以量的行数。

用户将会见注意到,当用RBO的时节,我们鞭长莫及观这个消息,因此这是平种查看所祭优化器的法门。

一旦我们“欺骗”CBO,使其当这些表比它们其实的只要深,就可以获得不同之面与当下统计信息。

可以看出,一共传输了盖16.3万独确保,没有数据丢失,两幅之间最可怜工夫间隔约为22.384ms,最深传输速度为5641Bps,平均速度约为5583ms,与理论值相差不多。Connection
Interval对传输性能的影响相比下图。

考:比较优化器2

为好这试验,我们且采用称为DBMS_STATS的增补程序包。通过行使这顺序包,就得当表上设置任意统计(可能只要形成部分测试工作,分析各种条件下的变型方案)。

(1)   
我们用DBMS_STATS来欺骗CBO,使其道EMP表具有1000万长条记下,DEPT表具有100万长记下:

SQL> begin

  2  dbms_stats.set_table_stats

  3  (user,'EMP',numrows=>10000000,numblks=>1000000);

  4  dbms_stats.set_table_stats

  5  (user,'DEPT',numrows=>1000000,numblks=>100000);

  6  end;

  7  /

PL/SQL 过程已成功完成。

(2)    我们将要执行及眼前完全相同的询问,查看新统计信息的结果:

SQL> select * from emp,dept

  2  where emp.deptno=dept.deptno;



Execution Plan

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

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=79185 Card=200000000

          0000 Bytes=100000000000000)



   1    0   HASH JOIN (Cost=79185 Card=2000000000000 Bytes=10000000000

          0000)



   2    1     TABLE ACCESS (FULL) OF 'DEPT' (Cost=6096 Card=1000000 By

          tes=18000000)



   3    1     TABLE ACCESS (FULL) OF 'EMP' (Cost=60944 Card=10000000 B

          ytes=320000000)

用户可以发现,优化器选择了截然不同为以前的方案。它不再散列这些家喻户晓大挺的申,而是会MERGE(合并)它们。对于比较小之DEPT表,它以见面下索引排序数据,由于当EMP表的DEPTNO列上没索引,为了拿结果合并在协同,要经DEPTNO排序整个EMP。

(3)   
如果将OPTIMIZER_MODE参数设置为RULE,就可以强制行使RBO(即使我们有这些统计数据),可以窥见她的行是一点一滴可预料的:

SQL> alter session set OPTIMIZER_MODE=RULE;

会话已更改。


SQL> select * from emp,dept

  2  where emp.deptno=dept.deptno;


Execution Plan

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

   0      SELECT STATEMENT Optimizer=RULE

   1    0   NESTED LOOPS

   2    1     TABLE ACCESS (FULL) OF 'EMP'

   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'

   4    3       INDEX (UNIQUE SCAN) OF 'DEPT_PK' (UNIQUE)

注意:

任由附属表中的数数量如何,如果被一定相同之数码对象集合(表和索引),RBO每次都见面转移完全相同的方案。

图片 2

6.2.3          行源生成器

行源生成器是Oracle的软件部分,它可由优化器获取输出,并且以那个格式化为的履行方案。例如,在就部分之前我们看来了SQL*Plus中之AUTOTRACE工具所大成的询问方案。那个树状结构的方案就是是行源生成器的出口;优化器会生成方案,而行源生成器会将该转移成为Oracle系统的其余部分可以行使的数据结构。

BLE传输延迟(Latency)主要是凭设备端将数据推广至蓝牙协议栈到Android主机收到的时空距离。由于通信双方时间穿不统一,无法以前面通过打印时间穿的点子来举行统计传输延迟,只能通过硬件信号做一道。设备端将数据推广至蓝牙协议栈时给来一个信号,Android主机收到该数量经常为叫起一个信号,使用示波器抓取两独信号即可获取数码经过蓝牙BLE传输的延期,如下图所展示。

6.2.4          执行引擎

执行引擎(execution
engine)是获取行源生成器的出口,并且用它生成结果集或者对表进行改动的历程。例如,通过采用上述最终生成的AUTOTRACE方案,执行引擎就足以读取整个EMP表。它见面经实行INDEX
UNIQUE
SCAN读取各执,在斯手续中,Oracle会在DEPT_PK索引上搜索UNIQUE索引找到特定值。然后用它所返的价去摸特定DEPTNO的ROWID(包含文件、数据文件、以及数额片有的地方,可以行使是地方找到数据行)。然后它就可以通过ROWID访问DEPT表。

尽引擎是全方位经过的为主,它是实在履行所特别成的询问方案的片。它会实施I/O,读取数据、排序数据、连接数据和当需要之时光以临时表中存储数据。

图片 3

6.2.5          语句执行汇总

在谈执行有中,我们早已分析了为进程处理,用户提交给Oracle的语句气概经历的4个阶段。图6-1凡汇集这个流程的流程图:

图片 4

希冀6-1 语词处理过程流图

当为Oracle提交SQL语句的时节,解析器就要确定她是待开展硬解析还是软解析。

假使告诉句要进行软解析,就可以一直进行SQL执行步骤,获得输出。

万一告诉句必须要进行硬解析,就需将该作朝优化器,它可以RBO或者CBO处理查询。当优化器生成它认为的尽美方案后,就见面以方案转递给行源生成器。

行源生成器会将优化器的结果转换为Oracle系统其余部分能够处理的格式,也就是说,能够存储于一块享池中,并且为实践的而重复使用的方案。这个方案可以由SQL引擎使用,处理查询而转变答案(也就是是出口)。

可以看BLE传输延迟约为8ms横,会上下不定。

6.3     查询全经过

今,我们来讨论Oracle处理查询的全都经过。为了展示Oracle实现查询过程的点子,我们将要讨论2单非常简单,但是完全两样之查询。我们的言传身教要重点于开发者经常会面问及的一个常见问题,也就是是说:“从自身之询问中拿会晤回去多少行数据?”答案非常简短,但是一般直到用户实际得了最终一行数,Oracle才懂得回了小行。为了重新好理解,我们拿会晤谈论得离最后一实行非常远之数据行的询问,以及一个务必待许多(或者有所)行既处理以后,可以回到记录之询问。

于此议论,我们将利用2单查询:

SELECT * FROM ONE_MILLION_ROW_TABLE;

以及

SELECT * FROM ONE_MILLION_ROW_TABLE ORDER BY C1;

在这里,假定ONE_MILLION_ROW_TABLE是我们放入了100推行之发明,并且以此表上没有索引,它从不采取另外措施排序,所以我们第二个查询中的ORDYER
BY要来多行事去开。

第一独查询SELECT * FROM
ONE_MILLION_ROW_TABLE将见面扭转一个非常简单的方案,它仅来一个步骤:

TABLE ACCESS(FULL) OF ONE_MILLION_ROW_TABLE

立马就是说Oracle将要访问数据库,从磁盘或者缓存读取表的具有数据块。在掌击的条件受到(没有相互查询,没有表分区),将见面依照自第一只盘区到其的终极一个盘区读取表。幸运的凡,我们立刻就足以自这查询中获取返回数据。只要Oracle能够读取信息,我们的客户使用就是可以获取数据行。这虽是我们不能够以取最终一行之前,确定询问将见面回到多少行之原委有—甚至Oracle也无知底要回到多少行。当Oracle开始拍卖是查询的早晚,它所知道的饶是做这个发明的盘区,它并不知道这些盘区中之莫过于行数(它会根据统计进行猜测,但是它们不明白)。在此地,我们不用等最终一履行接受拍卖,就好获取第一执行,因此我们只有实际得之后才会规范的实践数量。

其次单查询会发一些异。在大多数环境受到,它都见面分成2单步骤进行。首先是一个ONE_MILLION_ROW_TABLE的TABLE
ACCESS(FULL)步骤,它人以结果报告到SORT(ORDER
BY)步骤(通过列C1消除序数据库)。在这里,我们且等候一段时间才堪落第一实施,因为于获取数据行之前须要读取、处理又排序有的100万尽。所以马上同浅我们无克生快得到第一实行,而是要等待所有的行都被拍卖后才行,结果可能使存储在数据库被之有的临时段中(根据我们的SORT_AREA_SIZE系统/会说话参数)。当我们只要收获结果经常,它们以见面自于这些临时空间。

总而言之,如果为得查询约束,Oracle就会见尽可能快地回到答案。在以上的示范中,如果当C1臻起目录,而且C1定义也NOT
NULL,那么Oracle就足以运用这个目录读取表(不必进行排序)。这就算好尽量快地应我们的查询,为我们提供第一推行。然后,使用这种进程获得最后一执行就于缓慢,因为从索引中读取100万行会相当迟缓(FULL
SCAN和SORT可能会见再有效率)。所以,所选方案会凭借让所采用的优化器(如果有索引,RBO总会倾向被选用索引)和优化目标。例如,运行于默认模式CHOOSE中,或者下ALL_ROWS模式之CBO将动用完全摸和排序,而运作于FIRST_ROWS优化模式的CBO将可能只要运用索引。

数码传延迟还跟Android端软件读取数据的动态平衡程度有关,Android端软件需要及时用数据从缓存中读取出来,否则也会见促成一定的推迟。评估数据读取均匀程度的法门以及齐,也是经示波器抓取波形来拘禁,如下图所著。

6.4     DML全过程

今昔,我们要讨论如何处理修改的数据库的DML语句。我们将要讨论哪些生成REDO和UNDO,以及怎样用她用于DML事务处理及其恢复。

用作示范,我们将会晤分析如下事务处理会产出的气象:

INSERT INTO T(X,Y) VALUES (1,1);

UPDATE T SET X=X+1 WHERE X=1;

DELETE FROM T WHERE X=2;

最初对T进行的插将会生成REDO和UNDO。如果要,为了对ROLLBACK语句或者故障进行响应,所特别成的UNDO数据以会供足够的信息让INSERT“消失”。如果由系统故障而重新进行操作,那么所特别成的UNDO数据以见面吧插入“再次发生”提供足够的信。UNDO数据或者会见蕴藏众多信。

因此,在我们执行了以上之INSERT语句后(还尚无进行UPDATE或者DELETE)。我们就会有一个若图6-2所出示之状态。

 图片 5

祈求6-2 执行INSERT语句后的状态

这里产生有已缓存的,经过改的UNDO(回滚)数据块、索引块,以及表数据块。所有这些还存储在数据块缓存中。所有这些通过修改的数码块都见面出于再开日志缓存中之表项保护。所有这些信息现在且遭到缓存。

如今来考虑一个于此路出现系统崩溃的场景。SGA会受到清理,但是我们实际并未动用此列举的项,所以当我们臭不可闻启动之下,就恍如这事务处理过程从不曾发过样。所有发生改变之多少块都未曾写副磁盘,REDO信息也未尝写副磁盘。

于其余一个气象中,缓存可能早已填满。在这种场面下,DBWR必须要抽出空间,清理我们曾变更之数据块。为了好这项工作,DBWR首先会要求LGWR清理保护数据库数据块的REDO块。

注意:

于DBWR将曾转移之多少块定稿磁盘之前,LGWR必须理清及这些多少块相关联的REDO信息。

以我们的处理过程中,这时如清理重复做日志缓存(Oracle会反复清理是缓存),缓存中之局部转移呢如写副磁盘。在这种场面下,即要图6-3所出示。

 图片 6

祈求6-3 清理重复做日志缓存的状态

连片下去,我们只要拓展UPDATE。这会开展约相同之操作。这同样不好,UNDO的数量以会见重新充分,我们见面沾图6-4所出示情况。

 图片 7

图6-4 UPDATE图示

我们已经将再多的新UNDO数据块增加至了缓存中。已经修改了数量库表和索引数据块,所以我们若能够以用的上UNDO(撤销)已经展开的UPDATE。我们尚挺成了再也多的重做日志缓存表项。到目前为止,已经变的有的重做日志表项已经存入了磁盘,还有一对封存在缓存中。

如今,继续DELETE。这里见面发大体相同的情事。生成UNDO,修改数据块,将REDO发往重做日志缓存。事实上,它同UPDATE非常相像,我们要对其展开COMMIT,在此间,Oracle会将再也开日志缓存清理及磁盘上,如图6-5所著。

 图片 8

图6-5 DELETE操作后图示

有一些曾经修改的数据块保留在缓存中,还有有或者会见让清理及磁盘上。所有可以重放这个事务处理的REDO信息还见面安全地坐落磁盘上,现在改成就永久生效。

图片 9

6.5     DDL处理

末尾,我们来谈谈Oracle怎样处理DDL。DDL是用户修改Oracle数据词典的法门。为了建立表,用户不克编INSERT
INTO USER_TABLES语句,而是只要运用CREATE
TABLE语句。在后台,Oracle会为用户用大量底SQL(称为递归SQL,这些SQL会对其它SQL产生副作用)。

实施DDL活动用会当DDL执行前来一个COMMIT,并且在紧接着就下一个COMMIT或者ROLLBACK。这就是说,DDL会像如下伪码一样实行:

COMMIT;

DDL-STATEMENT;

IF (ERROR) THEN

    ROLLBACK;

ELSE

    COMMIT;

END IF;

用户须注意,COMMIT将要付出用户既处理的显要工作——即,如果用户执行:

INSERT INTO SOME_TABLE VALUES(‘BEFORE’);

CREATE TABLE T(X INT );

INSERT INTO SOME_TABLE VALUES(‘AFTER’);

ROLLBACK;

由第一独INSERT已经当Oracle尝试CREATE
TABLE语句之前开展了提交,所以只有插入AFTER的行会进行回滚。即使CREATE
TABLE失败,所进行的BEFORE插入也会付给。

内部1坦途为设备端发送数据,2通路也Android端读取数据,双方节奏基本保持一致,确保了就读取和分发设备端上报的数据。

6.6     小结

  • Oracle怎样解析查询、从语法和语义上印证其的是。
  • 软解析和硬解析。在硬解析情况下,我们谈谈了拍卖告知句所需要的叠加步骤,也就是说,优化以及行源生成。
  • Oracle优化器以及它的2种模式RULE和COST。
  • 用户会怎样在SQL*Plus中行使AUTOTRACE查看所动的优化器模式。
  • Oracle怎样使用REDO和UNDO提供故障保护。

章根据自己清楚浓缩,仅供参考。

选取自:《Oracle编程入门经典》 清华大学出版社 http://www.tup.com.cn/

本文主要是通过打流和抓波形的章程,验证了蓝牙BLE的传性能及延时。实际调试过程被尚可采用FTS4BT工具分析btsnoop_hci.log文件,以探究BLE建立链接、Update
Parameters和多少传等细节。