INSERT INTO tick VALUES
('2019-02-18 10:55:36.179760', 'ABC', 100.00),
('2019-02-18 10:55:26.179760', 'ABC', 100.00),
('2019-02-18 10:55:16.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'ABC', 100.00),
('2019-02-18 10:55:06.179760', 'YJM', 100.00),
('2019-02-18 10:55:01.179760', 'XYZ', 100.00);
此查詢使用標準SQL 窗口函數(shù)為表中的每個符號生成高,低,打開和關(guān)閉值,假設(shè)“ticks”包含最近交易日的數(shù)據(jù)。

參考粘貼用例:
WITH ranked AS
(SELECT symbol,
RANK() OVER w as r,
MIN(price) OVER w as min_pr,
MAX(price) OVER w as max_pr,
FIRST_VALUE(price) OVER w as first,
LAST_VALUE(price) OVER w as last
FROM tick
WINDOW w AS (PARTITION BY symbol
ORDER BY ts
ROWS BETWEEN UNBOUNDED PREDING
AND UNBOUNDED FOLLOWING))
SELECT symbol, min_pr, max_por, first, last
FROM ranked
WHERE r = 1;
類似的查詢可用于創(chuàng)建“燭臺圖表”,這是一種流行的金融時間序列報表樣式,如下圖所示,可顯示連續(xù)時間間隔內(nèi)證券的開盤價,最高價,最低價和收盤價:
例如,該查詢生成一個表,該表可以在三分鐘的時間間隔內(nèi)直接轉(zhuǎn)換為燭臺圖表:
Results:
結(jié)果:
平滑是時間序列管理的另一個常見需求。這個查詢?yōu)楣善薄癆BC”生成一個平滑的價格序列,平均最后三個記錄的價格:
Results:
結(jié)果:
MemSQL支持用戶定義的標量函數(shù)(UDF),聚合函數(shù)和存儲過程(MPSQL語言)的可擴展性。MemSQL將UDF和存儲過程編譯為機器代碼,以獲得高性能。實際上,我使用了可擴展性來創(chuàng)建上一節(jié)中用作UDF 的time_bucket()函數(shù)(如下面的附錄所示); 這為其他特定時間序列產(chǎn)品中的類似功能提供了相同的功能。您可以很容易地創(chuàng)建一個函數(shù)或表達式來按時間間隔存儲,例如秒、分鐘、小時或天。時間序列數(shù)據(jù)的一個常見需求是執(zhí)行插值。
例如,假設(shè)有一個時間序列,其中隨機間隔的點平均間隔為30秒??赡苡袔追昼姏]有數(shù)據(jù)點。因此,如果您將原始(不規(guī)則)時間序列數(shù)據(jù)轉(zhuǎn)換為具有一分鐘點的常規(guī)時間序列,則可能存在間隙。如果要為沒有間隙的繪圖提供輸出,則需要從間隙前后的值中插入間隙的值。在MemSQL中實現(xiàn)存儲過程非常簡單,方法是獲取一個查詢結(jié)果,并輸出一個行集,其中的空格插入到一個臨時表中。
然后可以使用ECHO命令將其發(fā)送回客戶端應(yīng)用程序。此外,MemSQL支持用戶定義的聚合函數(shù),這些函數(shù)可用于實現(xiàn)有用的時間序列操作,例如獲取序列中第一個和最后一個值的簡寫,而無需特定的窗口函數(shù)。根據(jù)一個名為FIRST()的用戶定義的聚合函數(shù)(UDAF),考慮此查詢以在每三分鐘的交易中獲得股票ABC的第一個值:

參考粘貼用例:
SELECT time_bucket('3 minte', ts), first(price, ts)
FROM tick WHERE symbol = "ABC"
GROUP BY 1
ORDER BY 1;
FIRST()和類似的LAST() UDAF的實現(xiàn)在下面的補充材料部分中給出。
MemSQL擅長處理時間序列事件的突發(fā)插入流量和節(jié)省空間很重要的歷史時間序列信息。對于突發(fā)插入流量,您可以使用MemSQL行存儲表來保存時間序列事件。對于較大和較長生命周期的時間序列事件集或已經(jīng)老化的較老的時間序列數(shù)據(jù)集(因此不再更新它們),MemSQLcolumnstore是一種很好的格式,因為它可以非常有效地壓縮時間序列數(shù)據(jù)。此外,它保存在磁盤上,因此主內(nèi)存大小不限制您可以存儲的數(shù)據(jù)量。
構(gòu)建時間序列應(yīng)用程序時,數(shù)據(jù)可以有許多來源,包括應(yīng)用程序,文件系統(tǒng),S3,HDFS,Azure Blob商店和Kafka隊列。MemSQL可以從所有這些來源快速地獲取數(shù)據(jù)。MemSQL Pipelines專門用于快速輕松地從這些源加載數(shù)據(jù)流,無需過程編碼即可在MemSQL中建立快速的事件流。MemSQL可以以驚人的數(shù)據(jù)速率提取數(shù)據(jù)。在最近的一次測試中,我使用了一個雙節(jié)點MemSQL集群,每個節(jié)點在Intel Xeon Platinum 28核系統(tǒng)上運行,每秒直接從應(yīng)用程序插入2,850,500個事件,具有完整的事務(wù)完整性和持久性。可以使用直接加載或Kafka管道獲得更好的速率。如果你必須擴展更高,只需添加更多節(jié)點 - 沒有實際限制。
我們已經(jīng)看到,時間序列數(shù)據(jù)管理市場已經(jīng)分化為時間序列專用產(chǎn)品,使用它們自己的專用語言;以及可以與使用SQL的標準報告和業(yè)務(wù)智能工具互操作的擴展SQL系統(tǒng)。MemSQL屬于第二類。MemSQL適用于需要快速查詢,低延遲查詢和高并發(fā)性的時間序列應(yīng)用程序,沒有擴展限制,并且受益于SQL語言功能和SQL工具連接。
許多特定于時間序列的產(chǎn)品在數(shù)據(jù)管理方面都有缺陷。有些應(yīng)用程序缺乏擴展功能,限制了它們可以處理的問題的大小,或者迫使應(yīng)用程序開發(fā)人員在代碼中構(gòu)建復(fù)雜的分片邏輯,以便在多個實例之間分割數(shù)據(jù),這將耗費寶貴的人力資源,而這些人力資源可以更好地投入到應(yīng)用程序業(yè)務(wù)邏輯中。其他系統(tǒng)的解釋查詢處理器無法跟上我們這樣的最新查詢執(zhí)行實現(xiàn)。有些缺少SQL數(shù)據(jù)庫常見的事務(wù)處理完整性功能。MemSQL讓時間序列應(yīng)用程序開發(fā)人員充滿信心地前進,他們知道自己不會遇到規(guī)模瓶頸,并且可以使用所有熟悉的工具——任何可以連接到SQL數(shù)據(jù)庫的工具。
MemSQL是一個用于管理時間序列數(shù)據(jù)的強大平臺。它支持快速方便地加載事件流的能力,并且可以無限擴展。它支持完整的SQL,可以使用SQL 92的所有標準功能,以及添加的窗口函數(shù)擴展來實現(xiàn)復(fù)雜的查詢。它支持許多開發(fā)人員對各種應(yīng)用程序(包括時間序列)所需的事務(wù),高速并發(fā)更新和查詢以及高可用性技術(shù)。而且,您最喜歡的SQL兼容工具可以連接到MemSQL,這使得MemSQL成為時間序列的強大平臺。