Resumen del experimento uno de la base de datos mit


Código

Experimento 1: tupla y tuplaDesc

Objetivo: implementar tuple y tupleDesc
tupleDesc = tupleDescription

imagen.png

Experimento 2: catálogo

imagen.png

  1. Contiene tablas y esquemas de tablas: referencias de tablas, nombres de tablas, claves primarias de tablas
  2. adición y búsqueda de tablas
  3. Obtenga el único catálogo a través de Database.getCatalog()
  4. Importante forma de conseguir mesas. Obtenga información de la tabla o archivos de la tabla por id.

Experimento 3: grupo de almacenamiento intermedio

imagen.png

Experimento 4: implementar heapPageId, heapPage, recordID

1. Métodos y propiedades que deben implementarse

  • hepagina
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

Simplemente complete HeapPageIdTest, RecordIDTest y HeapPageReadTest.

Experimento 5: Implementar heapFile

imagen.png

  1. Lea el archivo usando randomFile
  2. iterador
    1. Comience después de abrir, solo lea la primera página
    2. Si no está vacío, compruebe si ha llegado al final de la página, si no, señale el principio de la página siguiente.

Experimento 6: Manipulación

área

  1. identificación de transacción única
  2. alias de tabla
  3. identificación de la tabla
  4. iterador de tabla

Operación concreta

  1. Alias ​​nulo.
  2. El iterador debe juzgarse si no está vacío para evitar que no se abra.

Experimento 7:

  1. Cree un archivo test.txt similar al siguiente, con una nueva línea al final
1,1,1
2,2,2
3,3,3

  1. Convierta test.txt en un archivo .dat, usando convert en HeapFileEncode
  2. Ejecute la prueba dada, preste atención al nombre de archivo correspondiente
    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. O ejecute el siguiente archivo directamente después de crear el archivo
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);
    }
}

pregunta

  1. ¿El tamaño del archivo en heapFile es un múltiplo entero de páginas? Si no, ¿qué debo hacer si hay menos de una página al leer los datos de la página? En caso afirmativo, ¿qué debo hacer si hay menos de una página al escribir?
    1. Al escribir, se escribe página por página, entonces al leer, ¿no habrá menos de una página?
    2. Después de la verificación, el tamaño de cada DBfIle debe ser un múltiplo entero de Page.
    3. Si 4k, dos datos de tipo int, puede almacenar 504 piezas de información
  2. ¿Por qué se debe colocar la clave principal en la información de la tabla en el catálogo?
    1. La interfaz DBfile de la tabla, la identificación está determinada por la identificación del DBfile.
    2. nombre de la tabla y clave principal
    3. Porque la clave principal y el nombre son información importante de la tabla.
  3. ¿Por qué se lanza NoSunElementException?
    1. Debido a que esto está definido, la prueba puede continuar ejecutándose si se produce este error.
  4. No hay salida en el experimento 7. No sé si hay un error en la conversión de .dat o un error en la lectura del archivo.
    1. De acuerdo con la depuración de depuración, se encontró el problema.
    2. Según el seguimiento, se encuentra que los campos en la tupla de salida existen, lo que indica que no hay ningún error en la conversión y que no hay ningún problema con la lectura en el archivo db.
      1. leer la cabeza primero
      2. Luego lee las tuplas de acuerdo con
      3. Finalmente, coloque el contenido leído en la página.
    3. Entonces, dado que no hay problema con la lectura y el iterador, la tupla devuelta no es un problema, por lo que solo la salida toString tiene un problema. De hecho, es el caso. Fue comentado en ese momento y olvidé restaurarlo.

Supongo que te gusta

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