KDB/Q:什么是向量运算?

KDB/Q:什么是向量运算?,kdb,Kdb,我正在学习KDB+和Q编程,并阅读以下语句- “选择对列列表执行向量操作”。向量运算在这里是什么意思?有人能举例说明吗?还有,它比标准SQL快多少?向量操作是一种接受一个或多个向量并生成另一个向量的操作。例如,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

我正在学习KDB+和Q编程,并阅读以下语句-
“选择对列列表执行向量操作”。向量运算在这里是什么意思?有人能举例说明吗?还有,它比标准SQL快多少?

向量操作是一种接受一个或多个向量并生成另一个向量的操作。例如,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
现在,

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

它比标准SQL快多少


“标准”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
现在,

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

它比标准SQL快多少

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

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

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–不仅仅是
+-*%
,而且例如
mcount
比率
PRD
–针对向量进行了优化

当有向量时,这些操作符甚至更有效,例如
u
(无重复项)和
s
(项按升序排列)

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

由于是面向列的,kdb+可以存储大型表,将每个列存储为一个单独的文件,从而在从大型表中选择时减少文件I/O

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

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–不仅仅是
+-*%
,而且例如
mcount
比率
PRD
–针对向量进行了优化

当有向量时,这些操作符甚至更有效,例如
u
(无重复项)和
s
(项按升序排列)

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


由于是面向列的,kdb+可以存储大型表,将每个列存储为一个单独的文件,从而在从大型表中选择时减少文件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中的
计数a
相当于
计数t[`a]
,即
计数0 1 2
=3。b类也是如此;正返回值7表示
b
是一个列表,而不是一个原子:

这句话的意思是,当您引用带有列标签的表的特定列时,它被解析为整个列列表,而不是它的每个元素,对它的任何操作都应理解为列表操作

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中的
计数a
相当于
计数t[`a]
,即
计数0 1 2
=3。b类也是如此;正返回值7表示
b
是一个列表,而不是一个原子:

感谢Alexander的详细解释。感谢Alexander的详细解释。