2017-09-21 94 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