欢迎投稿

今日深度:

单块读,块读

单块读,块读


什么是单块读?
顾名思义,就是单个块单个块得读,等待事件表现为db file sequential read;


单块读有哪些情况?
大部分索引扫描是单块读(除index fast full scan),rowid回表是单块读,undo里读数据是单块读,行迁移行链接是单块读,读取段头是单块读,读边界块是单块读。


现在就来探讨下undo里读数据是单块读的情况:
--session1:
SQL> begin
  2  for x in 1..1000000 loop
  3  update t set id=999;
  4  end loop;
  5  commit;
  6  end;
  7  /


执行了太久了,不出结果
--session2:
SQL> select count(*) from t;


--session3:
SQL> @getsession_my


SID_SERIAL SQL_ID_NUM      P_NAME          P_VALUE         EVENT                     SQL_TEXT                MINUTE1 MINUTE_EXEC    INST_ID USERNAME
---------- --------------- --------------- --------------- ------------------------- -------------------- ---------- ----------- ---------- ----------
MACHINE
---------------
1,7        7kyc4rsrd3q1b,0 address         837617808       latch: cache buffers chai UPDATE T SET ID=999      469.68         7.1          1 SCOTT
                           number          150             ns
                           tries           0
lhj


29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from        .98         .58          1 SCOTT
                           block#          398158                                     t
                           blocks          1
lhj




2 rows selected.


Elapsed: 00:00:00.09


--这里select count(*) from t 对应的等待时间为 db file sequential read




--隔一会再查还是一样
SQL> @getsession_my


SID_SERIAL SQL_ID_NUM      P_NAME          P_VALUE         EVENT                     SQL_TEXT                MINUTE1 MINUTE_EXEC    INST_ID USERNAME
---------- --------------- --------------- --------------- ------------------------- -------------------- ---------- ----------- ---------- ----------
MACHINE
---------------
1,7        7kyc4rsrd3q1b,0 count           1               Data file init write      UPDATE T SET ID=999      470.17        7.58          1 SCOTT
                           intr            256
                           timeout         4294967295
lhj


29,871     cyzznbykb509s,0 file#           3               db file sequential read   select count(*) from       1.47        1.07          1 SCOTT
                           block#          419088                                     t
                           blocks          1
lhj




2 rows selected.


Elapsed: 00:00:00.01


--file#对应的是undo表空间
SQL> select file_id,tablespace_name from dba_data_files where file_id = 3; 


   FILE_ID TABLESPACE_NAME
---------- ------------------------------
         3 UNDOTBS1                          --可见对应的是undo表空间


1 row selected.

Elapsed: 00:00:11.88


说明表在做dml的时候,此时再发出一个关于此表的查询,如果查询的数据刚好是dml的数据,那么是从undo表空间读取的。
undo有优点也有缺点:优点是能保证能保证数据的准确性,在修改数据之前,oracle会把要修改的copy到undo表空间,事务成功了则释放可重新利用undo,事务失败了则通过undo来回滚到dml之前。这是oracle独有的机制;缺点也很明显,就是undo里面读数据是单块读,速度非常慢。这也就是为什么很多数据库down掉之后,恢复要很长一段时间。






STM32芯片下,进行SD卡的读写操作,单块读写都是OK,但是多块读写总是不成功

你用的什么芯片 是stm32f103vrt6 吗
 

对于spi模式的命令

7 SPI模式

7.1 介绍

SPI模式由一个由基于闪存SD存储卡提供的次要通信协议组成.此模式是SD存储卡协议的子集。此接口在上电(CMD0)后的每一个复位命令期间被选择。

SPI标准只定义物理链接,而不提供数据传输协议。SD存储卡SPI执行利用SD存储卡协议和命令集的子集。

7.2 SPI总线协定

SD卡是基于命令和数据流,这些命令和数据流以一个起始位开始,以停止位结束的.SPI通道是面向字节的.每个命令或数据块都是由多个8位字节构成,且每个字节与CS片选信号对齐(例如:此长度是8时钟周期的倍数)。

类似于SD存储卡协议,SPI短信是由命令,响应和数据块环组成。所有的通信都由主机控制,主机通过拉低CS来启动每个总线事务。

SPI模式下的响应行为有三个方面和SD模式不同:

1、被选择的卡总是回应命令。

2、使用附加的(8位)响应结构。

3、当卡遇到一个数据检索问题时,它会用一个响应错误来回应(替换预期的数据块),而不是SD模式中的超时。

除了命令响应之外,每一个在写操作期间发送到卡的数据块将以一个特殊的数据响应令牌来被响应。一个数据块可能和一个写块(WRITE_BL_LEN)一样大,也可能和一个信号字一样小。部分块的读/写操作都被卡中CSD寄存器中所叙述的被选择的项使能。

7.2.1 模式选择

SD卡从SD模式中唤醒。如果CS信号在复位命令(CMD0)被接收期间被拉低,并进入空闲模式,如果认为是SD模式被需求则不会响应此命令,仍在SD模式下。如果SPI模式被需求,则卡将会切换到SPI,且用SPI模式R1响应。

唯一返回SD模式的方法是进入上电周期。在SPI模式下,SD存储卡协议状态机不被遵守。所有的在SPI模式下被支持的SD存储卡命令总是可用的。

7.2.2 总线传输保护

每个在总线上传输的SD存储卡令牌被CRC位保护。在SPI模式下,SD存储卡提供一个非保护模式。此模式使系统用可靠的数据链接来建立,以排除(否定)硬件或软件需要执行CRC生成和校验功能。

在非保护模式下,命令、响应和数据令牌的CRC位在令牌中仍被需要,尽管,对于发送器,它们被定义成“don't care”,且被接收器忽略。

在非保护模式下,SPI接口被初始化。尽管,RESET命令用于使卡切换到SPI模式,但它是在SD模式下被卡接收,所以,必须有一个有效的CRC域。

因为CMD0没有参数,所有的域的内容(包括CRC域)都是常数,不需要在运行时间计算出来。一个有效的复位命令是:

0x40,0x0, 0x0, 0x0, 0x0,0x95

主机可以用CRC_ON_OFF命令(CMD59)开关卡的CRC选项。

7.2.3 读数据

SPI支持单块读和多块读操作(在SD存储卡协议中的CMD17 OR CMD18)。当接收一个有效的读命令后卡将在一个在SET_BLOCK_LEN(CMD16)定义了长度的数据令牌之后,用一个响应令牌作出回复。(参考Figure41)

Figure41 单块读操作

一个有效的数据块被添加了一个16位CRC,此CRC由CCITT标准多项式X16+X12+X5+1生成。

能被READ_BL_LEN给出的最大的块的的长度大CSD中定义了。如果片块被允许,块长度可以是1~MAX块大小之间的任何长度。否则,数据读的有效块长度只是在READ_BL_LEN中给出的值。

起始地址可以是在卡的有效地址范围内的任何字节地址。但是,每一个块,必须包含......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/4242.html NewsArticle 单块读,块读 什么是单块读?顾名思义,就是单个块单个块得读,等待事件表现为db file sequential read;单块读有哪些情况?大部分索引扫描是单块读(除index fast full scan),rowid回表是单...
评论暂时关闭