KDB / Q:什么是Vector操作?

时间:2017-09-21 19:50:45

标签: kdb

我正在学习KDB +和Q编程并阅读以下声明 -  "选择对列列表执行向量操作"。 矢量操作在这里意味着什么?有人可以用一个例子来解释一下吗?另外,它如何比标准SQL更快?

3 个答案:

答案 0 :(得分:4)

向量运算是一个采用一个或多个向量并产生另一个向量的运算。例如,q中的+是向量运算:

q)a:1 2 3
q)b:10 20 30
q)a + b
11 22 33

如果ab是表中的列,则可以在select语句中对它们执行向量运算。继续前面的示例,让我们将ab向量作为列放在表中:

q)([]a;b)
a b
----
1 10
2 20
3 30

现在,

q)select c:a + b from ([]a;b)
c
--
11
22
33

select语句执行了相同的a+b向量添加,但是将输入和返回的输出作为表列。

  

它比标准SQL更快?

"标准" SQL实现通常逐行存储数据。在具有许多列的表中,列的第一个元素及其第二个元素可以在内存中由来自其他列的数据分隔。当数据连续存储时,现代计算机最有效地运行。在kdb +中,这是通过逐列存储表来实现的。

答案 1 :(得分:0)

vector是相同类型的原子列表。一些例子:

2 3 4 5                   / int
"A fine, clear day"       / char 
`ibm`goog`aapl`ibm`msft   / symbol
2017.01 2017.02 2017.03m  / month

Kdb +非常有效地存储和处理向量。问operators - 不只是+-*%,而是mcountratiosprds - 针对向量进行了优化。

当向量具有attributes时,这些运算符可以更高效,例如u(无重复项)和s(项目按升序排列)。

当表格列是向量时,可以获得相同的效率。这些效率不适用于标准SQL,它将表视为无序行集。

面向列,kdb +可以splay个大表,将每个列存储为单独的文件,从大表中选择时可以减少文件I / O.

答案 2 :(得分:0)

句子表示当您使用列标签引用表的特定列时,它将被解析为整个列列表,而不是其中的每个元素,并且对其进行的任何操作都应理解为列表操作。 / p>

q)show t: flip `a`b!(til 3;10*til 3)
a b 
----
0 0 
1 10
2 20
q)select x: count a, y: type b from t
x y
---
3 7
q)type t[`b]
7h
q)type first t[`b]
-7h
上面的q-sql中的

count a相当于count t[`a] count 0 1 2 = 3.同样适用于type b;正返回值7表示b是列表而不是原子:http://code.kx.com/q/ref/datatypes/#primitive-datatypes

相关问题