kdb:短语和性能

kgf3JfUtW

KX参考资料指出#1应该比#2快。

q)select from t where c2>15,c3<3.0
q)select from t where (c2>15) and c3<3.0

在第一个示例中,仅测试与大于15的c2值相对应的c3值。

在第二个示例中,将所有c2值与15进行比较,并将所有c3值与3.0进行比较。两个结果向量相加在一起。

---

但是,我注意到在下面的示例中情况恰恰相反。我想念什么吗?

N:100000000;
t:([]a:N?1000;b:N?1000;c:N?1000)
\t select from t where a>500,b>500;        / ~500ms
\t select from t where (a>500) and b>500;  / ~390ms
特里林奇

这是一个一般性的陈述-当他们说should速度更快时,它们的意思是在大多数实际情况下。在某些情况下,根据数据的形状,某些方法并不会很快。

在您的情况下,由于第一个过滤器并未大量减少数据集(将数据集减半),因此将第二个过滤器之前的第二个列“减半”的开销恰好大于完全将第二个过滤器应用于整个第二列(毕竟,kdb在矢量运算中非常快)。

例如,如果您的第一个过滤器将数据集减少了很多,那么您将看到更多的速度提升,因为将第二个过滤器应用于较小集合的开销减少更为明显:

q)\t select from t where a<10,b>500;
263
q)\t select from t where (a<10) and b>500;
450

q)\t select from t where a=950,b>500;
208
q)\t select from t where (a=950) and b>500;
422

如果第一列应用了属性 `g#(例如,“内存中”或 `p#“磁盘上”),则速度改进将更加明显而且,由于在大多数大批量生产方案中都会使用属性来加快第一个过滤器的速度,因此它们声明应该更快一些(几乎暗示着,如果不是,那您可能就没有在使用属性!)。

这是一个极端的示例,其中a列具有排序属性:

q)`a xasc `t;
q)\t select from t where a=950,b>500;
1
q)\t select from t where (a=950) and b>500;
428

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章