考虑到内存中的交易表't‘和引用表'q’:
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’列进行排序。
使用它,我可以清楚地看到它对性能的好处:
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表可能看起来像。
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‘中线性搜索,因此需要花费更多的时间。
发布于 2020-05-18 08:17:12
我相信你是在正确的轨道上,虽然我们不能确定,因为我们无法访问kdb源代码来准确地了解它的功能。
如果您查看aj的定义,您会发现它是基于bin的
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}特别是,
(`sym`time#q)bin `sym`time#tbin文档提供了关于bin行为的更多细节:https://code.kx.com/q/ref/bin/
我相信在两列情况下,它将首先在sym列上匹配,然后在第二列上使用bin。正如您所说的,sym上的分组属性加速了syms部件的匹配,并且时间上的排序确保bin返回正确的结果。请注意,对于磁盘上的查询,最好将`p#放在sym上,而不是`g#上,因为parted属性对于从磁盘中通过sym进行匹配/检索是最优的。
https://stackoverflow.com/questions/61856842
复制相似问题