6.1     SQL语句系列

  • DDL:数据定义语言语句。那样的语句有CREATE、TRUNCATE和ALTER,它们用于建立数据库中的结构,设置许可等。用户可以利用它们维护Oracle数据词典。
  • DML:数据操作语言说话。这多少个言辞能够修改或者访问音讯,包括INSERT、UPDATE和DELETE。
  • 询问:这是用户的正式SELECT语句。查询是指那么重返数据只是不改动数据的语句,是DML语句的子集。

BLE传输性能首要受以下多少个因素影响:操作类型,Connection
Interval,每个Connection
伊芙nt内发送的帧数、每一帧数据的长短。具体参见如下链接:

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
伊夫(Eve)nt依据作业需要安装为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
伊夫(Eve)nt内的包的类型。可以看看,一般情状下,一个Connection
伊芙nt发送两帧数据,那两帧数据的日子间隔在1ms之内,三个Connection
伊夫(Eve)nt之间的光阴距离约为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和数量传输等细节。