PgSQL - 内核特性 - 把DuckDB弄进来怎么样

PgSQL - 内核特性 - 把DuckDB弄进来怎么样

DuckDB是一款高性能的分析型数据库系统,支持了基于Push-based pipeline的向量化执行引擎。这么好的一款数据库,有办法直接弄到PgSQL里面,以利用其优秀的列式存储、向量化执行引擎等优秀特性吗?Hydra团队开源了一款插件pg_quack,将duckdb以表访问方法的方式加到PgSQL中,为PgSQL提供了新的存储引擎以及执行引擎。

1、执行器及表访问方法hook接入

1)增加了一个配置项quack.data_dir,用于指定duckdb表的存访目录

2)quack_init_tableam初始化duckdb表访问方法的hook

3)quack_init_hooks初始化duckdb执行器的hook

2、接入执行器的hook

包括两个hook,一个用于DML等查询,一个用于DDL等操作。

3、DML的hook

通过duckdb api来进行操作。由于duckdb是嵌入式,所以只需要将duckdb的lib库和头文件加进来就可以使用。

php 复制代码
quack_executor_run->
  duckdb_database db = quack_open_database(MyDatabaseId, false);
  duckdb_connection connection = quack_open_connection(db);
  duckdb_query(connection, queryDesc->sourceText, &result)
  slot = MakeTupleTableSlot(queryDesc->tupDesc, &TTSOpsHeapTuple);
  row_count = duckdb_row_count(&result);//行数
  column_count = duckdb_column_count(&result);//列数
  for(idx_t row = 0; row < row_count; row++){
    ExecClearTuple(slot);
    for(idx_t col = 0; col < column_count; col++){
      if (duckdb_value_is_null(&result, col, row))
        slot->tts_isnull[col] = true;
      else{
        slot->tts_isnull[col] = false;
        quack_read_result(slot, &result, col, row);
      }
    }
    ExecStoreVirtualTuple(slot);
    dest->receiveSlot(slot, dest);//一行发送给用户
    释放该行的所有列
  }
  ...

4、DDL的hook

php 复制代码
quack_process_utility->quack_execute_query:使用duckdb api执行
  //database目录quack_data_dir/"databaseOid".duckdb
  db = quack_open_database(MyDatabaseId, true);//创建/打开一个新的database
  duckdb_connect(db, &connection)//连接该database
  duckdb_query(connection, query, NULL);//执行
  duckdb_disconnect(&connection);//断开连接

主要利用duckdb的API进行操作。

5、duckdb表访问方法的hook

表访问方法如下:

cpp 复制代码
static const TableAmRoutine quack_am_methods = {
  .type = T_TableAmRoutine,


  .slot_callbacks = quack_slot_callbacks,


  .scan_begin = quack_begin_scan,
  .scan_end = quack_end_scan,
  .scan_rescan = quack_rescan,
  .scan_getnextslot = quack_getnextslot,


  .parallelscan_estimate = quack_parallelscan_estimate,
  .parallelscan_initialize = quack_parallelscan_initialize,
  .parallelscan_reinitialize = quack_parallelscan_reinitialize,


  .index_fetch_begin = quack_index_fetch_begin,
  .index_fetch_reset = quack_index_fetch_reset,
  .index_fetch_end = quack_index_fetch_end,
  .index_fetch_tuple = quack_index_fetch_tuple,


  .tuple_fetch_row_version = quack_fetch_row_version,
  .tuple_tid_valid = quack_tuple_tid_valid,
  .tuple_get_latest_tid = quack_get_latest_tid,


  .tuple_satisfies_snapshot = quack_tuple_satisfies_snapshot,
  .index_delete_tuples = quack_index_delete_tuples,




  .tuple_insert = quack_tuple_insert,
  .tuple_insert_speculative = quack_tuple_insert_speculative,
  .tuple_complete_speculative = quack_tuple_complete_speculative,
  .multi_insert = quack_multi_insert,
  .tuple_delete = quack_tuple_delete,
  .tuple_update = quack_tuple_update,
  .tuple_lock = quack_tuple_lock,
  .finish_bulk_insert = quack_finish_bulk_insert,


  .relation_set_new_filenode = quack_relation_set_new_filenode,
  .relation_nontransactional_truncate = quack_relation_nontransactional_truncate,
  .relation_copy_data = quack_relation_copy_data,
  .relation_copy_for_cluster = quack_relation_copy_for_cluster,
  .relation_vacuum = quack_vacuum_rel,
  .scan_analyze_next_block = quack_scan_analyze_next_block,
  .scan_analyze_next_tuple = quack_scan_analyze_next_tuple,
  .index_build_range_scan = quack_index_build_range_scan,
  .index_validate_scan = quack_index_validate_scan,


  .relation_size = quack_relation_size,
  .relation_needs_toast_table = quack_relation_needs_toast_table,


  .relation_estimate_size = quack_estimate_rel_size,


  .scan_bitmap_next_block = NULL,
  .scan_bitmap_next_tuple = NULL,
  .scan_sample_next_block = quack_scan_sample_next_block,
  .scan_sample_next_tuple = quack_scan_sample_next_tuple
};

这样就将duckdb以表访问方法的方式加入PgSQL了

参考

https://github.com/hydradatabase/pg_quack

https://github.com/duckdb/duckdb/

相关推荐
无心水1 小时前
【分布式利器:RocketMQ】2、RocketMQ消息重复?3种幂等方案,彻底解决重复消费(附代码实操)
网络·数据库·rocketmq·java面试·消息幂等·重复消费·分布式利器
q***98522 小时前
基于人脸识别和 MySQL 的考勤管理系统实现
数据库·mysql
l1t2 小时前
用SQL求解advent of code 2024年23题
数据库·sql·算法
办公解码器3 小时前
Excel工作表打开一次后自动销毁文件,回收站中都找不到
数据库·excel
爬山算法4 小时前
Redis(127)Redis的内部数据结构是什么?
数据结构·数据库·redis
应用市场4 小时前
Qt QTreeView深度解析:从原理到实战应用
开发语言·数据库·qt
q***96584 小时前
Spring Data JDBC 详解
java·数据库·spring
Hello,C++!4 小时前
linux下libcurl的https简单例子
linux·数据库·https
合方圆~小文5 小时前
高性能20倍变焦球机转动功能监控设备
数据结构·数据库·数码相机·模块测试
q***58196 小时前
【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串
数据库·sql·mysql