KDB中表格属性的最优选择及实践问询
KDB+ OHLCV表属性设置问题
原始OHLCV数据表格
date ticker open close high low volume exch time ----------------------------------------------------------------------------------------------- 2024.05.02 NVDA 173 173.7 173.95 173 870 NASDAQ 2024.05.02D09:15:00.000000000 2024.05.02 NVDA 173.85 173 173.85 173 2290 NASDAQ 2024.05.02D09:16:00.000000000 2024.05.02 NVDA 173.55 173.5 173.55 173.25 382 NASDAQ 2024.05.02D09:17:00.000000000 2024.05.02 NVDA 173.5 173.5 173.5 173.5 10 NASDAQ 2024.05.02D09:18:00.000000000 2024.05.02 NVDA 173.65 173.05 173.65 173.05 435 NASDAQ 2024.05.02D09:19:00.000000000 2024.05.02 NVDA 173.1 172.9 173.1 172.9 1902 NASDAQ 2024.05.02D09:20:00.000000000 2024.05.02 NVDA 172.6 172.45 172.6 172.05 824 NASDAQ 2024.05.02D09:21:00.000000000
排序操作与元数据
已执行排序语句:
ohlcv: `ticker`time xasc ohlcv;
得到的表元数据:
q)meta ohlcv c | t f a ------| ----- date | d ticker| s s open | f close | f high | f low | f volume| f exch | s time | p
从元数据可见,仅ticker列带有s(已排序)属性,time列无此属性,但该表实际是按ticker分区并结合time排序的。
问题
应选择设置哪些属性?time列属性如何处理?相关最佳实践是什么?
解答
1. 属性设置选择
- 保留
ticker的s属性:表按ticker分区分组,该属性能让KDB+在执行分组、过滤ticker相关查询时直接利用排序结构,提升性能。 - 给
time添加s属性:表是按ticker+time复合排序的,单个ticker下的time严格递增,给time设置s属性后,KDB+可识别这种分组内排序的结构,加速单只股票的时间序列查询(比如区间筛选、滑动窗口计算)。
2. time列属性的处理方式
直接给time列添加s属性即可,两种常见方式:
# 方式1:重新排序并设置属性 `ohlcv set .Q.en[`ohlcv] `ticker`time xasc ohlcv; # 方式2:直接给列设置属性 ohlcv: `ticker`time xasc ohlcv; `ohlcv.time set `s;
设置后用meta ohlcv可看到time列已带上s属性。
3. 最佳实践
- 复合排序对应复合属性:当表按多列(如
ticker+time)排序时,要确保排序后的列都带上s属性,尤其是分组键后的排序列,让KDB+充分利用有序结构加速查询。 - 分区表属性对齐:若为按
ticker分区的磁盘表,需确保每个分区内的time列有序,同时在全局表层面设置ticker和time的s属性,避免跨分区查询的额外排序开销。 - 属性校验:设置属性后用
meta确认,也可用asc函数验证列的有序性,确保属性与实际数据排序状态一致,避免属性不符导致的查询异常。
内容的提问来源于stack exchange,提问作者marital_weeping
相关产品推荐
相关产品推荐

