網站首頁 編程語言 正文
1. 實驗目的
本次實驗三需要完成的內容為實現然連接(natural join)操作算法,對兩個關系進然連接,具體實現基于塊的嵌套循環連接(Block-based Nested Loop Join)算法。
我們要實現的函數在 executer.cpp 文件中。
bool NestedLoopJoinOperator::execute(int numAvailableBufPages,
File &resultFile)
2. 實驗內容
首先,我們讀取兩個表頭的信息
TableId leftTableId = catalog->getTableId("r");
TableId rightTableId = catalog->getTableId("s");
badgerdb::File left = File::open(catalog->getTableFilename(leftTableId));
badgerdb::File right = File::open(catalog->getTableFilename(rightTableId));
運用兩層循環尋找兩個表中名稱與類型完全相同的屬性,將他們全部標記出來,用于之后的自然連接操作。
vector<int> leftForeignKeyId;
vector<int> rightForeignKeyId;
for (int i = 0; i < leftTableSchema.getAttrCount(); i++)
{
for (int j = 0; j < rightTableSchema.getAttrCount(); j++)
{
if ((leftTableSchema.getAttrName(i) == rightTableSchema.getAttrName(j)) && (leftTableSchema.getAttrType(i) == rightTableSchema.getAttrType(j)))
{
leftForeignKeyId.push_back(i);
rightForeignKeyId.push_back(j);
break;
}
}
}
準備操作做完后,開始進行自然連接操作。
用循環從磁盤中讀取兩個頁面的信息,記錄 io 操作次數
for (badgerdb::FileIterator leftPage = left.begin(); leftPage != left.end(); leftPage++)
{
badgerdb::Page *bufferedLeftPage;
bufMgr->readPage(&left, (*leftPage).page_number(), bufferedLeftPage);
numIOs += 1;
for (badgerdb::FileIterator rightPage = right.begin(); rightPage != right.end(); rightPage++)
{
badgerdb::Page *bufferedRightPage;
bufMgr->readPage(&right, (*rightPage).page_number(), bufferedRightPage);
numIOs += 1;
之后,從表中讀取全部的元組的信息,進行對比。
讀取的元組信息有特殊的格式,并不能直接利用,所以需要先了解元組在表中儲存的格式,然后進行解讀。元組的存儲方式可以從 storage.cpp 中的 createTupleFromSQLStatement 函數中得知。
switch (dataType) { // (int) 56 (0011 1000) -> (char) '\0''\0''\0''8'
case INT: { // convert int value into 4 byte representation
case CHAR: { // (char(5) ) 'abc' -> 'abc00'
case VARCHAR: { // (varchar(8) ) 'abc' -> '3''abc' (3 refer to the ascii
// code number correspond alpha)
于是,我們根據注釋的存儲方式編寫解析函數,該函數輸入為文件中存儲的元組,輸出為數組表示的直觀的元組內容。
vector<string> analyze(string record, badgerdb::TableSchema schema)
先讀取其中一個表的元組,用塊來存儲。
for (badgerdb::PageIterator leftRecord = bufferedLeftPage->begin(); leftRecord != bufferedLeftPage->end(); leftRecord++)
{
vector<string> leftInfo = analyze(*leftRecord, leftTableSchema);
numUsedBufPages += 1;
block.push_back(leftInfo);
if (block.size() < BLOCK_SIZE)
{
continue;
}
然后讀取另一個表的元組信息,
for (badgerdb::PageIterator rightRecord = bufferedRightPage->begin(); rightRecord != bufferedRightPage->end(); rightRecord++)
{
numUsedBufPages += 1;
將兩個元組當中的屬性名相同的屬性列信息進行對比,
bool f = true;
for(int i = 0; i < leftForeignKeyId.size(); i++)
{
if(leftInfo[leftForeignKeyId[i]] != rightInfo[rightForeignKeyId[i]])
{
f = false;
break;
}
}
如果全部相同,則代表需要進行自然連接操作。
if(f)
{
string current_line = "INSERT INTO TEMP_TABLE VALUES (" + leftInfo[0];
for (int i = 1; i < leftTableSchema.getAttrCount(); i++)
{
current_line = current_line + ", " + leftInfo[i];
}
for (int i = 0; i < rightTableSchema.getAttrCount(); i++)
{
current_line = current_line + ", " + rightInfo[i];
}
current_line = current_line + ");";
string tuple = HeapFileManager::createTupleFromSQLStatement(current_line, catalog);
numResultTuples += 1;
HeapFileManager::insertTuple(tuple, resultFile, bufMgr);
}
否則不進行任何操作。
在全部循環都結束之后,塊中可能還會有剩余的信息沒有進行處理,此時再單獨對剩余信息進行處理,代碼基本相同。
3. 實驗結果
代碼運行結果如下:
原文鏈接:https://biyezuopin.blog.csdn.net/article/details/126084385
相關推薦
- 2023-11-12 ip link set eno2 down后centos無法聯網;centos7.0,二次啟動后無法
- 2022-08-13 局域網中共享文件夾
- 2022-10-24 IOS開發Swift?與?OC相互調用詳解_IOS
- 2022-07-22 CondaVerificationError:關于conda虛擬環境卸載后導致python版本腐化的
- 2021-12-20 ES6 Number 數值的擴展 0.1 + 0.2 === 0.3 居然是false
- 2022-05-14 C++使用new和delete進行動態內存分配與數組封裝_C 語言
- 2022-04-08 python實現有效的括號判斷實例代碼_python
- 2022-05-15 python自動化測試之Selenium詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支