目录

KDB/Q是什么语言

KDB/Q是KDB数据库的专属语言。Q语言的基本数据类型就是Atoms,整型包含了三种数据类型,分别为long、short和int,都是整数类型,只是所占的空间大小不同。可以利用type命令查看数据类型,返回的结果就是该数据类型的Numtype。

一、KDB/Q语言

KDB/Q是KDB数据库的专属语言。Q语言的基本数据类型就是Atoms。

整形

整型包含了三种数据类型,分别为long、short和int,都是整数类型,只是所占的空间大小不同。可以利用type命令查看数据类型,返回的结果就是该数据类型的Numtype。

q)type 42 /查询42的数据类型是什么

-7h /返回的结果为-7h,这里-号代表为Atom(原子)类型,7(可以对照Q语言数据类型表查看)代表为long类型。

q)type 42i /查询int类型的42i的返回结果

-6h  /返回的结果为-6h,这里-号代表为Atom(原子)类型,6(可以对照Q语言数据类型表查看)代表为int类型

q)type 42h /查询short类型的42h的返回结果

-5h /返回的结果为-5h,这里-号代表为Atom(原子)类型,5(可以对照Q语言数据类型表查看)代表为short类型

浮点数类型

1、浮点数(CharType为f),与其他编程语言类似,浮点数指浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。可以看下在cmd中输入一些浮点数后的返回结果,f代表为float类型,用type查询返回结果为-9h,-号代表为Atom(原子)类型,9(可以对照Q语言数据类型表查看)代表为float类型。有一个特殊显示情况,对于1.0,则返回结果为1f,省去了0,并加了一个f后缀。Q语言中,指数也属于浮点数类型。

q)3.1415926

3.1415926

q)1f

1f

q)1.0

1f

q)1.1f

1.1

q)type 3.14

-9h

q)type 1.234e7

-9h

2、浮点数的显示

由于显示的精度原因,我们可能无法显示太长的浮点数,如1.23456789012,在我的电脑上只显示1.234568,要想显示全部,可以利用\P来控制显示精度。

q)1.23456789012

1.234568

q)\P 12   / “\P”表示控制浮点数显示的输出精度,12表示总共显示12位数字(不包括小数点)

q)1.23456789012

1.23456789012

q)\P 5

q)1.23456789123

1.2346

q)\P 6

q)1.23456789123

1.23457

二进制数据类型

二进制数据类型包括boolean(布尔类型)、byte(字节类型)、GUID(全局少数标识符类型)。布尔类型在输入的时候需要添加b的后缀(0b或者1b),同时布尔类型和其他数据类型可以进行运算,预算结果后的类型为与其进行运算的数据类型,不再是布尔类型。如:3.1415-1b,返回结果为2.1415;3.1415+1b,返回结果为4.1415。

q)type 0b

-1h  /返回的结果为-1h,这里-号代表为Atom(原子)类型,1(可以对照Q语言数据类型表查看)代表为boolean类型

q)type 1b

-1h 

q)3.1415+1b

4.1415

q)3.1415-1b

2.1415

字节类型使用一个字节来存储无符号的8位值,并由前导类型指示符0x后跟十六进制数值。如:16进制0x2a表示的十进制数为42,我们可以尝试使用$将16进制转换为二进制。同时如果十进制数与十六进制数相加,最后的结果为十进制。

q)0x2a

0x2a

q)”i” $ 0x2a /i表示要转换的十进制数据类型为int类型,$为重载符,可以将后面的数据转换为操作符前面制定的转换类型(后续会专门写一篇类型转换的专题)

42i

q)1+0x29 /十进制数1与十六进制数0x29(十进制为41)相加,返回结果为十进制数42

42

文本数据类型

文本数据类型包含char(字符串类型)和symbol(符号类型),这两种类型类似于SQL中的CHAR与VARCHAR两种类型。char类型用双引号引起来表示,如“kdb”,表示一种char类型。也可以利用type来查询对应的数据类型。

q)”kdb” /输入一个char类型,注意要用引号引起来

“kdb”

q)type “kdb” /查询“kdb”的数据类型

10h /返回结果为10h,10(可以对照Q语言数据类型表查看)代表为char类型,与前面查询不同之处返回的结果没有了-号,这是因为不是Atom(原子)类型了,所以没有了-号,下面一个查询“k”的数据类型,因为k为一个字母,则为原子类型,因此返回的结果就包含了-号

q)type “k”

-10h

symbol类型用`符号来表示,并放在开头的位置。如“kdb”,表示一种char类型。也可以利用type来查询对应的数据类型。

q)`q /输入一个symbol类型

`q

q)`kdb`q /输入两个symbol类型

`kdb`q

q)type `q /查询`q的数据类型

-11h

q)type `kdb /查询`kdb的数据类型

-11h /可以看出分别查询`q和`kdb两个数据的数据类型返回结果都为-11h,都有-号返回,说明`kdb·也为Atom(原子类型),11(可以对照Q语言数据类型表查看)代表为symbol类型

q)type `kdb`q

11h  /可以看出同时查询`q和`kdb两个数据的数据类型返回结果为11h,没有了-号,说明单个`符号后面的看做一个整体,与char类型有些不用。

时间数据类型

Q语言中针对日期时间操作非常简单方便且强大(这也就凸显除了KDB作为时间序列数据库上的本意),时间数据类型包含date(日期类型)、Time(时间类型)、Date-Time(日期-时间类型)、month(月类型)、minute(分钟类型)、second(秒类型)。

日期都是以2000.01.01为时间的起始点,如将2001.01.01转换为int类型,则结果是366天。

q)”i” $ 2000.01.01

0i

q)”i” $ 2001.01.01 /将日期类型转换为int类型,返回结果为366i,则表示2000.01.01~2001.01.01之间有366天。

366i

q)”i” $ 1999.12.31 /将日期类型转换为int类型,返回结果为-1i,则表示2000.01.01~1999.12.31之间有-1天。

-1i

q)”i” $ 2000.02.01 /将日期类型转换为int类型,返回结果为31i,则表示2000.01.01~2000.02.01之间有31天。

31i

time 类型就是一天中的时分秒毫秒。time类型在kdb+表示为32位的int,表示相对于今天0点0分0毫秒的相对值。最小单位为毫秒。因此,int 和time类型也能够轻松转换,时间操作上也轻松方便。当然Date-Time类型就是 date+time合并在一起。Q语言中还提供了分钟秒等类型。

q)`int$00:00:00.000  /将time类型转换为int类型,返回结果为0毫秒

0i

q)`int$00:00:01.000   /将time类型转换为int类型,返回结果为1000毫秒(1秒=1000毫秒)

1000i

q)`long$12:34:56.123456789  /将time类型转换为long类型,返回结果为毫秒

45296123456789

q)2000.01.01T12:00:00.000   /Date-Time类型

2000.01.01T12:00:00.000

q)`date$2000.01.02T12:00:00.000 /将Date-Time类型转换为Date类型,返回结果2000.01.02

2000.01.02

q)`time$2000.01.02T12:00:00.000 /将Date-Time类型转换为Date类型,返回结果时间

12:00:00.000

q)`date$2014.11.22D17:43:40.123456789 /将含有毫秒的Date-Time类型转换为 date类型

2014.11.22

q)`time$2014.11.22D17:43:40.123456789  /将含有毫秒的Date-Time类型转换为time类型

17:43:40.123

q)2015.11m /月类型

2015.11m

q)2001.01m=12 /2001.01m相对于2000.01为12个月,因此结果应该是与12相等

1b

这里需要注意2014.11与2014.11m的区别,一个是浮点数,一个是month类型

q)type 2014.11

-9h

q)type 2014.11m

-13h

延伸阅读:

二、Kdb+所提供的显著效能的原因

• 原生64位元架构 – – – 这是管理今时今日数据量的必要条件。旧日的32位元系统根本无法跟上。

• 内置多核心处理和多线程。效能是跟中央处理器(CPU)的数目成正比,应用程序能利用多核心处理器的优势,而无需编写特殊的多线程程序。

• 支持并行访问庞大的分割式历史数据库,所以能将查询分配至多个内核或多台机器。

• 列式结构数据库简化了索引与连接,显着提高搜索速度。

• 发布和订阅机制把操作从主服务器卸载到一连串的服务器上,并能够提供数据服务给几乎无限量的用户端。

• 一个单一的解决方案就可应用于实时及历史数据和分析。尽量减少数据从接收至完成分析的所需时间是极为重要的—而这是取决于能否把由一个进程到另一个进程之间的所需步骤减至最小。kdb+能处理一切事务—数据采集、存储、日志、事件处理、分析、实时和历史数据库。

• 基本数据类型有日期、时间和时间戳(至纳秒),这使得时间序列分析极其快速。

• 每秒钟能处理数以百万计的记录,而每天则以十亿计。历史数据库的记录则以万亿计。它的速度能应付较高的数据流量,更可以配合硬件加速器以获得较高速度和最大的灵活性。

• 批量插入与更新优化(不是简单的每次一笔交易)。交易数据通常是整块地到达,又无需逐笔逐笔地写入。此外,数据库不必离线,就可以进行批量交易。

• 动态索引让kdb+能有效地利用实时数据。

一站式研发项目管理平台 PingCode

一站式研发项目管理平台 PingCode

支持敏捷\瀑布、知识库、迭代计划&跟踪、需求、缺陷、测试管理,同时满足非研发团队的流程规划、项目管理和在线办公需要。