2017-09-21 96 views
0

我正在学习KDB +和Q编程,并阅读以下语句 - “select在列列表上执行向量操作”。 矢量操作是什么意思?有人可以用一个例子来解释吗?另外,它如何比标准SQL更快?KDB/Q:什么是矢量操作?

回答

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 +中,这是通过逐列存储表来实现的。

+0

感谢您的详细解释Alexander。 – userknight

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 +非常高效地存储和处理载体。 Q operators - 不仅仅是+-*%而且例如mcount,ratiosprds - 针对载体进行了优化。

当矢量有​​,如u(无重复项目)和s(项目按升序排列)时,这些运算符会更有效。

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

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

0

这句话意味着,当你引用一个表的一个列标签的特定列,它被分解成整列列表,而不是它的每一个元素,并在其上的任何操作应被理解为列表操作。

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