VanillaDB supports non-quiescent checkpointing, which means it stops accepting new transactions but still allows current running transactions to continue when checkpointing is ongoing. The checkpointing will be done periodically, and active transactions at that time will be saved in the log.
Read Committed Serializable Repeatable Read
VanillaDB supports transactions at different isolation levels concurrently, each transaction can specify its isolation level at creation time and the default transaction level is Serializable.
Two-Phase Locking (Deadlock Detection)
VanillaDB allows several transactions running in parallel under control of strict two-phase locking protocol in multiple granularities: file, block and record. To cope with deadlocks, VanillaDB supports time-limit deadlock detection, which force transactions to rollback when they wait too long for a lock.
Tuple-at-a-Time Model Materialized Model
VanillaDB supports both pipelined (iterative) and materialized scanning. Specially, materialized scanning is used in ORDER BY and GROUP BY. When creating a query plan, VanillaDB will estimate the cost of scan trees and choose the best one.
VanillaDB stores databases as several files in existing file system, managed by the storage engine. Databases are separated by different directories, and each table with catalog and index information is a file under the database directory.
The storage engine offers both file-level interface and block-level interface to access the data. VanillaDB also implements two types of I/O mode that can be configured by users, including Java New I/O and Jaydio(direct I/O, Linux only).
Custom API SQL Stored Procedures
VanillaDB offer various interfaces to access, such as SQL interpreter, JDBC, stored procedures, and native query interfaces(Native API).
Nested Loop Join Index Nested Loop Join
VanillaDB only supports implicit joins in the FROM clause with Nested Loop Join, but it can also determine the join field in the WHERE clause to perform an Index Nested Loop Join.
N-ary Storage Model (Row/Record)
VanillaDB uses row-oriented store to store records, which means all fields inside a record are stored contiguously. These records can't span more than one page, and each page with records is organized as the slotted page.
https://github.com/vanilladb/vanillacore
National Tsing Hua University
2016