【发布时间】:2017-09-21 19:50:44
【问题描述】:
我正在学习 KDB+ 和 Q 编程并阅读以下声明 - “选择对列列表执行向量操作”。 向量运算在这里是什么意思?有人可以举个例子解释一下吗?另外,它比标准 SQL 快多少?
【问题讨论】:
标签: kdb
我正在学习 KDB+ 和 Q 编程并阅读以下声明 - “选择对列列表执行向量操作”。 向量运算在这里是什么意思?有人可以举个例子解释一下吗?另外,它比标准 SQL 快多少?
【问题讨论】:
标签: kdb
向量运算是采用一个或多个向量并产生另一个向量的运算。比如q中的+就是一个向量运算:
q)a:1 2 3
q)b:10 20 30
q)a + b
11 22 33
如果a 和b 是表中的列,您可以在select 语句中对它们执行向量操作。继续前面的例子,让我们将a 和b 向量作为列放在一个表中:
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+ 中,这是通过逐列存储表来实现的。
【讨论】:
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——不仅仅是+-*%,而是例如mcount、ratios、prds – 针对向量进行了优化。
当向量有attributes,例如u(无重复项)和s(项按升序排列)时,这些运算符的效率会更高。
当表列是向量时,同样的效率是可用的。这些效率不适用于标准 SQL,标准 SQL 将表视为无序的行集。
由于是面向列的,kdb+ 可以splay 大表,将每一列存储为单独的文件,从而减少从大表中选择时的文件 I/O。
【讨论】:
这句话的意思是当你用列标签引用一个表的特定列时,它被解析为整个列列表,而不是它的每个元素,对它的任何操作都应理解为列表操作。
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
【讨论】: