首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为kdb中的性能效益而在aj中工作的属性

为kdb中的性能效益而在aj中工作的属性
EN

Stack Overflow用户
提问于 2020-05-17 18:36:04
回答 1查看 338关注 0票数 0

考虑到内存中的交易表't‘和引用表'q’:

代码语言:javascript
复制
q)t:([] sym:`GOOG`AMZN`GOOG`AMZN; time:10:01 10:02 10:02 10:03; px:10 20 11 19)
q)q:([] sym:`GOOG`AMZN`AMZN`GOOG`AMZN; time:10:01 10:01 10:02 10:02 10:03; vol:100 200 210 110 220)

为了获得性能效益,在Q表' sym‘列上加入分组属性,并在sym中对'time’列进行排序。

使用它,我可以清楚地看到它对性能的好处:

代码语言:javascript
复制
q)\t:1000000 aj[`sym`time;t;q]
9573
q)\t:1000000 aj[`sym`time;t;q1]
8761
q)\t:100000 aj[`sym`time;t;q]
968
q)\t:100000 aj[`sym`time;t;q1]
893

在大桌子上,性能要好得多。

现在,当我们将分组属性应用到sym列并在sym中对时间排序时,我试图了解它是如何在内部工作的。

我的理解是内部的aj应该以下面的方式发生,有人能让我知道正确的内部工作吗?

*由于在sym上应用了分组属性;因此它为表q1创建了一个哈希表,然后由于我们正在按时间进行排序,所以内部q1表可能看起来像。

代码语言:javascript
复制
GOOG|(10:01;10:02)|(100;110)
AMZN|(10:01;10:02:10:03)|(200;210;220)

因此,在q1的情况下,如果解释器必须加入t表的(AMZN;10:02);它将在更短的时间内直接在Q1的可加速性中找到它,但是对于加入表'q‘中表t’的相同值(AMZN;10:02),解释器必须在表'q‘中线性搜索,因此需要花费更多的时间。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 08:17:12

我相信你是在正确的轨道上,虽然我们不能确定,因为我们无法访问kdb源代码来准确地了解它的功能。

如果您查看aj的定义,您会发现它是基于bin

代码语言:javascript
复制
q)aj
k){.Q.ft[{d:x_z;$[&/j:-1<i:(x#z)bin x#y;y,'d i;+.[+.Q.ff[y]d;(!+d;j);:;.+d i j:&j]]}[x,();;0!z]]y}

特别是,

代码语言:javascript
复制
(`sym`time#q)bin `sym`time#t

bin文档提供了关于bin行为的更多细节:https://code.kx.com/q/ref/bin/

我相信在两列情况下,它将首先在sym列上匹配,然后在第二列上使用bin。正如您所说的,sym上的分组属性加速了syms部件的匹配,并且时间上的排序确保bin返回正确的结果。请注意,对于磁盘上的查询,最好将`p#放在sym上,而不是`g#上,因为parted属性对于从磁盘中通过sym进行匹配/检索是最优的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61856842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档