Cơ sở dữ liệu KDB+: từ tài chính đến Công thức 1

KDB+, sản phẩm của công ty KX là một cơ sở dữ liệu dạng cột được biết đến rộng rãi trong phạm vi hẹp, cực kỳ nhanh, được thiết kế để lưu trữ chuỗi thời gian và các phép tính phân tích dựa trên chúng. Ban đầu, nó rất phổ biến trong ngành tài chính - tất cả 10 ngân hàng đầu tư hàng đầu và nhiều quỹ phòng hộ, sàn giao dịch và tổ chức khác nổi tiếng đều sử dụng nó. Gần đây, KX quyết định mở rộng cơ sở khách hàng của mình và hiện cung cấp các giải pháp trong các lĩnh vực khác, nơi có lượng dữ liệu lớn, được sắp xếp theo thời gian hoặc cách khác - viễn thông, tin sinh học, sản xuất, v.v. Họ cũng trở thành đối tác của đội đua Aston Martin Red Bull Racing ở Công thức 1, nơi họ giúp thu thập và xử lý dữ liệu từ các cảm biến ô tô cũng như phân tích các bài kiểm tra trong hầm gió. Trong bài viết này, tôi muốn cho bạn biết những tính năng nào của KDB+ khiến nó có hiệu suất vượt trội, tại sao các công ty sẵn sàng chi nhiều tiền cho nó và cuối cùng, tại sao nó không thực sự là một cơ sở dữ liệu.
 
Cơ sở dữ liệu KDB+: từ tài chính đến Công thức 1
 
Trong bài viết này, tôi sẽ cố gắng giải thích tổng quát cho bạn KDB+ là gì, những khả năng và hạn chế của nó cũng như những lợi ích của nó đối với các công ty muốn xử lý lượng lớn dữ liệu. Tôi sẽ không đi sâu vào chi tiết việc triển khai KDB+ hoặc chi tiết về ngôn ngữ lập trình Q của nó. Cả hai chủ đề này đều rất rộng và xứng đáng được viết riêng. Bạn có thể tìm thấy rất nhiều thông tin về các chủ đề này tại code.kx.com, bao gồm cả cuốn sách về Q - Q For Mortals (xem liên kết bên dưới).

Một số điều khoản

  • Cơ sở dữ liệu trong bộ nhớ. Cơ sở dữ liệu lưu trữ dữ liệu trong RAM để truy cập nhanh hơn. Ưu điểm của cơ sở dữ liệu như vậy là rõ ràng, nhưng nhược điểm là khả năng mất dữ liệu và cần có nhiều bộ nhớ trên máy chủ.
  • Cơ sở dữ liệu cột. Cơ sở dữ liệu nơi dữ liệu được lưu trữ theo từng cột thay vì ghi theo bản ghi. Ưu điểm chính của cơ sở dữ liệu như vậy là dữ liệu từ một cột được lưu trữ cùng nhau trên đĩa và trong bộ nhớ, giúp tăng tốc đáng kể khả năng truy cập vào nó. Không cần tải các cột không được sử dụng trong truy vấn. Nhược điểm chính là khó sửa đổi và xóa bản ghi.
  • Chuỗi thời gian. Dữ liệu có cột ngày hoặc giờ. Thông thường, thứ tự thời gian rất quan trọng đối với dữ liệu đó, để bạn có thể dễ dàng xác định bản ghi nào đứng trước hoặc theo sau bản ghi hiện tại hoặc áp dụng các hàm có kết quả phụ thuộc vào thứ tự của bản ghi. Cơ sở dữ liệu cổ điển được xây dựng trên một nguyên tắc hoàn toàn khác - biểu diễn một tập hợp các bản ghi dưới dạng một tập hợp, trong đó về nguyên tắc, thứ tự của các bản ghi không được xác định.
  • Vectơ. Trong ngữ cảnh của KDB+, đây là danh sách các phần tử có cùng loại nguyên tử, ví dụ: số. Nói cách khác, một mảng các phần tử. Mảng, không giống như danh sách, có thể được lưu trữ nhỏ gọn và xử lý bằng các lệnh của bộ xử lý vector.

 

Thông tin lịch sử

KX được thành lập vào năm 1993 bởi Arthur Whitney, người trước đây làm việc tại Ngân hàng Morgan Stanley về ngôn ngữ A+, kế thừa của APL - một ngôn ngữ rất nguyên bản và phổ biến một thời trong thế giới tài chính. Tất nhiên, ở KX, Arthur vẫn tiếp tục với tinh thần tương tự và tạo ra ngôn ngữ hàm vectơ K, được hướng dẫn bởi những ý tưởng về chủ nghĩa tối giản triệt để. Các chương trình K trông giống như một mớ hỗn độn các dấu câu và ký tự đặc biệt, ý nghĩa của các dấu hiệu và hàm phụ thuộc vào ngữ cảnh và mỗi thao tác mang nhiều ý nghĩa hơn so với các ngôn ngữ lập trình thông thường. Do đó, chương trình K chiếm không gian tối thiểu—một vài dòng có thể thay thế các trang văn bản bằng ngôn ngữ dài dòng như Java—và là cách triển khai thuật toán siêu tập trung.
 
Một hàm trong K triển khai hầu hết trình tạo trình phân tích cú pháp LL1 theo một ngữ pháp nhất định:

1. pp:{q:{(x;p3(),y)};r:$[-11=@x;$x;11=@x;q[`N;$*x];10=abs@@x;q[`N;x]  
2.   ($)~*x;(`P;p3 x 1);(1=#x)&11=@*x;pp[{(1#x;$[2=#x;;,:]1_x)}@*x]  
3.      (?)~*x;(`Q;pp[x 1]);(*)~*x;(`M;pp[x 1]);(+)~*x;(`MP;pp[x 1]);(!)~*x;(`Y;p3 x 1)  
4.      (2=#x)&(@x 1)in 100 101 107 7 -7h;($[(@x 1)in 100 101 107h;`Ff;`Fi];p3 x 1;pp[*x])  
5.      (|)~*x;`S,(pp'1_x);2=#x;`C,{@[@[x;-1+#x;{x,")"}];0;"(",]}({$[".s.C"~4#x;6_-2_x;x]}'pp'x);'`pp];  
6.   $[@r;r;($[1<#r;".s.";""],$*r),$[1<#r;"[",(";"/:1_r),"]";""]]}  

 Arthur thể hiện triết lý về hiệu quả cực cao này với tối thiểu chuyển động cơ thể trong KDB +, xuất hiện vào năm 2003 (tôi nghĩ bây giờ đã rõ chữ K trong tên đến từ đâu) và không gì khác hơn là một thông dịch viên của phiên bản thứ tư của K Một phiên bản thân thiện hơn với người dùng đã được thêm vào trên K K có tên Q. Q cũng đã thêm hỗ trợ cho một phương ngữ cụ thể của SQL - QSQL và trình thông dịch - hỗ trợ các bảng dưới dạng kiểu dữ liệu hệ thống, các công cụ để làm việc với bảng trong bộ nhớ và trên đĩa, v.v.
 
Vì vậy, từ góc độ người dùng, KDB+ chỉ đơn giản là một trình thông dịch ngôn ngữ Q có hỗ trợ các bảng và biểu thức kiểu LINQ giống SQL từ C#. Đây là điểm khác biệt quan trọng nhất giữa KDB+ và các cơ sở dữ liệu khác cũng như lợi thế cạnh tranh chính của nó, thường bị bỏ qua. Đây không phải là cơ sở dữ liệu + ngôn ngữ phụ trợ bị vô hiệu hóa mà là ngôn ngữ lập trình mạnh mẽ hoàn chỉnh + hỗ trợ tích hợp cho các chức năng cơ sở dữ liệu. Sự khác biệt này sẽ đóng vai trò quyết định trong việc liệt kê tất cả các lợi ích của KDB+. Ví dụ…
 

kích thước

Theo tiêu chuẩn hiện đại, KDB+ chỉ có kích thước cực nhỏ. Theo nghĩa đen, nó là một tệp thực thi dưới megabyte và một tệp văn bản nhỏ với một số chức năng hệ thống. Trên thực tế - ít hơn một megabyte và đối với chương trình này, các công ty phải trả hàng chục nghìn đô la mỗi năm cho một bộ xử lý trên máy chủ.

  • Kích thước này cho phép KDB+ hoạt động tốt trên mọi phần cứng - từ máy vi tính Pi đến máy chủ có bộ nhớ terabyte. Điều này không ảnh hưởng đến chức năng theo bất kỳ cách nào; hơn nữa, Q khởi động ngay lập tức, cho phép nó được sử dụng, cùng với những thứ khác, làm ngôn ngữ kịch bản.
  • Ở kích thước này, trình thông dịch Q hoàn toàn phù hợp với bộ nhớ đệm của bộ xử lý, giúp tăng tốc độ thực thi chương trình.
  • Với kích thước này của tệp thực thi, quy trình Q chiếm dung lượng không đáng kể trong bộ nhớ; bạn có thể chạy hàng trăm quy trình. Hơn nữa, nếu cần, Q có thể hoạt động với hàng chục hoặc hàng trăm gigabyte bộ nhớ trong một quy trình.

linh hoạt

Q rất tốt cho nhiều ứng dụng. Quy trình Q có thể hoạt động như một cơ sở dữ liệu lịch sử và cung cấp quyền truy cập nhanh vào hàng terabyte thông tin. Ví dụ: chúng tôi có hàng chục cơ sở dữ liệu lịch sử, trong đó một số cơ sở dữ liệu không nén chiếm hơn 100 gigabyte. Tuy nhiên, với những hạn chế hợp lý, một truy vấn tới cơ sở dữ liệu sẽ được hoàn thành trong hàng chục đến hàng trăm mili giây. Nói chung, chúng tôi có thời gian chờ chung cho các yêu cầu của người dùng - 30 giây - và nó rất hiếm khi hoạt động.
 
Q có thể dễ dàng trở thành cơ sở dữ liệu trong bộ nhớ. Dữ liệu mới được thêm vào các bảng trong bộ nhớ nhanh đến mức yêu cầu của người dùng là yếu tố hạn chế. Dữ liệu trong bảng được lưu trữ trong các cột, nghĩa là mọi thao tác trên một cột sẽ sử dụng hết công suất bộ nhớ đệm của bộ xử lý. Ngoài ra, KX còn cố gắng thực hiện tất cả các phép toán cơ bản như số học thông qua các lệnh vectơ của bộ xử lý, tối đa hóa tốc độ của chúng. Q cũng có thể thực hiện các tác vụ không điển hình cho cơ sở dữ liệu - ví dụ: xử lý dữ liệu truyền phát và tính toán trong “thời gian thực” (với độ trễ từ hàng chục mili giây đến vài giây tùy theo tác vụ) các chức năng tổng hợp khác nhau cho các công cụ tài chính trong thời gian khác nhau hoặc xây dựng mô hình về ảnh hưởng của các giao dịch hoàn hảo đến thị trường và thực hiện lập hồ sơ gần như ngay lập tức sau khi hoàn thành. Trong những tác vụ như vậy, độ trễ thời gian chính thường không phải là Q mà là nhu cầu đồng bộ hóa dữ liệu từ các nguồn khác nhau. Đạt được tốc độ cao là do dữ liệu và các hàm xử lý chúng nằm trong một quy trình và quá trình xử lý được giảm xuống để thực thi một số biểu thức và phép nối QSQL, không được diễn giải mà được thực thi bằng mã nhị phân.
 
Cuối cùng, bạn có thể viết bất kỳ quy trình dịch vụ nào trong Q. Ví dụ: các quy trình của Gateway tự động phân phối yêu cầu của người dùng đến cơ sở dữ liệu và máy chủ cần thiết. Lập trình viên có toàn quyền tự do thực hiện bất kỳ thuật toán nào để cân bằng, ưu tiên, chịu lỗi, quyền truy cập, hạn ngạch và về cơ bản bất kỳ điều gì khác mà anh ta mong muốn. Vấn đề chính ở đây là bạn sẽ phải tự mình thực hiện tất cả những điều này.
 
Để làm ví dụ, tôi sẽ liệt kê những loại quy trình mà chúng tôi có. Tất cả chúng đều được sử dụng tích cực và hoạt động cùng nhau, kết hợp hàng chục cơ sở dữ liệu khác nhau thành một, xử lý dữ liệu từ nhiều nguồn và phục vụ hàng trăm người dùng và ứng dụng.

  • Trình kết nối (bộ xử lý nguồn cấp dữ liệu) với nguồn dữ liệu. Các quy trình này thường sử dụng các thư viện bên ngoài được tải vào Q. Giao diện C trong Q cực kỳ đơn giản và cho phép bạn dễ dàng tạo các hàm proxy cho bất kỳ thư viện C/C++ nào. Q đủ nhanh để xử lý đồng thời một loạt thông báo FIX từ tất cả các sàn giao dịch chứng khoán châu Âu.
  • Nhà phân phối dữ liệu (tickerplant), đóng vai trò là cầu nối trung gian giữa người kết nối và người tiêu dùng. Đồng thời, chúng ghi dữ liệu đến vào nhật ký nhị phân đặc biệt, mang lại khả năng bảo vệ mạnh mẽ cho người tiêu dùng khỏi tình trạng mất kết nối hoặc khởi động lại.
  • Cơ sở dữ liệu trong bộ nhớ (rdb). Những cơ sở dữ liệu này cung cấp khả năng truy cập nhanh nhất có thể vào dữ liệu thô, mới bằng cách lưu trữ nó trong bộ nhớ. Thông thường, họ tích lũy dữ liệu vào các bảng vào ban ngày và đặt lại chúng vào ban đêm.
  • Cơ sở dữ liệu liên tục (pdb). Những cơ sở dữ liệu này đảm bảo rằng dữ liệu ngày nay được lưu trữ trong cơ sở dữ liệu lịch sử. Theo quy định, không giống như rdb, chúng không lưu trữ dữ liệu trong bộ nhớ mà sử dụng bộ nhớ đệm đặc biệt trên đĩa vào ban ngày và sao chép dữ liệu vào lúc nửa đêm vào cơ sở dữ liệu lịch sử.
  • Cơ sở dữ liệu lịch sử (hdb). Những cơ sở dữ liệu này cung cấp quyền truy cập vào dữ liệu của những ngày, tháng và năm trước đó. Kích thước của chúng (tính theo ngày) chỉ bị giới hạn bởi kích thước của ổ cứng. Dữ liệu có thể được đặt ở bất cứ đâu, đặc biệt trên các đĩa khác nhau để tăng tốc độ truy cập. Có thể nén dữ liệu bằng một số thuật toán để lựa chọn. Cấu trúc của cơ sở dữ liệu được ghi chép rõ ràng và đơn giản, dữ liệu được lưu trữ theo từng cột trong các tệp thông thường nên có thể được xử lý, kể cả bằng hệ điều hành.
  • Cơ sở dữ liệu với thông tin tổng hợp. Chúng lưu trữ nhiều tập hợp khác nhau, thường được nhóm theo tên nhạc cụ và khoảng thời gian. Cơ sở dữ liệu trong bộ nhớ cập nhật trạng thái của chúng với mỗi tin nhắn đến và cơ sở dữ liệu lịch sử lưu trữ dữ liệu được tính toán trước để tăng tốc độ truy cập vào dữ liệu lịch sử.
  • Cuối cùng, quy trình cổngphục vụ ứng dụng và người dùng. Q cho phép bạn triển khai xử lý hoàn toàn không đồng bộ các tin nhắn đến, phân phối chúng trên cơ sở dữ liệu, kiểm tra quyền truy cập, v.v. Lưu ý rằng các thông báo không bị giới hạn và thường không phải là biểu thức SQL, như trường hợp trong các cơ sở dữ liệu khác. Thông thường, biểu thức SQL được ẩn trong một hàm đặc biệt và được xây dựng dựa trên các tham số mà người dùng yêu cầu - thời gian được chuyển đổi, lọc, dữ liệu được chuẩn hóa (ví dụ: giá cổ phiếu được cân bằng nếu trả cổ tức), v.v.

Kiến trúc điển hình cho một kiểu dữ liệu:

Cơ sở dữ liệu KDB+: từ tài chính đến Công thức 1

tốc độ

Mặc dù Q là ngôn ngữ thông dịch nhưng nó cũng là ngôn ngữ vectơ. Điều này có nghĩa là nhiều hàm dựng sẵn, đặc biệt là các hàm số học, nhận các đối số ở bất kỳ dạng nào - số, vectơ, ma trận, danh sách - và người lập trình phải triển khai chương trình dưới dạng các phép toán mảng. Trong một ngôn ngữ như vậy, nếu bạn thêm hai vectơ gồm một triệu phần tử, thì việc ngôn ngữ đó được thông dịch không còn quan trọng nữa; phép cộng sẽ được thực hiện bởi một hàm nhị phân siêu tối ưu hóa. Vì phần lớn thời gian trong các chương trình Q được dành cho các hoạt động với các bảng sử dụng các hàm vectơ cơ bản này, nên đầu ra có tốc độ hoạt động rất tốt, cho phép chúng tôi xử lý một lượng lớn dữ liệu ngay cả trong một quy trình. Điều này tương tự với các thư viện toán học trong Python - mặc dù bản thân Python là một ngôn ngữ rất chậm, nhưng nó có nhiều thư viện tuyệt vời như numpy cho phép bạn xử lý dữ liệu số ở tốc độ của một ngôn ngữ được biên dịch (nhân tiện, numpy gần giống với Q về mặt tư tưởng). ).
 
Ngoài ra, KX đã thực hiện một cách tiếp cận rất cẩn thận trong việc thiết kế các bảng và tối ưu hóa công việc với chúng. Thứ nhất, một số loại chỉ mục được hỗ trợ, được hỗ trợ bởi các hàm dựng sẵn và có thể được áp dụng không chỉ cho các cột trong bảng mà còn cho bất kỳ vectơ nào - nhóm, sắp xếp, thuộc tính duy nhất và nhóm đặc biệt cho cơ sở dữ liệu lịch sử. Chỉ mục được áp dụng đơn giản và được điều chỉnh tự động khi thêm phần tử vào cột/vectơ. Các chỉ mục có thể được áp dụng thành công như nhau cho các cột của bảng cả trong bộ nhớ và trên đĩa. Khi thực hiện truy vấn QSQL, các chỉ mục sẽ được sử dụng tự động nếu có thể. Thứ hai, công việc với dữ liệu lịch sử được thực hiện thông qua cơ chế hiển thị các tệp hệ điều hành (bản đồ bộ nhớ). Các bảng lớn không bao giờ được tải vào bộ nhớ; thay vào đó, các cột cần thiết được ánh xạ trực tiếp vào bộ nhớ và chỉ một phần trong số chúng thực sự được tải (các chỉ mục cũng trợ giúp ở đây) cần thiết. Đối với người lập trình, dữ liệu có trong bộ nhớ hay không không có gì khác biệt, cơ chế làm việc với mmap hoàn toàn ẩn sâu trong Q.
 
KDB+ không phải là cơ sở dữ liệu quan hệ; các bảng có thể chứa dữ liệu tùy ý, trong khi thứ tự các hàng trong bảng không thay đổi khi các phần tử mới được thêm vào và có thể và nên được sử dụng khi viết truy vấn. Tính năng này rất cần thiết để làm việc với chuỗi thời gian (dữ liệu từ trao đổi, đo từ xa, nhật ký sự kiện), vì nếu dữ liệu được sắp xếp theo thời gian thì người dùng không cần sử dụng bất kỳ thủ thuật SQL nào để tìm hàng đầu tiên hoặc cuối cùng hoặc N các hàng trong bảng, xác định dòng nào theo dòng thứ N, v.v. Việc nối bảng thậm chí còn được đơn giản hóa hơn nữa, chẳng hạn như việc tìm báo giá cuối cùng cho 16000 giao dịch VOD.L (Vodafone) trong một bảng gồm 500 triệu phần tử mất khoảng một giây trên đĩa và hàng chục mili giây trong bộ nhớ.
 
Một ví dụ về nối thời gian - bảng báo giá được ánh xạ tới bộ nhớ, do đó không cần chỉ định VOD.L ở đâu, chỉ mục trên cột sym và việc dữ liệu được sắp xếp theo thời gian được ngầm sử dụng. Hầu hết tất cả các phép nối trong Q đều là các hàm thông thường, không phải là một phần của biểu thức chọn:

1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]  

Cuối cùng, điều đáng chú ý là các kỹ sư tại KX, bắt đầu từ chính Arthur Whitney, thực sự bị ám ảnh bởi tính hiệu quả và đã nỗ lực hết sức để tận dụng tối đa các tính năng tiêu chuẩn của Q cũng như tối ưu hóa các kiểu sử dụng phổ biến nhất.
 

Tổng

KDB+ phổ biến trong các doanh nghiệp chủ yếu do tính linh hoạt đặc biệt của nó - nó phục vụ tốt như một cơ sở dữ liệu trong bộ nhớ, làm cơ sở dữ liệu để lưu trữ hàng terabyte dữ liệu lịch sử và làm nền tảng để phân tích dữ liệu. Do việc xử lý dữ liệu diễn ra trực tiếp trong cơ sở dữ liệu nên tốc độ làm việc cao và tiết kiệm tài nguyên. Ngôn ngữ lập trình chính thức được tích hợp với các chức năng cơ sở dữ liệu cho phép bạn triển khai toàn bộ các quy trình cần thiết trên một nền tảng - từ nhận dữ liệu đến xử lý yêu cầu của người dùng.
 

Để biết thêm thông tin,

Hạn chế

Một nhược điểm đáng kể của KDB+/Q là ngưỡng đầu vào cao. Ngôn ngữ có cú pháp lạ, một số hàm bị quá tải nặng (ví dụ: giá trị có khoảng 11 trường hợp sử dụng). Quan trọng nhất, nó đòi hỏi một cách tiếp cận hoàn toàn khác để viết chương trình. Trong ngôn ngữ vectơ, bạn phải luôn suy nghĩ về các phép biến đổi mảng, triển khai tất cả các vòng lặp thông qua một số biến thể của hàm ánh xạ/rút gọn (được gọi là trạng từ trong Q) và không bao giờ cố gắng tiết kiệm tiền bằng cách thay thế các phép toán vectơ bằng các phép toán nguyên tử. Ví dụ, để tìm chỉ số lần xuất hiện thứ N của một phần tử trong mảng, bạn nên viết:

1. (where element=vector)[N]  

mặc dù điều này có vẻ cực kỳ kém hiệu quả theo tiêu chuẩn C/Java (= tạo ra một vectơ boolean, trong đó trả về chỉ mục thực của các phần tử trong đó). Nhưng ký hiệu này làm cho ý nghĩa của biểu thức rõ ràng hơn và bạn sử dụng các phép toán vectơ nhanh thay vì các phép toán nguyên tử chậm. Sự khác biệt về mặt khái niệm giữa ngôn ngữ vectơ và các ngôn ngữ khác có thể so sánh với sự khác biệt giữa các phương pháp lập trình mệnh lệnh và chức năng và bạn cần phải chuẩn bị cho điều này.
 
Một số người dùng cũng không hài lòng với QSQL. Vấn đề là nó chỉ trông giống SQL thực sự. Trên thực tế, nó chỉ là một trình thông dịch các biểu thức giống SQL và không hỗ trợ tối ưu hóa truy vấn. Người dùng phải tự viết các truy vấn tối ưu và trong Q, điều mà nhiều người chưa sẵn sàng. Mặt khác, tất nhiên, bạn luôn có thể tự viết truy vấn tối ưu thay vì dựa vào trình tối ưu hóa hộp đen.
 
Ngoài ra, cuốn sách về Q - Q For Mortals được cung cấp miễn phí tại trang web của công ty, ngoài ra còn có rất nhiều tài liệu hữu ích khác được sưu tầm ở đó.
 
Một bất lợi lớn khác là chi phí của giấy phép. Đó là hàng chục ngàn đô la mỗi năm cho mỗi CPU. Chỉ những công ty lớn mới có thể chi trả được những chi phí như vậy. Gần đây, KX đã thực hiện chính sách cấp phép của mình linh hoạt hơn và cung cấp cơ hội chỉ trả tiền cho thời gian sử dụng hoặc thuê KDB+ trên đám mây của Google và Amazon. KX cũng cung cấp để tải xuống phiên bản miễn phí cho mục đích phi thương mại (Phiên bản 32 bit hoặc 64 bit theo yêu cầu).
 

đối thủ cạnh tranh

Có khá nhiều cơ sở dữ liệu chuyên biệt được xây dựng dựa trên các nguyên tắc tương tự - cột, trong bộ nhớ, tập trung vào lượng dữ liệu rất lớn. Vấn đề là đây là những cơ sở dữ liệu chuyên biệt. Một ví dụ nổi bật là Clickhouse. Cơ sở dữ liệu này có nguyên tắc rất giống với KDB+ để lưu trữ dữ liệu trên đĩa và xây dựng chỉ mục; nó thực hiện một số truy vấn nhanh hơn KDB+, mặc dù không đáng kể. Nhưng ngay cả với tư cách là một cơ sở dữ liệu, Clickhouse vẫn chuyên biệt hơn KDB+ - phân tích trang web so với chuỗi thời gian tùy ý (sự khác biệt này rất quan trọng - chẳng hạn, vì nó, trong Clickhouse không thể sử dụng thứ tự các bản ghi). Tuy nhiên, quan trọng nhất, Clickhouse không có tính linh hoạt của KDB+, một ngôn ngữ cho phép xử lý dữ liệu trực tiếp trong cơ sở dữ liệu, thay vì tải dữ liệu trước vào một ứng dụng riêng biệt, xây dựng các biểu thức SQL tùy ý, áp dụng các hàm tùy ý trong truy vấn, tạo quy trình không liên quan đến việc thực hiện các chức năng cơ sở dữ liệu lịch sử. Do đó, rất khó để so sánh KDB+ với các cơ sở dữ liệu khác; chúng có thể tốt hơn trong một số trường hợp sử dụng nhất định hoặc đơn giản là tốt hơn khi nói đến các tác vụ cơ sở dữ liệu cổ điển, nhưng tôi không biết có một công cụ linh hoạt và hiệu quả tương đương nào để xử lý dữ liệu tạm thời.
 

Tích hợp Python

Để giúp KDB+ dễ sử dụng hơn đối với những người chưa quen với công nghệ này, KX đã tạo các thư viện để tích hợp chặt chẽ với Python trong một quy trình duy nhất. Bạn có thể gọi bất kỳ hàm Python nào từ Q hoặc ngược lại - gọi bất kỳ hàm Q nào từ Python (cụ thể là các biểu thức QSQL). Thư viện chuyển đổi, nếu cần thiết (không phải lúc nào cũng vì mục đích hiệu quả), dữ liệu từ định dạng của ngôn ngữ này sang định dạng của ngôn ngữ khác. Kết quả là Q và Python sống cộng sinh chặt chẽ đến mức ranh giới giữa chúng bị xóa nhòa. Kết quả là, một mặt, lập trình viên có toàn quyền truy cập vào nhiều thư viện Python hữu ích, mặt khác, anh ta nhận được nền tảng nhanh chóng để làm việc với dữ liệu lớn được tích hợp vào Python, điều này đặc biệt hữu ích cho những người tham gia vào lĩnh vực học máy hoặc làm người mẫu.
 
Làm việc với Q trong Python:

1. >>> q()  
2.q)trade:([]date:();sym:();qty:())  
3. q)  
4. >>> q.insert('trade', (date(2006,10,6), 'IBM', 200))  
5. k(',0')  
6. >>> q.insert('trade', (date(2006,10,6), 'MSFT', 100))  
7. k(',1')  

tài liệu tham khảo

Trang web của công ty - https://kx.com/
Trang web dành cho nhà phát triển - https://code.kx.com/v2/
Quyển Q For Mortals (bằng tiếng Anh) - https://code.kx.com/q4m3/
Các bài viết về ứng dụng KDB+/Q của nhân viên kx - https://code.kx.com/v2/wp/

Nguồn: www.habr.com

Thêm một lời nhận xét