1、MonetDB快速入门MonetDB快速入门特性:列式存储模型:在内存中数据都是以BAT(Binary Association Table) (OID,value) pairs形式存放,数据超过了内存和虚拟内存,使用磁盘存放文件,磁盘和内存通过内存映射实现。基于CPU优化的查询架构,自动索引,实时查询优化。1 架构:三层软件架构:SQL front-end:前端SQL解析,数据模型优化,降低数据中间结果的总量,最后将SQL语句解析为MAL(MonetDB Assembly Language)。Tactical-optimizers:一系列优化模块的集合,组成优化管道,这个模块提供功能从符号处理
2、到实时数据分发和执行。Columnar abstract-machine kernel:列式内核2 MAL MonetDB Assembly Language(MAL)MAL是SQL和XQuery前端查询的目标语言。SQL语句通过语法解析解析成MAL,MAL在经过优化器优化,重写成优化后的MAL,提供给内核执行。3 内核 执行内核是一个运行MAL语言的虚拟机。复杂的查询被拆分成多个步骤,每个步骤操作一个列,叫bulk processing。所有的BAT操作被映射成简单的数组操作,一个并行处理引擎。内核运行过程中会根据输入属性和系统状态选择合适的优化算法和实现来执行MAL语言。运行过程中操作优化
3、:会根据输入属性和系统状态选择合适的优化算法和实现。第一章、安装第一节、编译安装rpm -ivh pcre-devel-6.6-6.el5_6.1.x86_64.rpm./configure -prefix=/opt/pub/MonetDBmakemake installexport PATH=$PATH:/opt/pub/MonetDB/bin第二节、启动在Linux上快速安装,启动MonetDB守护进程Monetdbd。这个守护进程负责管理后台、本地、远程服务器,由monetdb控制。在这里,我们展示了一个简单的过程,涉及建立一个数据库,将数据加载和查询。shell monetdbd cr
4、eate /path/to/mydbfarmshell monetdbd start /path/to/mydbfarmshell monetdb create vocshell monetdb release vocshell mclient -u monetdb -d vocpassword:第三节、实用程序mclient: 客户端连接命令monetdb: 数据库操作命令mondetdbd: 守护进程操作命令mserver5: mserver5是当前MonetDB服务器提供所有固定请求的,调整mserver5内核使用的参数。mysqldump:dump数据库1、守护进程一个机器上一个数据库
5、实例,多个数据库实例可以同时在一个机器上,但是每个实例所使用的资源会受影响。监控所有实例,作为客户端代理提供每个实例的访问,另外处理故障恢复和数据并发引擎。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
6、my-first-db(6)查看数据库状态,指定端口号,指定对应的数据库% monetdb -p54321 status(7)启动和解锁数据库启动数据库% monetdb start my-first-db解锁数据库,否则数据库是锁定状态% monetdb release my-first-db2、连接% mclient -dmy-first-db-d参数指定数据库名,默认用户名和密码是monetdb/monetdb连接不上,可以带上端口号% mclient -p54321 -dmy-first-db%mclient -u monetdb -d dbtest3、停止% monetdbd sto
7、p /my-dbfarm4、SQL导入三种方式1:shell mclient -u voc -d voc voc_dump.sqlpassword:2:shell mclient -u voc -d voc voc_dump.sqlpassword:3:shell mclient -u voc -d vocpassword:sql CREATE USER tpc WITH PASSWORD tpc NAME TPC Explorer SCHEMA sys;sqlCREATE SCHEMA tpc AUTHORIZATION tpc;sqlALTER USER tpc SET SCHEMA tp
8、c;第二节、数据类型和表1、原始数据类型2、建表示例sqlCREATE TABLE test (more id int,more data varchar(30)more );sqld testCREATE TABLE voc.test ( id int, data varchar(30);第三节、函数基本与Postgresql兼容,只是类型转换不一样。1、类型转换函数str_to_date(s string ,format string)date_to_str(d date, format string)第四节、加载数据1、普通装载方式一:直接使用Insert into ,可以通过START
9、 TRANSACTION 和COMMIT减少事物提交。这种方式因为每次查询都是独立的,所以每次只能使用到一个CPU核。方式二:COPY INTOCOPY INTO TABLE FROM FILE;大量数据插入式,server不知道需要分配多少内存,因此只会分配很少,也就是在插入过程中,需要不停的分配内存,这个开销会非常大。因此,最好能给定一个值多少条记录会被插入。COPY n RECORDS INTO table FROM fileN必须比实际插入的数字要大,如果文件实际的值大于N,只会有N条记录会被插入。在同一表同时有多个COPY INTO查询,给一个更大的值会非常有效。offset 值指定
10、数据加载开始位置,第一条记录offset为1完整性约束最好在文件被加载完了之后再添加,因为ALTER命令是批检查和处理,性能会更好。2、导出 COPY INTO命令把表dump成一个ASCII文件。导入导出可以指定gz和bz2的压缩算法。3、二进制批加载 COPY 命令,性能主要消耗在将ASCII值转化为二进制,MONETDB针对多核进行了高度优化,多个线程会并行处理。用户直接根据BAT模型,生成二进制文件。create table Tmp( i integer, f real, s string); copy binary into Tmp from (path_to_file_i, pat
11、h_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语言的字符串,每行通过分割符分割,并且没有转义字符。所有文件需要对其,有多个值在文件中,表中就有多少条记录。其
12、他的类型(包括UTF-8和转义字符)必须要用COYP INTO加载。第五节、JDBC1、驱动JDBC下载:http:/dev.monetdb.org/downloads/Java/Latest/2、加载驱动/ make sure the ClassLoader has the MonetDB JDBC driver loadedClass.forName(nl.cwi.monetdb.jdbc.MonetDriver);/ request a Connection to a MonetDB server running on localhostConnection con = DriverMa
13、nager.getConnection(jdbc:monetdb:/localhost/database, monetdb, monetdb);3、示例import java.sql.*;public class MJDBCTest public static void main(String args) throws Exception / make sure the driver is loaded Class.forName(nl.cwi.monetdb.jdbc.MonetDriver); Connection con = DriverManager.getConnection(jdb
14、c:monetdb:/localhost/database, monetdb, monetdb); Statement st = con.createStatement(); ResultSet rs; rs = st.executeQuery(SELECT a.var1, COUNT(b.id) as total FROM a, b WHERE a.var1 = b.id AND a.var1 = andb GROUP BY a.var1 ORDER BY a.var1, total;); / get meta data and print columns with their type R
15、esultSetMetaData md = rs.getMetaData(); for (int i = 1; i = md.getColumnCount(); i+) System.out.print(md.getColumnName(i) + : + md.getColumnTypeName(i) + t); System.out.println(); for (int i = 0; rs.next() & i 5; i+) for (int j = 1; j select count(*) from tables;sqlexplain select count(*) from table
16、s;+-+| mal |+=+| function user.s3_2autoCommit=true():void; | _2 := sql.mvc(); | barrier _143 := language.dataflow(); | _23:bat:oid,:sht := sql.bind(_2,sys,_tables,type,1); | _24 := algebra.thetauselect(_23,2:sht,); | _25:bat:oid,:oid := sql.bind_dbat(_2,sys,_tables,1); | _27 := bat.reverse(_25); | _
17、97 := algebra.kdifference(_24,_27); | _110 := algebra.markT(_97,5,4); | _117 := bat.reverse(_110); | _30:bat:oid,:int := sql.bind(_2,sys,_tables,id,1); | _142 := algebra.leftjoin(_117,_30); | _64:bat:oid,:sht := sql.bind(_2,sys,_tables,type,0,270,nil:oid); | _72 := algebra.thetauselect(_64,2:sht,);
18、| _20:bat:oid,:sht := sql.bind(_2,sys,_tables,type,2); | _76 := algebra.kdifference(_72,_20); | _22 := algebra.thetauselect(_20,2:sht,第二节、数据字典参见:http:/www.monetdb.org/Documentation/SQLcatalog/TablesColumns第三节、监控数据库活动1、正在执行的任务select * from sys.queue();第四节、监控存储使用磁盘空间可以通过du命令查看dbfarm目录或者数据库中执行select *
19、from storage();第五节、备份还原1、SQL转储SQL转储是对数据库镜像或者迁移的常用的方法。如在两个版本之间。SQLdump是ASCII编码的SQL的集合。执行这些脚本,可以重新创建一样的数据库。MonetDB不提供全局锁,并发情况下这个转储可能无效。shell mclient -lsql -database=voc -dump /tmp/voc.sql可以检察/tmp/voc.sql,确认它是可读的。如果空间是问题,可以用管道把输出给一个压缩工具,或者使用linux工具直接发送到另外一台机器,移动数据文件到新机器。MonetDB可以用于创建数据库。shell mclient -
20、lsql -database=voc /tmp/voc.sql2、快速备份shell monetdb stop demoshell monetdb lock demoshell monetdb release demo第四章、技巧第一节、单步调试执行SQL语句被翻译成为Mal程序,优化存储为用户模块。代码可以用MAL_debugger跟踪,以下是一个调试的例子。debug select count(*) from tables;# mdb.start()mdbnext# user.s1_0()mdbnext# _2:bat:oid,:int := sql.bind(_3=sys, _4=pta
21、bles, _5=id, _6=0)mdbnext# _8:bat:oid,:int := sql.bind(_3=sys, _4=ptables, _5=id, _9=1)mdb .第二节、集群第三节、索引支持标准SQL的索引创建,但是不起作用,MonetDB会自动创建和维护索引。外键约束会内部自动创建索引。尽量创建外键约束,外联结时有1倍以上性能提高。第四节、事务显示事物:START TRANSACTIONCOMMITROOLBACK。也可以将session参数设置为auto_commit 为true,这样单SQL会是一个独立的事物。一行被删除,只是标记一下,不会降低表的大小,需要通过回收算法回收。事物使用的是乐观并发控制:Optimistic concurrency control,提交前,每个事物检测没有其他事物修改数据,如果检查到了冲突修改,提交的事物就被回滚。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1