kdb+的性能测试

[复制链接]
查看11 | 回复9 | 2012-5-21 10:19:41 | 显示全部楼层 |阅读模式
KDB+ 3.3 2016.03.14 Copyright (C) 1993-2016 Kx Systems
l32/ 8()core 86583MB oracle redflag11012501 aaaa NONEXPIRE
Welcome to kdb+ 32bit edition
q)t1 : ([] name:`symbol$(); age:`int$())
q)t
't
q)meta t1
c | t f a
----| -----
name| s
age | i
q)t1
name age
--------
q)\t`t1 insert (2000000#`abc;til 2000000)
75
q)count t1
2000000
q)\t temp1:select count name by ceiling (1|(log (age+0.1))%(log 10)) from t1
312
q)temp1
x| name
-| -------
1| 10
2| 90
3| 900
4| 9000
5| 90000
6| 900000
7| 1000000
q)\t temp1:select sum age by ceiling (1|(log (age+0.1))%(log 10)) from t1
301
q)temp1
x| age
-| ----------
1| 45
2| 4905
3| 494550
4| 49495500
5| 654987704
6| 1078310960
7| 1055913696
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
sum age的测试超界了,改为
q)\t temp1:select sum "j"$age by ceiling (1|(log (age+0.1))%(log 10)) from t1
298
q)temp1
x| age

-| -------------
1| 45
2| 4905
3| 494550
4| 49495500
5| 4949955000
6| 494999550000
7| 1499999500000
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:16 编辑
//测试逐行插入
q)t:([id:()] name:(); descript:(); date:())
q)`t insert (1;2;3;4)
,0
q)t
id| name descript date
--| ------------------
1 | 234
q)n:5
q)do[2; `t insert(n;n;n;n);n:n-1]
q)t
id| name descript date
--| ------------------
1 | 234
5 | 555
4 | 444
q)n:10
q)\t do[10000;`t insert(n;n;n;n) ; n:n+1]
150
q)count t
10003
q)n:10004 //下面插入失败是因为违反键约束
q)\t do[1000000;`t insert(n;n;n;n) ; n:n+1]
'insert
q)\t do[50000;`t insert(n;n;n;n) ; n:n+1]
'insert
q)count t
10003
q)\t do[10000;`t insert(n;n;n;n) ; n:n+1]
'insert
q)\t do[10;`t insert(n;n;n;n) ; n:n+1]
'insert
q)\t do[10000;`t insert(n;n;n;n) ; n:n+1]
'insert
q)n:10040 //键不冲突了,100万用时太长,中止
q)\t do[1000000;`t insert(n;n;n;n) ; n:n+1]
'stop
q)q)count t
311899

回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:14 编辑
//10万行的测试,第一遍较快,第2遍慢,引文中的办法不起作用
q)delete from `t
`t
q)t
id| name descript date
--| ------------------
q)n:1
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
8650
q)n
100001
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
24580
q)delete from `t
`t
q)t:`s#t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
8560
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
25290
q)delete from `t
`t
q)t:(`s#key t)!value t
q)t
id| name descript date
--| ------------------
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
8670
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
25460
q)
http://blog.csdn.net/kraussyin/article/details/47036379
如果往keyed table插入数据,每次插入都会引起一次对key的线性搜索,就导致插入的时间开销和表的大小线性相关。对于你建立的表而言,只要做一点小小的改动就能让插入操作变回到常数级时间开销。你要做的是,在表中存在数据之后,赶紧给表的id那一列贴上sorted属性:
t:([id:()] name:(); descript:(); date:())
/ insert a record
t:`s#t
/ start testing/timing from here
或者更严谨一点的写法:
t:([id:()] name:(); descript:(); date:())
/ insert a record
t:(`s#key t)!value t
/ start testing/timing from here
这样一来,还是插入原来那样生成的数据,一秒钟能插入十万条记录,而且插入的时间代价不再随表的增大而线性增长。


回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:15 编辑
//如果改用没有键的表,很快
q)t2:([]id:(); name:(); descript:(); date:())
q)t2
id name descript date
---------------------
q)n:1
q)\t do[100000;`t2 insert(n;n;n;n) ; n:n+1]
230
q)\t do[100000;`t2 insert(n;n;n;n) ; n:n+1]
230
q)\t do[1000000;`t2 insert(n;n;n;n) ; n:n+1]
2190
q)count t2
1200000
q)t2[1100000]
id| 1100001
name| 1100001
descript| 1100001
date| 1100001
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:12 编辑
〇〇 发表于 2016-5-11 19:24
//10万行的测试,第一遍较快,第2遍慢,引文中的办法不起作用
q)delete from `t
`t

//按照引文中的说法,先插入1行,再改属性,同样很慢
q)count t
200000
q)delete from `t where id>1
`t
q)t
id| name descript date
--| ------------------
q)n:1
q)\t do[1;`t insert(n;n;n;n) ; n:n+1]
0
q)t:`s#t
q)t
id| name descript date
--| ------------------
1 | 111
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
8380
q)delete from `t
`t
q)t:(`s#key t)!value t
q)n:1
q)\t do[1;`t insert(n;n;n;n) ; n:n+1]
0
q)t:(`s#key t)!value t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1]
8360

回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
//终于测试出来了,原来每插入1行就要设置sorted属性才行
q)t[0]
name|
descript|
date|
q)t[1]
name| 1
descript| 1
date| 1
q)count t
100001
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
430
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
450
q)count t
300001
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
〇〇 发表于 2016-5-11 19:46
//终于测试出来了,原来每插入1行就要设置sorted属性才行
q)t[0]
name|

//再测,又不行了
q)delete from `t
`t
q)n:1
q)\t do[1000000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
'stop
q)q)count t
509999
q)delete from `t
`t
q)n:1
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
8630
q)t:`s#t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
25120
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:12 编辑
//第2种写法好像可以
q)t:(`s#key t)!value t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
450
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
400
q)count t
400000
//但还是没找到诀窍
q)delete from `t
`t
q)t
id| name descript date
--| ------------------
q)n:1
q)`t insert(n;n;n;n)
,0
q)t
id| name descript date
--| ------------------
1 | 111
q)t:(`s#key t)!value t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
'insert
q)n:2
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
8400
q)t:(`s#key t)!value t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1; t:`s#t]
450
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
390
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
400
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
380
q)\t do[1000000;`t insert(n;n;n;n) ; n:n+1;]
3690
回复

使用道具 举报

千问 | 2012-5-21 10:19:41 | 显示全部楼层
本帖最后由 〇〇 于 2016-5-12 09:16 编辑
//似乎插1行不行,
q)delete from `t
`t
q)n:1
q)`t insert(n;n;n;n)
,0
q)n:2
q)t:(`s#key t)!value t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
8410
q)count t
100001
q)t[0]
name|
descript|
date|
q)t[1]
name| 1
descript| 1
date| 1
q)t[100000]
name| 100000
descript| 100000
date| 100000
q)t[100001]
name| 100001
descript| 100001
date| 100001
q)t[100002]
name|
descript|
date|
//至少2行就能设置了,不用反复设置
q)delete from `t
`t
q)n:1
q)\t do[2;`t insert(n;n;n;n) ; n:n+1;]
0
q)t
id| name descript date
--| ------------------
1 | 111
2 | 222
q)t:`s#t
q)\t do[100000;`t insert(n;n;n;n) ; n:n+1;]
380
q)\t do[1000000;`t insert(n;n;n;n) ; n:n+1;]
3650
q)delete from `t2
`t2
q)n:1
q)\t do[100000;`t2 insert(n;n;n;n) ; n:n+1;]
240
q)\t do[100000;`t2 insert(n;n;n;n) ; n:n+1;]
240
q)\t do[1000000;`t2 insert(n;n;n;n) ; n:n+1;]
2210
//有键的表,索引0总是空的,从1开始是用户插入的第一笔,而普通表不会
q)t[0]
name|
descript|
date|
q)t2[0]
id| 1
name| 1
descript| 1
date| 1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行