我一直在研究 DolphinDB 查询,该查询旨在选择分区表中列的不同值。我尝试了三种不同的方法,它们表现出不同的性能。我想了解为什么会这样。
具体来说,我需要选择非分区列的不同值。我将给出一个最小的例子和我的三个实现。
为简单起见,我定义了一个内存分区表,它只包含两列和 10 个分区。我在其中插入了 100,000,000 行随机数据。
partitionNum = 10
db = database("", VALUE, 0..(partitionNum - 1))
t = db.createPartitionedTable(table(1000:0, `id`val, [INT,INT]), `t, `id)
n = 100000000
insert into t values(rand(partitionNum, n), rand(10000000, n))
然后我使用以下三种方法来获取不同的值:
- 天真地检索不同的值。
distinctVal = select distinct(val) from t
- 首先检索所需的列,然后应用于
distinct
结果。
val = exec val from t
distinctVal = distinct(val)
- 将
group by
关键字与first
聚合函数结合使用。
distinctVal = select first(val) from t group by val
我曾经timer
测量经过的时间:
timer {
distinctVal = select distinct(val) from t
}
// Time elapsed: 14761.95 ms
timer {
val = exec val from t
distinctVal = distinct(val)
}
// Time elapsed: 8269.531 ms
timer {
distinctVal = select first(val) from t group by val
}
// Time elapsed: 3481.814 ms
我想了解为什么它们的性能如此不同,以及是否group by
应该始终将最快的实现用于类似的场景。