q kdb中垂直连接方面分区表和未分区表的差异

时间:2019-08-09 05:43:45

标签: kdb

我有两个未分区的表:

q)s:([] date:(2019.07.01;2019.07.01;2019.07.02;2019.07.01;2019.07.05); co:`a`b`f`b`c)
q)t:([] date:(2019.07.01;2019.07.01;2019.07.02;2019.07.01;2019.07.07); co:`a`b`e`b`d)

在上面的表中,当我在下面的查询中运行时,它运行正常。

q)select distinct co from s,t where date within 2019.07.01 2019.07.02
co
--
a
b
f
e

我有按日期分区的同名表,当我尝试对分区表运行相同的查询时,出现以下错误:

ERROR: 'par 
(trying to update a physically partitioned table)
  1. 为什么在分区表中出现上述错误?
  2. 获得与未分区表中相似的输出的优化方法是什么?

我认为这是蛮力的解决2问题的方法:

select distinct co from((select distinct co from s where date within 2019.07.01 2019.07.02),select distinct co from t where date within 2019.07.01 2019.07.02)

1 个答案:

答案 0 :(得分:1)

我假设您仅在源表中包括日期名称以协助查询。日期分区表将从hdb结构生成虚拟日期列,您不应将其包括在要写入的实际表中。

  
      
  1. 为什么在分区表中出现上述错误?
  2.   

除了通过初始的select语句外,没有其他方法可以避免访问分区表的数据。。在这种情况下,您直接尝试对,s表执行t操作

  
      
  1. 获得与未分区表中相似的输出的优化方法是什么?
  2.   

通常,表的大小与操作的性质和频率之间可能需要权衡取舍,有时可能需要将表存储到内存中以进行频繁的连接,或者使用以下命令创建顶级平面表:相关的数据子集。

如果这只是用于较大操作的通用测试用例,那么以下内容将是理想的选择

distinct raze {select distinct co from x where date within 2019.07.01 2019.07.02} each `s`t

此性能与您自己的查询并没有很大不同,但是只是更加简洁。