Resumo do primeiro experimento do banco de dados mit


Código

Experimento 1: tupla e tupleDesc

Objetivo: implementar tupla e tupleDesc
tupleDesc = tupleDescription

imagem.png

Experimento 2: catálogo

imagem.png

  1. Contém tabelas e esquemas de tabelas: referências de tabelas, nomes de tabelas, chaves primárias de tabelas
  2. adição de tabela e pesquisa
  3. Obtenha o único catálogo por meio de Database.getCatalog()
  4. Maneira importante de obter tabelas. Obtenha informações de tabela ou arquivos de tabela por id.

Experimento 3: buffer pool

imagem.png

Experimento 4: implementar heapPageId, heapPage, recordID

1. Métodos e propriedades que precisam ser implementados

  • pilha
1. getNumTuples() : 获取元组数目
2. HeapPage(HeapPageId id, byte[] data) 
3. getHeaderSize() :获取头(位示图)的长度
4. isSlotUsed(int i):该槽位是否被使用
5. iterator()
6. getNumEmptySlots() 


属性
1. pageid
2. tupleDesc								// 表的信息,元组信息和元组
3. []header and tuples

Basta concluir HeapPageIdTest, RecordIDTest e HeapPageReadTest.

Experimento 5: Implementar heapFile

imagem.png

  1. Leia o arquivo usando randomFile
  2. iterador
    1. Comece após a abertura, leia apenas a primeira página
    2. Se não estiver vazio, verifique se chegou ao final da página, caso contrário, aponte para o início da próxima página.

Experimento 6: Manipulação

área

  1. id de transação única
  2. apelido de mesa
  3. id da tabela
  4. iterador de tabela

operação concreta

  1. Alias ​​nulo.
  2. O iterador deve ser julgado se não está vazio para evitar que não seja aberto.

Experimento 7:

  1. Crie um arquivo test.txt semelhante ao seguinte, com uma nova linha no final
1,1,1
2,2,2
3,3,3

  1. Converter test.txt em um arquivo .dat, usando convert em HeapFileEncode
  2. Execute o teste fornecido, preste atenção ao nome do arquivo correspondente
    1. some_data_file.dat
package simpledb;
import java.io.*;

public class test {
    
    

    public static void main(String[] argv) {
    
    

        // construct a 3-column table schema
        Type types[] = new Type[]{
    
     Type.INT_TYPE, Type.INT_TYPE, Type.INT_TYPE };
        String names[] = new String[]{
    
     "field0", "field1", "field2" };
        TupleDesc descriptor = new TupleDesc(types, names);

        // create the table, associate it with some_data_file.dat
        // and tell the catalog about the schema of this table.
        HeapFile table1 = new HeapFile(new File("some_data_file.dat"), descriptor);
        Database.getCatalog().addTable(table1, "test");

        // construct the query: we use a simple SeqScan, which spoonfeeds
        // tuples via its iterator.
        TransactionId tid = new TransactionId();
        SeqScan f = new SeqScan(tid, table1.getId());

        try {
    
    
            // and run it
            f.open();
            while (f.hasNext()) {
    
    
                Tuple tup = f.next();
                System.out.println(tup);
            }
            f.close();
            Database.getBufferPool().transactionComplete(tid);
        } catch (Exception e) {
    
    
            System.out.println ("Exception : " + e);
        }
    }

}
  1. Ou execute o seguinte arquivo diretamente após criar o arquivo
package simpledb;

import org.junit.Test;
import simpledb.common.Database;
import simpledb.common.Type;
import simpledb.execution.SeqScan;
import simpledb.storage.*;
import simpledb.transaction.TransactionId;
import java.io.*;
/**
 * @author: Zekun Fu
 * @date: 2023/2/22 10:04
 * @Description:
 */
public class SQLTest {
    
    
    
    // 看当前的类路径
    @Test
    public void testPath() {
    
    
        System.out.println(String.format("当前的类路径是%s", System.getProperty("user.dir")));
    }
    
    // 测试文件转化
    @Test
    public void convert()  {
    
    
        File infile = new File("test.txt");
        File outFile = new File("some_data_file.dat");
        try {
    
    
            HeapFileEncoder.convert(infile, outFile, BufferPool.getPageSize(), 3);      // 默认3个int类型
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }

    @Test
    public void test() throws IOException{
    
    
        // construct a 3-column table schema
        // 构建表头
        Type types[] = new Type[]{
    
    Type.INT_TYPE, Type.INT_TYPE, Type.INT_TYPE};
        String names[] = new String[]{
    
    "field0", "field1", "field2"};
        TupleDesc descriptor = new TupleDesc(types, names);

        // create the table, associate it with some_data_file.dat
        // and tell the catalog about the schema of this table.

        // 创建表文件映射
        File file = new File("test.txt");
        if (!file.exists()) {
    
    
            throw new IOException(".dat文件不存在!");
        }
        File heapFile = new File("some_data_file.dat");
        HeapFileEncoder.convert(file, heapFile, BufferPool.getPageSize(), 3);
        HeapFile table1 = new HeapFile(heapFile, descriptor);
        Database.getCatalog().addTable(table1, "test");

        // construct the query: we use a simple SeqScan, which spoonfeeds
        // tuples via its iterator.
        // 创建查询
        TransactionId tid = new TransactionId();
        SeqScan f = new SeqScan(tid, table1.getId());

        try {
    
    
            // and run it
            f.open();
            while (f.hasNext()) {
    
    
                Tuple tup = f.next();
                System.out.print(tup);
            }
            f.close();
            Database.getBufferPool().transactionComplete(tid);
        } catch (Exception e) {
    
    
            System.out.println("Exception : " + e);
        }
        boolean end = heapFile.delete();
        System.out.println("临时数据库文件是否删除成功:" + end);
    }
}

pergunta

  1. O tamanho do arquivo em heapFile é um múltiplo inteiro de páginas? Caso contrário, o que devo fazer se houver menos de uma página ao ler os dados da página? Se sim, o que devo fazer se houver menos de uma página ao escrever?
    1. Ao escrever, escreve-se página a página, portanto, ao ler, não haverá menos de uma página?
    2. Após a verificação, o tamanho de cada DBfIle deve ser um múltiplo inteiro de Page.
    3. Se 4k, dois dados do tipo int, podem armazenar 504 informações
  2. Por que a chave primária deve ser colocada nas informações da tabela no catálogo?
    1. A interface DBfile da tabela, o id é determinado pelo id do DBfile.
    2. nome da tabela e chave primária
    3. Porque a chave primária e o nome são informações importantes da tabela.
  3. Por que NoSunElementException é lançado?
    1. Como isso está definido, o teste pode continuar executando se esse erro for lançado.
  4. Não há saída no experimento 7. Não sei se há um erro na conversão do .dat ou um erro na leitura do arquivo.
    1. De acordo com a depuração de depuração, o problema foi encontrado.
    2. De acordo com o trace, verifica-se que os campos na tupla de saída existem, indicando que não há erro na conversão, e não há problema na leitura no dbfile.
      1. leia de cabeça primeiro
      2. Em seguida, leia as tuplas de acordo com
      3. Finalmente, coloque o conteúdo lido na página.
    3. Então, como não há problema com a leitura e o iterador, a tupla retornada não é problema, então apenas a saída toString tem problema. Realmente é o caso. Ele foi comentado na hora e esqueci de restaurá-lo.

Acho que você gosta

Origin blog.csdn.net/fuzekun/article/details/129231100
Recomendado
Clasificación