KX参考说#1应该比#2快。
q)select from t where c2>15,c3<3.0
q)select from t where (c2>15) and c3<3.0
在第一个示例中,只有c3值对应c2值
在第二个示例中,将所有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