【问题标题】:Attributes internal working in aj for performance benefits in kdb属性在 aj 中的内部工作以获得 kdb 中的性能优势
【发布时间】:2020-05-17 18:36:04
【问题描述】:

考虑内存中的交易表'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' 列上应用分组属性并使 'time' 列在 sym 内排序。
使用它,我可以清楚地看到它的性能优势:

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 的 hasttable 中找到它,但是为了在表 'q' 中加入表 't' 的相同值(AMZN;10:02),解释器将不得不通过表 'q' 线性搜索,因此需要更多时间.

【问题讨论】:

    标签: kdb


    【解决方案1】:

    我相信您走在正确的轨道上,但我们无法确定,因为我们无法访问 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#t
    

    bin 文档提供了有关 bin 行为方式的更多详细信息:https://code.kx.com/q/ref/bin/

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

    【讨论】:

    • 钱。为了扩展,p# 几乎总是会优于 g#,因为您正在检索的索引更密集..
    猜你喜欢
    • 2019-03-14
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多