DuckDB:详细解读 TableRef 类

DuckDB 为什么这么快? 在我们的第二个管道中,我们对sale表进行了两次部分扫描,第一次扫描表的前半部分,第二次扫描表的后半部分。读取一行输入,第一个值保持不变,将输入的第二个和第三个值相加的结果 作为 输出中的第二个值 ,然后写出输出。最后,我谈到了 DuckDB 的并行模型:Morsel-Driven 并行支持跨任意数量核心的高效并行化,同时保持对多核处理的感知,从而有助于 DuckDB 的整体性能和效率。如果没有找到具有特定名称的表,我们会搜索具有该名称的其他实体,例如 Parquet 文件,直接对其执行查询。 阅读详情

目录

TableRef 的设计及实现

设计思想

实现剖析

1)类的定义与结构

1.1 构造函数与析构函数

1.2 成员变量

1.3 关于SampleOption

1.4 关于query_location

2)多态与虚函数

2.1 ToString()

2.2 Equals()

2.3 Copy()

2.4 Serialize() 和 Deserialize()

3) 模板方法 Cast()

TableRef 的子类实现与应用场景

1. BaseTableRef

2. SubqueryRef

3. JoinRef

4. TableFunctionRef

5. EmptyTableRef

关于 TableFunctionRef

TableFunctionRef 的作用

表函数的定义与注册

表函数的执行

示例:表函数的使用

支持投影下推

小结

总结


在 DuckDB 的架构中,TableRef 是一个核心组件,用于表示查询中的表引用。它不仅是一个抽象基类,还通过多种子类实现支持了复杂多样的表引用场景。本文将从源码层面深入分析 TableRef 的设计思想及其子类的实现细节。

TableRef 的设计及实现

设计思想

TableRef 是一个抽象基类,用于表示查询中的表引用。它在解析 SQL 查询时被定义,并在后续的绑定和优化阶段中被进一步处理。TableRef 的设计思想主要体现在以下几个方面:

1)抽象性与扩展性

TableRef 是一个抽象类,定义了表引用的基本接口和行为。通过继承 TableRef,DuckDB 实现了多种具体的表引用类型,例如:

  • BaseTableRef:表示普通表引用。

  • SubqueryRef:表示子查询引用。

  • JoinRef:表示连接操作的表引用。

  • TableFunctionRef:表示通过表函数生成的表引用。

  • EmptyTableRef:空表引用

这种设计使得 DuckDB 能够灵活地处理各种复杂的查询场景。

2)模块化与解耦

TableRef 的设计将表引用逻辑与查询解析、执行计划生成等模块分离。这种解耦使得 DuckDB 的代码更加模块化,便于维护和扩展。

3)支持多种数据源

通过 TableRef 的子类实现,DuckDB 能够支持多种数据源,包括本地表、内存表、外部表以及通过表函数生成的虚拟表。

实现剖析

TableRef是个多态类,通过继承和多态机制支持多种表引用类型(如普通表、子查询、表函数等)。以下是对 TableRef 类及其设计思想的详细分析:

1)类的定义与结构

namespace duckdb {

//! Represents a generic expression that returns a table.
class TableRef {
public:
	static constexpr const TableReferenceType TYPE = TableReferenceType::INVALID;

public:
	explicit TableRef(TableReferenceType type) : type(type) {
	}
	virtual ~TableRef() {
	}

	TableReferenceType type;
	string alias;
	//! Sample options (if any)
	unique_ptr<SampleOptions> sample;
	//! The location in the query (if any)
	optional_idx query_location;
	//! External dependencies of this table function
	shared_ptr<ExternalDependency> external_dependency;
	//! Aliases for the column names
	vector<string> column_name_alias;

public:
	//! Convert the object to a string
	virtual string ToString() const = 0;
	string BaseToString(string result) const;
	string BaseToString(string result, const vector<string> &column_name_alias) const;
	void Print();

	virtual bool Equals(const TableRef &other) const;
	static bool Equals(const unique_ptr<TableRef> &left, const unique_ptr<TableRef> &right);

	virtual unique_ptr<TableRef> Copy() = 0;

	//! Copy the properties of this table ref to the target
	void CopyProperties(TableRef &target) const;

	virtual void Serialize(Serializer &serializer) const;
	static unique_ptr<TableRef> Deserialize(Deserializer &deserializer);

public:
	template <class TARGET>
	TARGET &Cast() {
		if (type != TARGET::TYPE && TARGET::TYPE != TableReferenceType::INVALID) {
			throw InternalException("Failed to cast constraint to type - constraint type mismatch");
		}
		return reinterpret_cast<TARGET &>(*this);
	}

	template <class TARGET>
	const TARGET &Cast() const {
		if (type != TARGET::TYPE && TARGET::TYPE != TableReferenceType::INVALID) {
			throw InternalException("Failed to cast constraint to type - constraint type mismatch");
		}
		return reinterpret_cast<const TARGET &>(*this);
	}
};
} // namespace duckdb
1.1 构造函数与析构函数
  • TableRef 的构造函数接受一个 TableReferenceType 参数,用于初始化 type 属性。TableReferenceType 是一个枚举类型,用于区分不同的表引用类型(如普通表、子查询、表函数等)。

  • 析构函数是虚函数,这表明 TableRef 是一个多态类,允许派生类覆盖析构函数。

1.2 成员变量
  • TableReferenceType type:表示表引用的类型

    代码中实际支持的表类型很多:
    enum class TableReferenceType : uint8_t {
    	INVALID = 0,         // invalid table reference type
    	BASE_TABLE = 1,      // base table reference
    	SUBQUERY = 2,        // output of a subquery
    	JOIN = 3,            // output of join
    	TABLE_FUNCTION = 5,  // table producing function
    	EXPRESSION_LIST = 6, // expression list
    	CTE = 7,             // Recursive CTE
    	EMPTY_FROM = 8,      // placeholder for empty FROM
    	PIVOT = 9,           // pivot statement
    	SHOW_REF = 10,       // SHOW statement
    	COLUMN_DATA = 11,    // column data collection
    	DELIM_GET = 12       // Delim get ref
    };

    但我们比较常用的主要是这几类:

    • BASE_TABLE:表示普通表引用

    • SUBQUERY:表示子查询引用

    • JOIN:表示连接操作的表引用

    • TABLE_FUNCTION:表示通过表函数生成的表引用

    • EMPTY_FROM:表示来自空表

  • string alias:表的别名,用于查询中引用。

  • unique_ptr<SampleOptions> sample:用于存储采样选项(如果有的话)。这可能是用于优化查询的采样策略。

  • optional_idx query_location:表示表引用在SQL查询语句中的位置(例如,解析时的行号或列号)。

  • shared_ptr<ExternalDependency> external_dependency:表示表引用的外部依赖。主要应用于表函数类型场景,用于获取外部扩展,优雅引入依赖项。关于外部依赖项的扩展细节,可以参考:依赖管理在 DuckDB 扩展中的应用

  • vector<string> column_name_alias:列名的别名集合,用于在查询中重命名列。

1.3 关于SampleOption

在 DuckDB 中,SampleOptions 是用于定义采样操作的配置选项。采样允许用户从数据集中随机选择一个子集,从而在探索数据时提高查询效率。

采样方法

DuckDB 支持以下三种采样方法:

  1. Reservoir Sampling:用于精确采样固定数量的行。例如:

    SELECT * FROM tbl USING SAMPLE reservoir(50 ROWS);

    这种方法支持精确采样,但可能需要更多计算资源。

  2. Bernoulli Sampling:基于概率独立地对每一行进行采样。例如:

    SELECT * FROM tbl USING SAMPLE 10 PERCENT (bernoulli);

    这种方法适用于较小的数据集。

  3. System Sampling:基于向量(通常是 1024 行)的概率进行采样。例如:

    SELECT * FROM tbl USING SAMPLE 10%;

    这是默认的采样方法,适用于较大的数据集。

采样选项的用途

采样在以下场景中非常有用:

  1. 快速探索数据:当用户只需要大致了解数据的分布时,采样可以显著提高查询速度。

  2. 优化查询性能:通过减少处理的数据量,采样可以加速查询执行。

  3. 数据预览:在数据探索阶段,采样可以帮助用户快速获取数据的概览。

通过这些采样方法和选项,DuckDB 提供了灵活且高效的数据探索和分析能力。

1.4 关于query_location

query_location 是一个成员变量,用于记录表引用在查询中的位置信息。具体来说,query_location 是一个 optional_idx 类型的变量,表示表引用在查询字符串中的位置(通常是行号或列号)。它的主要作用是帮助调试和错误报告。

query_location 的含义

  1. 调试和错误报告
    当查询解析失败或执行时出现问题时,query_location 可以帮助定位问题的来源。通过记录表引用在查询字符串中的具体位置,DuckDB 可以为用户提供更详细的错误信息,指出问题出现在查询的哪一行或哪一列。

  2. 优化器和查询计划
    在某些情况下,query_location 也可以用于优化器的决策过程。例如,优化器可能会根据表引用在查询中的位置来调整查询计划的生成顺序。

  3. 用户友好的错误提示
    当用户提交的查询存在语法错误或逻辑问题时,query_location 可以帮助生成更友好的错误提示。例如:

    SELECT * FROM non_existent_table;

    如果 non_existent_table 不存在,DuckDB 可以利用 query_location 提供类似以下的错误信息:

    Error: Table "non_existent_table" does not exist. (at line 1, column 14)

optional_idx 的含义

optional_idx 是一个可选的索引类型,通常用于表示可能为空的位置信息。它可能是 std::optional 或类似的数据结构,用于在表引用没有明确的位置信息时提供默认值(例如 std::nullopt)。

示例

假设我们有以下查询:

SELECT * FROM my_table WHERE column_name = 'value';

在这个查询中,my_table 是一个表引用。如果 query_location 被设置为 (1, 14),则表示 my_table 的引用位于查询字符串的第 1 行、第 14 列。


2)多态与虚函数

TableRef 是一个多态类,通过虚函数支持多态行为。以下是关键的虚函数:

2.1 ToString()
virtual string ToString() const = 0;
  • 这是一个纯虚函数,要求派生类实现。它用于将 TableRef 对象转换为字符串表示,便于调试和日志记录。

  • BaseToString() 是一个辅助函数,用于在派生类中生成基础的字符串表示。

2.2 Equals()
virtual bool Equals(const TableRef &other) const;
static bool Equals(const unique_ptr<TableRef> &left, const unique_ptr<TableRef> &right);
  • 这个函数用于比较两个 TableRef 对象是否相等。它在查询优化和等价性检查中非常有用。

  • 静态版本的 Equals() 允许比较两个智能指针指向的 TableRef 对象。

2.3 Copy()
virtual unique_ptr<TableRef> Copy() = 0;
  • 这是一个纯虚函数,要求派生类实现。它用于创建 TableRef 对象的深拷贝,便于在查询优化和计划生成中复制表引用。

2.4 Serialize() 和 Deserialize()
virtual void Serialize(Serializer &serializer) const;
static unique_ptr<TableRef> Deserialize(Deserializer &deserializer);
  • 这些函数用于序列化和反序列化 TableRef 对象,支持将表引用持久化或在网络中传输。


3) 模板方法 Cast()

template <class TARGET>
TARGET &Cast() {
    if (type != TARGET::TYPE && TARGET::TYPE != TableReferenceType::INVALID) {
        throw InternalException("Failed to cast constraint to type - constraint type mismatch");
    }
    return reinterpret_cast<TARGET &>(*this);
}
  • Cast() 是一个模板方法,用于将 TableRef 对象强制转换为派生类类型。

  • 它通过检查 type 和 TARGET::TYPE 是否匹配来确保类型安全。

  • 如果类型不匹配,会抛出异常。这在运行时动态检查类型时非常有用。

TableRef 的子类实现与应用场景

TableRef 的子类在 DuckDB 中扮演着具体的表引用角色,以下是一些主要的子类及其应用场景。

1. BaseTableRef

BaseTableRef 是 TableRef 的一个子类,用于表示普通的基表引用。它是最简单的表引用类型,直接指向数据库中的某个物理表。

在源码中,BaseTableRef 的定义如下:

struct BaseTableRef : public TableRef {
    string schema_name;
    string table_name;
    vector<string> column_names;
};
  • schema_name 和 table_name 用于标识表的位置。

  • column_names 用于指定查询中涉及的列。

应用场景:

  • 查询数据库中的物理表,例如 SELECT * FROM table_name。

  • 作为其他复杂查询的基础表引用。

2. SubqueryRef

SubqueryRef 表示子查询引用。它允许用户在查询中嵌套子查询,并将其作为表的一部分进行处理。

在源码中,SubqueryRef 的定义如下:

struct SubqueryRef : public TableRef {
    unique_ptr<QueryNode> subquery;
    string alias;
};
  • subquery 是嵌套的子查询。

  • alias 是子查询的别名。

应用场景:

  • 在 FROM 子句中嵌套子查询,例如 SELECT * FROM (SELECT * FROM table_name WHERE condition) AS subquery。

  • 实现复杂的查询逻辑,如分组、聚合等。

3. JoinRef

JoinRef 是用于表示表连接操作的表引用。它支持多种连接类型,如内连接、外连接等。

在源码中,JoinRef 的定义如下:

struct JoinRef : public TableRef {
    unique_ptr<TableRef> left;
    unique_ptr<TableRef> right;
    JoinType join_type;
    unique_ptr<ParsedExpression> condition;
};
  • left 和 right 是连接的左右表引用。

  • join_type 指定连接类型(如 INNER JOIN、LEFT JOIN 等)。

  • condition 是连接条件。

应用场景:

  • 实现表之间的连接操作,例如 SELECT * FROM table1 JOIN table2 ON table1.id = table2.id。

  • 支持复杂的多表连接查询。

4. TableFunctionRef

TableFunctionRef 表示通过表函数生成的虚拟表。表函数是一种特殊的函数,可以在查询的 FROM 子句中被调用。

在源码中,TableFunctionRef 的定义如下:

struct TableFunctionRef : public TableRef {
    string function_name;
    vector<unique_ptr<ParsedExpression>> arguments;
};
  • function_name 是表函数的名称。

  • arguments 是表函数的参数。

应用场景:

  • 使用表函数生成动态数据,例如 SELECT * FROM table_function()。

  • 支持用户自定义的表函数,扩展数据库的功能。

5. EmptyTableRef

EmptyTableRef 是一个特殊的表引用,表示一个空表。它通常用于某些查询优化场景。

在源码中,EmptyTableRef 的定义如下:

struct EmptyTableRef : public TableRef {};

它是一个空的表引用,不包含任何数据。

应用场景:

  • 在查询优化中,当某个表的引用不会产生任何数据时,可以使用 EmptyTableRef 来简化查询计划。

关于 TableFunctionRef

其他类型的表类型大家都比较熟悉,我么这里着重说下 TABLE_FUNCTION 类型表

在 DuckDB 中,TableFunctionRef 是一个用于表示表函数引用的类。表函数是一种特殊的函数,可以在 SQL 查询的 FROM 子句中被调用,并返回一个表结构的结果。这种机制允许用户通过自定义函数生成动态数据,从而扩展数据库的功能。

TableFunctionRef 的作用

TableFunctionRef 是 TableRef 的子类,用于表示通过表函数生成的表引用。它允许用户在查询中使用自定义的表函数,这些函数可以基于输入参数动态生成数据。例如:

SELECT * FROM my_table_function(param1, param2);

在这个例子中,my_table_function 是一个表函数,它接受参数 param1 和 param2,并返回一个表结构的结果。

表函数的定义与注册

表函数需要通过 C++ API 定义和注册到 DuckDB 中。以下是一个典型的表函数定义和注册流程:

  1. 创建表函数对象:

    duckdb_table_function table_function = duckdb_create_table_function();
  2. 设置表函数的名称和参数:

    duckdb_table_function_set_name(table_function, "my_table_function");
    duckdb_table_function_add_parameter(table_function, duckdb_logical_type(DUCKDB_TYPE_INTEGER));
  3. 定义绑定、初始化和主函数:

    • 绑定函数:用于在查询绑定阶段初始化表函数。

    • 初始化函数:用于在查询执行前初始化线程局部数据。

    • 主函数:用于实际生成表数据。

    duckdb_table_function_set_bind(table_function, my_bind_function);
    duckdb_table_function_set_init(table_function, my_init_function);
    duckdb_table_function_set_function(table_function, my_function);
  4. 注册表函数:

    duckdb_register_table_function(connection, table_function);

表函数的执行

当表函数被调用时,DuckDB 会依次调用绑定、初始化和主函数:

  1. 绑定阶段:绑定函数用于解析参数并设置表函数的输出列。

  2. 初始化阶段:初始化函数用于为每个线程分配局部数据。

  3. 执行阶段:主函数用于生成表数据。

示例:表函数的使用

以下是一个简单的表函数示例,假设我们定义了一个名为 generate_series 的表函数,它生成一个数字序列:

-- 调用表函数生成数字序列
SELECT * FROM generate_series(1, 10);

支持投影下推

表函数可以支持投影下推(Projection Pushdown),这意味着查询优化器可以将查询中需要的列信息传递给表函数,从而减少不必要的计算。

小结

TableFunctionRef 是 DuckDB 中用于表示表函数引用的核心类。它允许用户通过自定义表函数动态生成数据,并在查询中使用这些函数。通过定义和注册表函数,用户可以扩展 DuckDB 的功能,实现复杂的动态数据处理。

总结

TableRef 及其子类的设计体现了 DuckDB 对灵活性、扩展性和模块化的追求。通过抽象基类和多种子类的实现,DuckDB 能够高效地处理各种复杂的查询场景,支持多种数据源和查询逻辑。这种设计不仅提升了系统的可维护性,也为开发者提供了强大的功能扩展能力。

在未来,随着 DuckDB 的不断发展,TableRef 的设计可能会进一步优化,以支持更多复杂的数据处理场景和性能优化需求。

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法 阅读详情

相关推荐

jaka+realsense+aruco+手眼标定(python)

第二次重建了项目的手眼标定部分……有很多第一次记录遗漏的地方,在此补充。

drivenzyw的博客 2122

编译C/C++程序使用duckDB例子

年轻的数据库,程序内置的数据库, 只能单进程使用,支持内存模式和文件模式。一些场景适用,快就完了。 数据库使用的小例子。

jacicson1987的专栏 1177

零中频架构实战:用Matlab模拟AD9361收发信号(附完整代码)

本文详细介绍了如何使用Matlab模拟AD9361射频收发器的零中频架构,解决镜像干扰等关键挑战。通过完整的代码示例和系统级建模方法,帮助工程师掌握RFIC设计中的自适应校准算法和性能优化技巧,特别适用于SDR系统开发。

weixin_30733003的博客 541

使用Table组件ref为空

在TabPane上设置属性forceRender为true即可。是因为table组件默认不渲染隐藏组件。

weixin_69903461的博客 503

XPe开发初体验(一)XPe概述

XP Embedded是微软Windows Embedded产品线中非常重要的一环,不过比起大名鼎鼎的Windows Embedded CE,XPe显得过于低调了。在接下来的一段时间里,我希望能够用六篇的篇幅来描述一下XPe的整个开发过程。这个系列文章主要是针对有Windows编程经验,但是没有嵌入式开发经验的开发者,提供一些概念和开发过程的初步介绍。XP Embedded是一个基于Windo

aawolf = new Mobile.MVP 1万+

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

通过ref让element-ui的表格高度自适应

首先在table上绑定ref <template> <el-table ref="tableRef" :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" width...

weixin_43064669的博客 1439

Win10无外网热点搭建全指南:纯局域网通信与设备互联

热点并不是只有共享上网一种用途。在很多工程与办公场景中,我们需要的是让手机、笔记本、开发板等设备临时组成一个纯内网,完成文件传输、端口调试或局域网联机,而不需要任何外网出口。Win10笔记本在不连接互联网的状态下,借助系统移动热点或netsh承载网络,完全可以创建一个无外网热点,实现设备间二层互通。其核心在于利用SoftAP建立虚拟无线接入点,并绕开或禁用ICS的NAT转发。掌握这一技术,可在会议、出差、物联网调试等场景中快速搭建临时局域网,无需额外路由器。本文详细梳理三种实现路径、操作步骤及常见故障排查,

weixin_29230773的博客 238

Vue3的原生table导出及父组件调用子组件中的方法

Vue3的原生table导出及父组件调用子组件中的方法

weixin_50478033的博客 854

【YOLOv11工业级实战】27. TensorRT量化实战:FP16/INT8极致加速!边缘设备YOLOv11推理速度提升4倍,精度损失控制在1.5%内

摘要:本文针对智慧园区200路摄像头实时分析的工业痛点——RTX 3080单卡仅能处理12路视频流(YOLOv11-nano FP32精度45FPS,需≥120FPS且精度损失≤3%),提供TensorRT量化完整解决方案。从原理解析(FP16/INT8精度差异与量化逻辑)到实操落地(ONNX转换、FP16引擎构建、INT8精细校准),全程给出可复用代码。实测显示:FP16量化后速度达128FPS(×2.8),精度损失0.2%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1719

YOLOv11改进 - C3k2融合 | C3k2融合细节增强卷积DEConv(Detail-Enhanced Convolution)提升细微特征提取能力

本文介绍了细节增强卷积(DEConv)技术在YOLOv11中的结合应用。DEConv由标准卷积层和多种差异卷积层并行组成,通过计算像素差异和卷积操作增强特征提取能力,还采用重参数化技术简化模型结构。其优势在于能更好捕捉高频信息、保持参数数量不变且降低推理计算成本。我们将DEConv集成进YOLOv11,替换部分模块。

魔改工程师的博客 862

explain all 怎么优化_MySQL Explain详解,添加索引sql优化

EXPLAIN语法(获取SELECT相关信息)EXPLAIN tbl_name 或:EXPLAIN [EXTENDED] SELECT select_options 当我们使用select查询时发现很慢,所有通过我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。EXPLAIN为用于SEL...

weixin_39767386的博客 545

通过实例讲解瀑布模型

在电子商城开发中,瀑布模型如同 “工业时代的流水线”—— 能通过标准化流程交付高质量、高合规性的系统,但也可能因缺乏灵活性而错失市场机会。其优势与缺点本质上源于同一核心特征:严格的阶段性与文档驱动。决策建议若开发传统型、长周期、需求固定的电子商城(如企业内部采购平台),可优先选择瀑布模型,并通过 “需求预验证 + 模块化设计” 降低风险;若开发创新型、短周期、需快速迭代的电商平台(如社交电商、跨境电商),建议采用敏捷模型或混合模型(如瀑布 + Scrum),平衡规范性与响应速度。

跟佟格湾一起学习计算机知识吧~ 271

[超硬核] 5000字带走读DuckDB优化器之常量折叠与比较简化

DuckDB优化器之常量折叠与比较简化本篇文章适合学习C++的小伙伴,适合阅读开源项目的小伙伴,更适合学习数据库的小伙伴,欢迎与我一起探索优化器知识。目录DuckDB优化器之常量折叠与比较简化1.优化器规则2.表达式重写2.1 重写/访问算子2.2 应用规则2.3 子表达式3.比较简化规则本节以一个SQL为例,揭秘DuckDB的优化器常量折叠与比较简化规则。ConstantFoldingRule常...

Francis的博客 612

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

vue组件中ref的用法

1/el-table中ref的用法: 普通用法: ref=“refs”  查找时使用this.$refs.refs 2/组件中ref的用法: &lt;child ref="childRef"&gt;&lt;/child&gt; 查找时this.$refs.childRef找到的是子组件 如果子组件里el-table不是唯一组件,this.$refs.childRef.$children[0]找到t...

juceli的博客 9371

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

sortablejs插件在el-table中的运用

sortablejs插件在el-table中的运用 概述需求 有一个Table表格,由于数据是根据自增的ID进行排序显示的,有时了调整顺序会在数据库中直接操作数据表,来达到调整数据顺序的目的,因为为了实现在页面实现较为简单的拖拽排序,因此展开讨论。 最后sortablejs插件可以满足需求并可以快捷的实现功能。 参看资料: 官网:http://www.sortablejs.com/ 中文文档:https://www.itxst.com/sortablejs/neuinffi.html 1、安装sorta

qq_50661854的博客 5203

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

手工生成DuckDB 1.4版c++插件的简单步骤

本文介绍了DuckDB扩展开发与测试的简化流程。首先下载扩展模板和DuckDB 1.4版的动态库,解压到指定目录。在编译阶段通过注释重复包含的头文件解决报错问题,并使用动态库进行编译。然后通过Python脚本添加元数据并生成扩展文件。测试时需设置LD_LIBRARY_PATH环境变量以加载动态库。与官方方法相比,此流程省去了编译DuckDB源码的时间。实验表明,使用静态库编译会导致文件体积增大且仍存在符号缺失问题,因此推荐使用动态库方案。开发测试完成后,可再按官方步骤执行正式发布。

l1t的专栏 742

Vue -- 当 el-table 中没有数据被选中时,删除键不可用 & ref 在 el-table 中的使用

html <div style="width: 100%;margin-bottom:7px;margin-top:1px"> <el-button icon="el-icon-plus" size="mini" :title="$t('btn.add')" @click="addAppTemplate"></el-button> <el-button...

支棱起来 1579

DuckDB快速入门教程

本地化​ 首先,DuckDB是进程内单文件数据库,没有外部依赖关系。这是什么意思?与Postgres不同,它不需要设置客户端/服务器,也不需要安装外部依赖项。此外,客户端与服务端之间的数据传输速度比正常情况下要慢。另一方面,DuckDB嵌入到主机应用程序进程中,并管理存储在单个文件中的数据库。没有客户机/服务器,安装起来很简单。如果你需要运行DB来进行本地数据分析,那么它就是你的选择!性能​ 其次,DuckDB针对分析查询工作负载(OLAP)进行了高度优化。

neweastsun的专栏 6662

DuckDB全面挑战SQLite

如果查看 DuckDB 的网站,在其主页上看到的第一件事就是:DuckDB 是一个进程内 SQL OLAP 数据库管理系统。让我们尝试解读这句话,因为它包含相关信息。• 进程内 SQL 意味着 DuckDB 的功能在应用程序中运行,而不是在应用程序连接的外部进程中运行。换句话说:没有客户端发送指令,也没有服务器读取和处理它们。与 SQLite 的工作方式相同,而 PostgreSQL、MySQL……则不然。• OLAP 代表在线分析处理,微软将其定义为组织大型业务数据库并支持复杂分析的技术。

Rocky006的博客 7523

DuckDB:Catalog、Schema、Table 数据组织结构简介

DuckDB 的 Catalog、Schema 和 Table 提供了一种强大的数据组织和管理机制。通过合理使用 Catalog 和 Schema,可以有效地隔离和管理数据,提高数据的可维护性和可访问性。希望这些内容能帮助你更好地理解和使用 DuckDB 的 Catalog、Schema 和 Table。如果你有更多问题,可以参考 DuckDB 的官方文档或加入 DuckDB 的社区获取更多帮助。

Whoisbug的博客 1491

熬夜三晚之深度解析DuckDB MetaPipeline

深度解析DuckDB MetaPipeline深度解析DuckDB MetaPipeline1.导语2.基础理论3.HashJoin深度解析3.1 RESULT_COLLECTOR3.2 PROJECTION3.3 HASH_JOIN4.Ready4.1 翻转4.2 MetaPipeli...

Francis的博客 1558

盘点新生代数据库选手之 DuckDB

说实话 4 亿美金的估值已经不低了,按照现在资本对 SaaS 类产品的要求,至少要营收达到 2、3 千万美金才能匹配现在现有的估值,这个营收如果是在国内,已经是数据库创业公司们的天花板了,在海外可能还有希望。三是非常简单的安装方式和可移植性,得益于历史包袱少,第三方依赖少,对接 Python 非常方便,使用简单的 pip 命令就可以安装并且使用。四是 SQL 支持好,每家数据库都有自己的 SQL 方言,也就 PostgreSQL 的 SQL 是最标准的,其他的要么加了很多私货,要么是很多函数、语法不支持。

2301_77194443的博客 1301

数据库浅谈之 DuckDB AGG 底层实现

DuckDB AGG 聚合算子底层实现

优质后端技术知识记录 2669

DuckDB与C++集成:高性能应用开发的API使用指南

你是否在寻找一种能嵌入到C++应用中的高性能数据库解决方案?DuckDB作为一款嵌入式分析型数据库,提供了零依赖、高性能的特性,非常适合集成到C++应用中。本文将详细介绍如何在C++项目中集成DuckDB,包括环境配置、核心API使用以及实际案例演示,读完你将能够快速上手DuckDB的C++开发。 ## 环境配置与项目构建 ### CMake配置文件设置 DuckDB提供了简单的CMake配...

gitblog_00356的博客 943

使用duckdb

在读取该字段时其不能直接使用 duckdb_decimal 类型进行读取,因为其数据块中存储的字段的实际类型是int16,int32,int64或hugeint,具体使用那种类型的整型与定义的decimal的宽度有关,需要使用对应的整型类型来读取,然后通过对 duckdb_decimal 类型构造复制来获得对于的demical类型,要转为double类型,还需要调用 duckdb_decimal_to_double 函数进行转换。最近研究了一下duckdb的使用,也是踩了一些坑,这里记录一下。

xunmeng2002的专栏 1639
上一篇: 依赖管理在 DuckDB 扩展中的应用
下一篇: DuckDB:灵活扩展机制
Whoisbug
博客等级 码龄9年 894粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值