首页 文章

KDB / Q:什么是Vector操作?

提问于
浏览
0

我正在学习KDB和Q编程,并阅读以下语句 - "select performs vector operations on column lists" . Vector operation 在这里是什么意思?有人可以用一个例子来解释一下吗?另外,它如何比标准SQL更快?

3 回答

  • 0

    向量运算是一个采用一个或多个向量并产生另一个向量的运算 . 例如,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

    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.

  • 4

    该句子表示当您引用具有列标签的表的特定列时,它将被解析为整个列列表,而不是其中的每个元素,并且对其的任何操作都应被理解为列表操作 .

    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

相关问题