【发布时间】: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