当前位置: 首页 > news >正文

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态,并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。

DuckDB PRAGMA介绍

在 DuckDB 中,PRAGMA 是一种编译指示(compiler directive),它是一种特殊的指令,用于配置数据库的各种内部设置、行为和特性。这些指令可以影响数据库的性能、资源使用、输出显示等诸多方面,就像是为数据库引擎提供了一系列的控制开关和微调旋钮。

在这里插入图片描述

PRAGMA特点

  • 语法简单

    PRAGMA 的语法相对简洁明了。通常使用PRAGMA关键字加上具体的指令名称和相应的参数(如果需要)来使用。例如,PRAGMA memory_limit='1GB';用于设置内存限制,这种语法形式易于理解和使用,即使对于新手用户也能比较快速地掌握如何配置一些基本的数据库设置。

  • 动态配置性

    许多 PRAGMA 可以在数据库会话过程中动态设置和调整。这意味着用户可以根据具体的查询任务、数据规模和系统资源状况实时改变数据库的行为。与一些数据库中需要修改配置文件并重新启动数据库才能生效的设置相比,DuckDB 的 PRAGMA 提供了更高的灵活性。例如,在处理一个特别复杂且内存密集型的查询时,可以先增加内存限制,然后在查询完成后再将其恢复。

  • 针对性强

    PRAGMA 主要是针对 DuckDB 自身的运行特性进行配置。它聚焦于数据库引擎内部的关键要素,如内存管理、查询执行机制、输出控制等,不像一些数据库的配置选项可能涉及到更广泛的领域(如数据库的网络连接、安全认证等方面)。这使得用户可以更精准地对 DuckDB 的性能和行为进行优化和控制。

PRAGMA作用

  1. 资源管理作用

    • 内存管理

      通过PRAGMA memory_limit来控制数据库可使用的内存量。这对于防止内存过度占用至关重要,特别是在处理大型数据集或者复杂查询时。例如,在一个资源有限的服务器上运行 DuckDB,如果不限制内存使用,可能会导致系统内存耗尽,而通过合理设置PRAGMA memory_limit,可以确保数据库在给定的内存范围内高效运行。

    • 线程控制

      PRAGMA threads指令允许用户设置数据库在执行查询时所使用的线程数量。在多核处理器环境下,合理配置线程数可以充分利用 CPU 资源,加速查询的执行。例如,对于一个可以并行处理的数据分析任务,增加线程数可以使 DuckDB 同时处理多个数据子集,从而缩短整体的查询时间。

  2. 性能优化作用

    • 查询性能分析

      PRAGMA enable_profiling用于开启查询性能分析功能。当开启这个功能后,DuckDB 会收集查询执行过程中的详细性能数据,例如各个操作的执行时间、数据读取和写入的量等。这些数据存储在特定的表(如duckdb_profiles)中,通过查询这个表,用户可以深入了解查询的性能瓶颈,进而对查询进行优化。例如,如果发现某个连接操作(JOIN)在查询执行过程中占用了大量时间,就可以考虑优化表结构或者连接条件。

    • 优化执行策略(部分情况)

      虽然目前公开的直接用于控制查询执行策略的 PRAGMA 相对有限,但在未来或者通过一些间接方式,PRAGMA 可能会用于引导查询执行计划的生成。例如,影响优化器对于索引的使用策略、子查询的展开方式等,从而使查询能够以更高效的方式执行。

  3. 用户体验和输出控制作用

    • 进度条显示控制

      PRAGMA disable_progress_bar可以用于控制在执行长时间查询时是否显示进度条。在自动化脚本或者不需要可视化进度反馈的场景下,禁用进度条可以减少不必要的输出,使脚本的输出更加简洁。而在需要用户观察查询进度的情况下,又可以方便地重新启用进度条。

    • 潜在的输出格式控制

      虽然目前 DuckDB 在这方面的功能有限,但从发展的角度看,PRAGMA 可用于控制查询结果的输出格式。例如,有可能通过特定的 PRAGMA 来决定输出结果是按照传统的表格形式、JSON 格式还是其他自定义的格式,以满足不同用户场景和与其他系统交互需求。

PRAGMA 示例

设置内存限制

假设你正在处理一个可能占用大量内存的数据加载任务,并且你的系统内存有限。你可以使用PRAGMA memory_limit来限制 DuckDB 使用的内存量。例如,要将内存限制设置为 2GB(2 * 1024 * 1024 * 1024 字节),可以在 DuckDB 客户端或脚本中执行以下命令:

# 设置内存限制
PRAGMA memory_limit='2147483648';# 查询内存限制
PRAGMA memory_limit;

没有 PRAGMA 语句时,数据库的许多配置参数可能是固定的,或者需要修改配置文件并重新启动数据库才能生效。例如在一些传统数据库中,要调整内存使用参数,可能需要编辑配置文件(如 PostgreSQL 的postgresql.conf文件),然后重启数据库服务。而 DuckDB 的 PRAGMA 语句可以在数据库运行过程中动态地改变数据库的行为。例如,通过PRAGMA memory_limit,可以根据当前的查询任务即时调整内存限制。如果正在执行一个小型查询,可将内存限制设置得较低;当遇到大型数据处理任务时,再动态增加内存限制,这为用户提供了很大的灵活性。

设置线程数量

当你在一个多核处理器的系统上运行 DuckDB,并且希望利用多核优势来加速查询执行时,可以使用PRAGMA threads来设置线程数。例如,若你的系统有 4 个核心,并且你想让 DuckDB 使用 4 个线程来执行查询,可以执行以下命令:

# 设置线程限制
PRAGMA threads=4;# 查看线程限制
PRAGMA threads;

开启性能分析

当你遇到一个执行速度较慢的查询,并且想要找出性能瓶颈时,可以开启查询性能分析。使用以下命令开启性能分析功能:

PRAGMA enable_profiling = true;

开启后,DuckDB 会在执行查询时收集性能数据。等你执行查询后,可以通过查询duckdb_profiles表来查看性能分析数据,如:

SELECT * FROM duckdb_profiles;

这个表中会包含诸如查询计划执行时间、各个操作符(如扫描操作、连接操作)的时间消耗等详细信息。通过分析这些数据,你可以确定哪个部分的查询执行花费了最多的时间,例如,如果发现连接操作花费的时间最长,你可以考虑优化表结构或者连接条件来提高性能。

查询元数据

  • 列出Schema信息:
# 列出所有数据库
PRAGMA database_list;
# 列出所有数据表
PRAGMA show_tables;# 列出所有表,类似describe 
PRAGMA show_tables_expanded;
  • 表信息
# 返回所有表的字段信息
PRAGMA table_info('table_name');
CALL pragma_table_info('table_name');

示例输出如下:

cid INTEGER,        -- cid of the column
name VARCHAR,       -- name of the column
type VARCHAR,       -- type of the column
notnull BOOLEAN,    -- if the column is marked as NOT NULL
dflt_value VARCHAR, -- default value of the column, or NULL if not specified
pk BOOLEAN          -- part of the primary key or not
  • 数据库大小
# 获取每个数据库的文件和内存大小:
SET database_size;
CALL pragma_database_size();

返回信息示例如下:

database_name VARCHAR, -- database name
database_size VARCHAR, -- total block count times the block size
block_size BIGINT,     -- database block size
total_blocks BIGINT,   -- total blocks in the database
used_blocks BIGINT,    -- used blocks in the database
free_blocks BIGINT,    -- free blocks in the database
wal_size VARCHAR,      -- write ahead log size
memory_usage VARCHAR,  -- memory used by the database buffer manager
memory_limit VARCHAR   -- maximum memory allowed for the database
  • 存储信息
# 获取表存储信息
PRAGMA storage_info('table_name');
CALL pragma_storage_info('table_name');

返回下面表格信息:

NameTypeDescription
row_group_idBIGINT
column_nameVARCHAR
column_idBIGINT
column_pathVARCHAR
segment_idBIGINT
segment_typeVARCHAR
startBIGINTThe start row id of this chunk
countBIGINTThe amount of entries in this storage chunk
compressionVARCHARCompression type used for this column – see the “Lightweight Compression in DuckDB” blog post
statsVARCHAR
has_updatesBOOLEAN
persistentBOOLEANfalse if temporary table
block_idBIGINTempty unless persistent
block_offsetBIGINTempty unless persistent

总结

本文介绍DuckDB的PRAGMA特点和作用,并通过示例展示了如何资源管理、查询元数据等。有关DuckDB的更多内置配置选项,请参阅配置参考。DuckDB扩展可以注册额外的配置选项。这些都在各自的扩展文档页面中进行了记录。该页包含支持的PRAGMA设置。

相关文章:

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态,并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中,PRAGMA 是一种编译指示(compiler directi…...

GO通过SMTP协议发送邮件

什么是SMTP协议 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用于发送邮件的协议。当一个邮件服务器需要发送邮件给另一个邮件服务器时,它会使用SMTP协议与目标服务器建立连接,并传输邮件内容。SMTP协议的…...

轻量自高斯注意力机制LSGAttention模型详解及代码复现

模型背景 近年来,卷积神经网络(CNN)在高光谱图像分类领域取得了显著进展。然而,CNN面临 长距离关系建模 和 计算成本 增加的挑战。为解决这些问题,研究人员提出了基于 轻量自高斯注意(Light Self-Gaussian-Attention, LSGA) 机制的视觉转换器(Vision Transformer, VIT),旨…...

解读若依框架中的`@Excel` 和 `@Excels` 注解

文章目录 一、Excels 注解详解1.1 适用场景1.2 作用与好处 二、Excel 注解详解2.1 核心属性解析2.2 高级用法2.3 综合应用案例 三、总结 解读若依框架中的 Xss 注解博客:解读若依框架中的 Xss 注解 接下来我们将对若依框架中的 Excel 和 Excels 注解进行更加详细的…...

云商城--基础数据处理和分布式文件存储

第2章 基础数据处理和分布式文件存储 1.分布式文件存储系统Ceph学习 ​ 1).掌握Ceph架构 ​ 2).掌握Ceph组件 ​ 3).搭建Ceph集群(了解) 2.Ceph使用 ​ 1).基于Ceph实现文件上传 ​ 2).基于Ceph实现文件下载 3.SKU、SPU管理 ​ 1).掌握SKU和SPU关系 ​ 2).理解商品发…...

六十九:基于openssl实战验证RSA

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,广泛应用于数据加密和数字签名领域。在实际开发和学习过程中,理解 RSA 的工作原理和使用场景非常重要。本文将以 OpenSSL 工具为基础,通过实例操作来验证和理解 RSA 的…...

Three.js 用户交互:构建沉浸式3D体验的关键

文章目录 前言一、基本交互:鼠标与触摸事件二、高级交互:键盘控制与游戏手柄支持三、物理模拟与碰撞检测四、手势识别与多点触控五、增强现实(AR)与虚拟现实(VR)六、触觉反馈与震动效果七、语音控制八、眼球…...

Android车机DIY开发之学习篇(五)默认应用修改

Android车机DIY开发之学习篇(五)默认应用修改 android默认应用位置 sdk/packages/apps InitRC配置 应用安装的目录 /system/priv-app 该路径存放一些系统底层的应用,比如Setting,systemUI等。该目录中的app拥有较高的系统权限,而且如果要使…...

linux 设置mysql 外网访问

1、修改 MySQL 配置文件 找到并编辑配置文件:在Linux系统中,MySQL的配置文件通常是/etc/mysql/my.cnf,使用命令sudo vim /etc/mysql/my.cnf打开文件。 注释或修改 bindaddress:找到bindaddress 127.0.0.1,将其注释掉…...

SQL UNION 操作符

SQL UNION 操作符 SQL UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它将多个结果集组合成一个单独的结果集,并去除重复的行。为了使用 UNION,每个 SELECT 语句必须具有相同的列数,并且对应列的数据类型必须兼容。 语法 SELECT c…...

c++ 17 constexpr

未来已来&#xff1a;从SFINAE到concepts #include <type_traits> #include <vector> #include <list> #include <iostream> // 一个通用的容器打印函数&#xff0c;支持任何带 begin()/end() 的容器 template<typename Container> …...

Java QueryWrapper groupBy自定义字段,以及List<Map>转List<Entity>

Java queryWrapper groupby自定义字段 String sql "data_id,(select value from lz_html a where a.data_id lz_html.data_id and class_nametest-item-status) status," "(select value from lz_html a where a.data_id lz_html.data_id and class_nametes…...

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试&#xff0c;就将测试的名称&#xff08;一个或多个&#xff09;作为cargo test的…...

Git:Cherry-Pick 的使用场景及使用流程

前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能&#xff0c;Cherry-Pick不是merge&#xff0c;只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介&#xff1a; git cherry-pick 是用来从一个分…...

Ubuntu 24.04 LTS系统安装Docker踩的坑

一开始我跟着Docker给出的官网文档 Ubuntu | Docker Docs 流程走&#xff0c;倒腾了两个多小时&#xff0c;遇到了各种坑&#xff0c;最后放弃了。在我们使用脚本安装Docker命令前&#xff0c;我们先把已经安装的Docker全部卸载掉。 卸载Docker 1.删除docker及安装时自动安装…...

工作生活的感悟

前言 这篇博客基本每年都更新&#xff0c;每年都有新的感悟&#xff0c;作为一个记录吧&#xff01;以后按照年来记录 2022年 不经意间&#xff0c;已在职场耕耘数载&#xff0c;特此记录以作回顾。 无用之用&#xff0c;方为大用&#xff1a; 年岁渐长&#xff0c;愈发体会…...

NCCL学习笔记-函数解析

前言 1.NCCL 是一个专注于 GPU 间高性能通信的库&#xff0c;不提供进程管理或安全通信功能。 2.用户需要依赖应用程序的进程管理系统&#xff08;如 MPI&#xff09;来管理进程&#xff0c;并确保 NCCL 在安全的网络环境中运行。 3.通过正确配置环境变量&#xff08;如 NCCL_…...

windows系统如何将基座大模型私有化部署

1.windows10系统 安装npm、node、 git 最新版本 安装vmware虚拟机 内存8GB以上 双核4线程 2.vmware虚拟机 安装ubuntu系统 22.04版本 3.进入ubuntu系统 3.1 安装Ollama 基座大模型工具 在命令行中执行 curl -fsSL https://ollama.com/install.sh | sh 浏览器打开 …...

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…...

CentOS 7 下 MySQL 5.7 的详细安装与配置

1、安装准备 下载mysql5.7的安装包 https://dev.mysql.com/get/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 下载后上传至/home目录下 2、mysql5.7安装 2.1、更新yum并安装依赖 yum update -y sudo yum install -y wget sudo yum install libaio sudo yum install perl su…...

【深度学习】数据预处理

为了能用深度学习来解决现实世界的问题&#xff0c;我们经常从预处理原始数据开始&#xff0c; 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中&#xff0c;我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样&#xff0c;pan…...

day01-HTML-CSS——基础标签样式表格标签表单标签

目录 此篇为简写笔记下端1-3为之前笔记&#xff08;强迫症、保证文章连续性&#xff09;完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...

无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型

无需昂贵GPU&#xff1a;本地部署开源AI项目LocalAI在消费级硬件上运行大模型 随着人工智能技术的快速发展&#xff0c;越来越多的AI模型被广泛应用于各个领域。然而&#xff0c;运行这些模型通常需要高性能的硬件支持&#xff0c;特别是GPU&#xff08;图形处理器&#xff09…...

搭建prometheus+grafana监控系统抓取Linux主机系统资源数据

Prometheus 和 Grafana 是两个非常流行的开源工具&#xff0c;通常结合使用来实现监控、可视化和告警功能。它们在现代 DevOps 和云原生环境中被广泛使用。 1. Prometheus 定义&#xff1a;Prometheus 是一个开源的系统监控和告警工具包&#xff0c;最初由 SoundCloud 开发&am…...

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…...

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…...

请求方式(基于注解实现)

1.编写web.xml文件配置启动信息 <!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app><display-name>Archetype Created Web Application</di…...

day38 tcp 并发 ,linux下的IO模型----IO多路复用

TCP 并发 由于tcp协议只能实现一对一的通信模式。为了实现一对多&#xff0c;有以下的的处理方式 1. 多进程 开销大 效率低 2. 多线程 创建线程需要耗时 3. 线程池 多线程模型创建线程耗时问题&#xff0c;提前创建 4. IO多路复用 在不创建进程和线程的前提下&#xff0c;对…...

更新Office后,LabVIEW 可执行程序生成失败

问题描述&#xff1a; 在计算机中&#xff0c;LabVIEW 开发的源程序运行正常&#xff0c;但在生成可执行程序时提示以下错误&#xff1a; ​ A VI broke during the build process from being saved without a block diagram. Either open the build specification to include…...

重塑视频创作的格局!ComfyUI-Mochi本地部署教程

一、介绍 mochi是近期Genmo公司开源的先进视频生成模型&#xff0c;具有高保真运动和强大的提示遵循性。此模型的发布极大的缩小了闭源和开源视频生成系统之间的差距。 目前&#xff0c;视频生成模型与现实之间存在巨大差距。其中最影响视频生成的两个关键功能也就是运动质量和…...

东莞樟木头网站设计/起名最好的网站排名

今天看到了一个Python库&#xff0c;名为markdown。瞬间就给了我一个灵感&#xff0c;那就是制作一个将markdown文件转换成html文件的小工具。 我的实验环境 操作系统&#xff1a; Windows 7 64位 旗舰版Python版本&#xff1a; 2.7.11IDE&#xff1a; PyCharm pro 2016.1所需…...

wordpress注册页制作/windows优化大师免费

博客园 :: 首页 :: :: 联系 :: :: 管理 6 Posts :: 14 Stories :: 29 Comments :: 0 Trackbacks公告 hibernate -- HQL语句总结1. 查询整个映射对象所有字段 //直接from查询出来的是一个映射对象&#xff0c;即&#xff1a;查询整个映射对象所有字段 String hql "fro…...

佛山新网站制作渠道/信息流广告代运营

今日头条视频去重复上传方法-网络营销推广教程如何完美去除视频字幕和LOGO批量下载快手西瓜视频如何快速去掉视频上的logo批量下载快手西瓜视频还有很多渠道也可以上传视频&#xff0c;比如微信公众号、AcFun、百度视频、凤凰自媒体、qq公众平台等等&#xff0c;但是这些平台基…...

建网站做点什么好/万网域名官网

题目 题目链接 题解 考查字符串的输入吧。 每次获取字符串后getchar一下就可以得到空格或回车。 注意输出每行后要多输出一个回车。 代码 #include<bits/stdc.h> using namespace std;string s; int cnt, n;int main() {cin >> n;while(cin>>s) {cout &…...

程序开发需要学什么/seo培训机构

https://blog.csdn.net/lizhihua0925/article/details/52595813​blog.csdn.net最近在研究Docker&#xff0c;正好也想学习一下Laravel&#xff0c;但每次laravel的部署很麻烦&#xff0c;所以正在研究了一下&#xff0c;做一下Docker镜像&#xff0c;感觉棒棒的~~~Dockerfilel…...

中国建设银行沈阳铁西支行网站/个人网页制作完整教程

古人很伟大&#xff0c;说了一句符合统计学原理的话。 如果以95%作为置信度&#xff0c;人刚生下来时&#xff0c;应该是有95%的概率是一个好人&#xff0c;5%的概率是个坏蛋。如果人之初&#xff0c;性本恶的话&#xff0c;你走在马路上&#xff0c;遇到100个人&#xff0c;会…...