1 架构:
三层软件架构:
SQL front-end:前端SQL解析,数据模型优化,降低数据中间结果的总量,最后将SQL语句解析为MAL(MonetDB Assembly Language)。
Tactical-optimizers:一系列优化模块的集合,组成优化管道,这个模块提供功能从符号处理到实时数据分发和执行。
Columnar abstract-machine kernel:列式内核
2 MAL
MonetDB Assembly Language(MAL)
MAL是SQL和XQuery前端查询的目标语言。
SQL语句通过语法解析解析成MAL,MAL在经过优化器优化,重写成优化后的MAL,提供给内核执行。
3 内核
执行内核是一个运行MAL语言的虚拟机。
复杂的查询被拆分成多个步骤,每个步骤操作一个列,叫bulk processing。所有的BAT操作被映射成简单的数组操作,一个并行处理引擎。
内核运行过程中会根据输入属性和系统状态选择合适的优化算法和实现来执行MAL语言。
运行过程中操作优化:会根据输入属性和系统状态选择合适的优化算法和实现。
4 特性:
列式存储模型:
在内存中数据都是以BAT(Binary Association Table) (OID,value) pairs形式存放,数据超过了内存和虚拟内存,使用磁盘存放文件,磁盘和内存通过内存映射实现。
基于CPU优化的查询架构
自动索引
实时查询优化
5 发布周期:
大概每4个月发布一个版本,每个月一个补丁包。
6 编译安装
rpm -ivh pcre-devel-6.6-6.el5_6.1.x86_64.rpm
./configure --prefix=/opt/pub/MonetDB
make
make install
export PATH=$PATH:/opt/pub/MonetDB/bin
7 实用程序:
mclient: 客户端连接命令
monetdb: 数据库操作命令
mondetdbd: 守护进程操作命令
mserver5: mserver5是当前MonetDB服务器提供所有固定请求的,调整mserver5内核使用的参数。
mysqldump:dump数据库
8 守护进程
一个机器上一个数据库实例,多个数据库实例可以同时在一个机器上,但是每个实例所使用的资源会受影响。
监控所有实例,作为客户端代理提供每个实例的访问,另外处理故障恢复和数据并发引擎。
Monetdb:守护进程,一台机器上只能有一个实例,一个实例有多个进程。
(1)创建守护进程目录
% monetdbd create ~/my-dbfarm
(2)查看守护进程设置
% monetdbd get all ~/my-dbfarm
(3)修改参数
% monetdbd set port=54321 ~/my-dbfarm
(4)启动守护进程
% monetdbd start ~/my-dbfarm
(5)创建一个数据库
% monetdb create my-first-db
(6)查看数据库状态,指定端口号,指定对应的数据库
% monetdb -p54321 status
(7)启动和解锁数据库
启动数据库
% monetdb start my-first-db
解锁数据库,否则数据库是锁定状态
% monetdb release my-first-db
(8)连接数据库
% mclient -dmy-first-db
-d参数指定数据库名,默认用户名和密码是monetdb/monetdb
连接不上,可以带上端口号
% mclient -p54321 -dmy-first-db
%mclient -u monetdb -d dbtest
(9)停止demon进程:
% monetdbd stop ~/my-dbfarm
(10)从SQL脚本中导入数据,三种方法:
1:
shell> mclient -u voc -d voc voc_dump.sql
password:<voc>
2:
shell> mclient -u voc -d voc < voc_dump.sql
password:<voc>
3:
shell> mclient -u voc -d voc
password:<voc>
sql> \< voc_dump.sql
9 资源利用:
Monetdb是内存数据库,但是并不要求所有的数据都放在物理内存中,数据超过了可用的物理内存,Monetdb把数据放在swap分区和内存映射文件上。
批加载数据时(尤其是通过COPY INTO方式加载CSV文件),MonetDB需要整张表所有列都是active,就是可以在地址空间可以访问。如果是普通加载,部分数据会被写到磁盘上,不需要把整个表放到内存中,比如加载100G的表,大概8G的内存,16G的交换空间和足够的磁盘空间。
查询阶段,每个MAL操作,MonetDB需要所有的输入,输出,中间过程数据都在内存中,MonetDB会自动组织数据到虚拟内存和内存映射文件(大的中间结果和表)。
运行过程中,mserver5进程的实际大小可能会超过,物理内存和交换空间,通常情况下,这个不会是问题,因为通常是大表(或者中间结果)通过内存映射的方式把文件写到磁盘上,这些数据当前并不访问,所以也不消耗实际的物理内存。
如果一个表的单独列或者中间结果超过了物理内存的大小,就需要到硬盘交换数据,MonetDB性能会下降。
磁盘默认无压缩(除了字符串使用字典编码),原因是磁盘空间和IO带宽的消耗要比CPU解压更划算。不压缩,因此所以列可以通过内存映射方式访问。如果磁盘比较贵,而内存可以存放很长时间,压缩优化才会有用。
磁盘空间可以通过du命令查看dbfarm目录或者数据库中执行select * from storage();
10 压缩:
列存储是高度优化的,底层的存储是一个密集数组,中间没有空闲空间用来将来插入和数据结构本身的消耗。密集数组是数据库文件可以直接映射到内存中。存储宽度从1 byte到8 byte。
NULL为指定大小空间,从而不需要用辅助的BIT掩码来代替。
字符串存储使用的是字典编码,这个会显著降低存储空间,但是大字段会导致大的代价。因此,真正大的字典表,MonetDB会重新组织为非压缩方式。
查询优化时,一个密集结果实际上市用列视图代表,必满了拷贝结果和存储私有的列结构。
11 只读数据库:
可以使用下面命令将数据库设置为只读,只读数据库使查询变快。
shell> monetdb set readonly=yes
设置为只读之后,所有表都不能修改,只能查询,甚至不能创建临时表。
修改数据库为只读是使用了SQL schemal和用户权限。
12 事物:
显示事物:
START TRANSACTION
COMMIT
ROOLBACK。
也可以将session参数设置为auto_commit 为true,这样单SQL会是一个独立的事物。
一行被删除,只是标记一下,不会降低表的大小,需要通过回收算法回收。
事物使用的是乐观并发控制:Optimistic concurrency control,提交前,每个事物检测没有其他事物修改数据,如果检查到了冲突修改,提交的事物就被回滚。这种算法只适合在低冲突中使用,事物的实现可以不需要使用锁和等待其他锁释放,如果冲突经常发生,重复执行事物的消耗会非常大。所以非常不适合在线交易类型的业务。
13 运行时功能:
SQL语句提供查询计划,性能和调试功能。
EXPLAIN SQL
TRACE SQL
DEBUG SQL
14 加载数据:
方式一:直接使用Insert into ,可以通过START TRANSACTION 和COMMIT减少事物提交。这种方式因为每次查询都是独立的,所以每次只能使用到一个CPU核。
方式二:COPY INTO
COPY INTO TABLE FROM ‘FILE’;
大量数据插入式,server不知道需要分配多少内存,因此只会分配很少,也就是在插入过程中,需要不停的分配内存,这个开销会非常大。因此,最好能给定一个值多少条记录会被插入。
COPY n RECORDS INTO table FROM ‘file’
N必须比实际插入的数字要大,如果文件实际的值大于N,只会有N条记录会被插入。在同一表同时有多个COPY INTO查询,给一个更大的值会非常有效。
offset 值指定数据加载开始位置,第一条记录offset为1
完整性约束最好在文件被加载完了之后再添加,因为ALTER命令是批检查和处理,性能会更好。
15 导出
COPY INTO命令把表dump成一个ASCII文件。
导入导出可以指定gz和bz2的压缩算法。
16 用户定义函数:
参考例子sql/backends/monet5/UDF
MonetDB实例之间迁移表,可以使用二进制的COPY INTO/FROM格式。
17 数据库优化:
每个SQL查询经过了一系列的优化步骤达到最优的执行计划,这些步骤用取名‘optimizer pipe’
两张表记录了所有SQL语句的查询定义和他们的执行时间。
表一:queryHistory:
系统变量‘history’限制,如果该限制打开,每个查询只要编译进cache就会被存储过程’keepQuery’记录到这个表中,这个表记录的是SQL语句分析解析性能。
set history=true;
create table queryHistory(
id wrd primary key,
defined timestamp, -- when entered into the cache
name string, -- database user name
query string, -- original text
parse bigint, -- time in usec
optimize bigint -- time in usec
);
表二:callHistory:
记录查询性能
create table callHistory(
id wrd references queryHistory(id), -- references query plan
ctime timestamp, -- time the first statement was executed
arguments string,
exec bigint, -- time from the first statement until result export
result bigint, -- time to ship the result set to the client
foot bigint, -- footprint for all bats in the plan in bytes
memory bigint, -- storage size of intermediates created in bytes
tuples wrd, -- number of tuples in the result set
inblock bigint, -- number of physical blocks read
oublock bigint -- number of physical blocks written
);
18 优化管道:
每个管道包含一系列MAL函数 检测和传输执行计划。优化器可以修改名字和MAL function系列。
sql>set optimizer='minimal_pipe'; 修改名字
sql>select optimizer;
sql> set optimizer='optimizer.inline();optimizer.remap();optimizer.deadcode();optimizer.multiplex();optimizer.garbageCollector();'; 修改MAL function函数顺序
sql>select * from optimizers();
16数据类型:
1、 内置类型:
integer:长度有2,4,8 bytes,可以为空。系统不检测溢出,所以把转换为一个大值时可能导致副作用。
Numeric:固定的长度
Float和double:和系统一致
2、 支持时间类型:
date
daytime
timestamp
timezone
3、 sequeue:
4、 URL
5、 网络地址
6、 用户自定义类型
19 唯一列
使用sequeue支持唯一列
20 Constraints
支持not nll ,unique primary,foreign keys
21 索引:
支持标准SQL的索引创建,但是不起作用,MonetDB会自动创建和维护索引。
22 视图:
支持基本视图,不支持嵌套视图和引用视图
23 数据操作
不支持通过视图删除数据
24 自定义类型
NUMERIC(p,s) p最大支持18
‘’ 和NULL不等价,两个分割符号之间要写上NULL,才能被识别。
COPY INTO 把两个分割符之间认为是空字符串
COPY INTO不支持通配,文件必须指定绝对路径
COPY INTO 对CPU消耗不高
25 .linux OOM Killer:
Linux 内核有一个OOM的功能,当系统到大一个临界点,快要超过内存是,OOM会杀掉进程。通常情况下,重启就能恢复,但是当在一个负责的更新的事物中,可能导致数据库不一致。
26 类型转换:
select sum(cast (sid as integer)) from "detail_ufdr_other_temp" ;
27 存储模型:
通过下面语句可以查出表的存储模型
select * from storage() where "table" = 'detail_ufdr_other_temp';
28 查询正在运行的任务(还不支持 ,2013/6才支持)
select * from sys.queue();
29 二进制批加载
COPY 命令,性能主要消耗在将ASCII值转化为二进制,MONETDB针对多核进行了高度优化,多个线程会并行处理。
用户直接根据BAT模型,生成二进制文件。
create table Tmp( i integer, f real, s string);
copy binary into Tmp from ('path_to_file_i', 'path_to_file_f', 'path_to_file_s');
文件名是列明的绝对路径,这个路径需要和farm同样的文件系统。他们会直接替换TMP的内容。文件被拷贝完了之后,原来的空间就可以被回收利用。
每个文件直接用二进制表示,是一个C语言数组的DUMP。
Char(1byte) tinyint(8-bits) smallint(16bits) int(32bits) bigint(64bit)
Real 和double映射C语言的float 和double类型。
可变字符串,文件中存放的对应的C语言的字符串,每行通过分割符分割,并且没有转义字符。所有文件需要对其,有多个值在文件中,表中就有多少条记录。
其他的类型(包括UTF-8和转义字符)必须要用COYP INTO加载。
相关推荐
### 内存数据库MonetDB知识点详解 #### 一、MonetDB简介 **MonetDB**是一款高性能的内存数据库管理系统,由荷兰阿姆斯特丹的CWI(Centrum Wiskunde & Informatica)开发,并在之后由MonetDB B.V.继续维护和发展。...
除了手册之外,MonetDB还提供了其他学习资源,如在线教程、视频讲座和开发人员论坛等,以便用户更好地掌握MonetDB的相关知识。 #### 1.6 下载和安装 MonetDB提供了多种下载和安装选项,包括为开发人员准备的源代码...
### 开发调试MonetDB(CentOS6.4) #### 一、配置CentOS环境 在开始MonetDB的开发调试之前,首先需要确保CentOS系统已经安装了必要的开发工具和依赖库。根据MonetDB官方文档《HowToStart.rst》中的指导,可以使用`...
MonetDB是一款高性能的开源数据库管理系统,以其独特的列式存储模型和CPU优化的查询架构而闻名。本篇文章将带你快速入门MonetDB的安装、启动和基础操作。 首先,MonetDB采用列式存储模型,这与传统的行式存储不同。...
### MonetDB启动过程分析 #### 一、MonetDB简介 MonetDB是一种高性能的列式数据库管理系统,因其在数据分析领域中的卓越表现而受到广泛关注。本文将详细解析MonetDB的启动流程,帮助读者更好地理解其内部机制。 ##...
MonetDB是一款高效的大数据管理系统,它以列存模型为核心,设计了三层软件架构,以适应大规模数据处理的需求。列式存储模型使得MonetDB在处理分析型查询时表现出色,因为这种模型对于读取和处理单列数据非常高效。在...
MonetDB 的 SQL 编译执行过程分析 MonetDB 的 SQL 编译执行过程是一个复杂的过程,涉及到多个步骤和技术。本文将对 MonetDB 的 SQL 编译执行过程进行分析,涵盖编译过程、Sqlparse 函数、bison 介绍、符号编译等...
### MonetDB的MAL语言实现详解 #### 一、MAL语言概述 MonetDB是一种高性能的列式数据库管理系统,以其高效的数据查询能力而闻名。在MonetDB中,MAL(Monet Abstract Language)是一种用于定义数据库操作的抽象语言...
连接MonetDB时,需要MonetDB JDBC驱动(monetdb-jdbc.jar),并提供如"jdbc:monetdb://localhost:50000/mydatabase"的数据库URL。 以上数据库的JDBC连接都遵循类似的步骤:加载驱动、建立连接、创建Statement或...
MonetDB是一款高性能、开源的内存数据库系统,其设计目标是处理大规模的数据密集型应用。在标题中提到的"MonetDB-client-...对于想要深入了解MonetDB并利用其性能优势的人来说,学习和使用这个客户端是一个很好的起点。
### MonetDB 进程-线程模型详解 #### 一、MonetDB架构概览 MonetDB是一款高性能的列式存储数据库管理系统,其设计初衷是为了满足大规模数据分析的需求。MonetDB的核心特色之一在于其独特的进程-线程模型,这种模型...
MonetDB是一款高性能的关系型数据库管理系统,其SQL引擎在处理查询时依赖于一套复杂的内部数据结构和机制。本文将深入探讨MonetDB的SQL引擎如何通过Catalog系统来管理和解析SQL语句。 首先,Catalog在MonetDB中扮演...
2. **MADlib**:MonetDB 集成了 MADlib,这是一个用于统计分析和机器学习的库,可以在数据库内直接执行复杂的数学和统计计算,无需将数据导出到其他工具。 3. **查询优化器**:MonetDB 使用基于成本的查询优化器,...
MonetDB5是一款高效、开源的内存数据库管理系统,专为处理大规模数据而设计。它以其高性能、低延迟和对SQL的全面支持而受到关注。在本文中,我们将深入探讨MonetDB5的主要特点、工作原理以及如何从"MonetDB5-server-...
MonetDB是一款高性能、开源的关系型数据库管理系统,专注于大规模数据处理。这个名为"MonetDB-Jul2021-29.tar.gz"的压缩包很可能包含了MonetDB在2021年7月的一个更新版本或者特定构建,版本号为29。".tar.gz"是一种...
MonetDB是一个高性能的关系型数据库管理系统,其设计目标是处理大规模的数据。GDK(Generic Database Kit)是MonetDB的一部分,它提供了一种机制来扩展MonetDB的内建数据类型和操作。以下是对MonetDB的GDK实现进行的...
MonetDB数据库系统 MonetDB数据库最初由(请参阅 )。 现在,开发工作已转移到了独立的公司 。 通过MonetDB项目,我们将MonetDB系统引入了开放源代码,可在上进行访问。 即使开发主要发生在公司中,MonetDB数据库...
MonetDB数据库系统是用于查询密集型应用程序的高性能数据库内核。 可以在我们的Mercurial服务器上找到MonetDB源。 MonetDB数据库系统MonetDB数据库最初由CWI数据库研究小组开发(请参阅https://www.monetdb.org/)。...
MonetDB是一款高性能的关系型数据库管理系统,其网络通信机制对于理解和优化其运行至关重要。本文将深入探讨MonetDB的网络通信分析,重点关注数据库初始化、守护进程、线程管理和客户端处理等方面。 首先,MonetDB...
MonetDB NodeJS连接器版本1. * 这个NodeJS模块提供了一种简单而强大的方法,可以在NodeJS程序中使用MonetDB。 对于版本0. *用户: 用法示例var MDB = require ( 'monetdb' ) ( ) ;var options = {host : 'localhost'...