單塊讀,塊讀
什麼是單塊讀?顧名思義,就是單個塊單個塊得讀,等待事件表現為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_mySID_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 0lhj29,871 cyzznbykb509s,0 file# 3 db file sequential read select count(*) from .98 .58 1 SCOTT block# 398158 t blocks 1lhj2 rows selected.Elapsed: 00:00:00.09--這裡select count(*) from t 對應的等待時間為 db file sequential read--隔一會再查還是一樣SQL> @getsession_mySID_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 4294967295lhj29,871 cyzznbykb509s,0 file# 3 db file sequential read select count(*) from 1.47 1.07 1 SCOTT block# 419088 t blocks 1lhj2 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中給出的值。
起始地址可以是在卡的有效位址範圍內的任何位元組地址。但是,每一個塊,必須包含......餘下全文>>