KDB+ ผลิตภัณฑ์ของบริษัท เป็นที่รู้จักกันอย่างแพร่หลายในแวดวงแคบ รวดเร็วมาก ฐานข้อมูลแบบเรียงเป็นแนว ออกแบบมาเพื่อจัดเก็บอนุกรมเวลาและการคำนวณเชิงวิเคราะห์ตามข้อมูลเหล่านั้น เริ่มแรก (และ) ได้รับความนิยมอย่างมากในอุตสาหกรรมการเงิน - ถูกใช้โดยธนาคารเพื่อการลงทุนชั้นนำ 10 แห่ง และกองทุนป้องกันความเสี่ยง ตลาดแลกเปลี่ยน และองค์กรอื่น ๆ ที่มีชื่อเสียงหลายแห่ง เมื่อเร็วๆ นี้ KX ตัดสินใจขยายฐานลูกค้า และตอนนี้นำเสนอโซลูชันในด้านอื่นๆ ที่มีข้อมูลจำนวนมาก จัดเรียงตามเวลาหรืออย่างอื่น เช่น โทรคมนาคม ชีวสารสนเทศศาสตร์ การผลิต ฯลฯ พวกเขายังกลายเป็นหุ้นส่วนของทีม Aston Martin Red Bull Racing ใน Formula 1 ซึ่งพวกเขาช่วยรวบรวมและประมวลผลข้อมูลจากเซ็นเซอร์ในรถยนต์และวิเคราะห์การทดสอบในอุโมงค์ลม ในบทความนี้ ฉันอยากจะบอกคุณว่าฟีเจอร์ใดของ KDB+ ที่ทำให้ KDB+ มีประสิทธิภาพดีเยี่ยม เหตุใดบริษัทต่างๆ จึงยอมทุ่มเงินจำนวนมากกับ KDB+ และสุดท้าย เหตุใดจึงไม่ใช่ฐานข้อมูลจริงๆ

ในบทความนี้ ฉันจะพยายามบอกคุณโดยทั่วไปว่า KDB+ คืออะไร มีความสามารถและข้อจำกัดอะไรบ้าง และประโยชน์ของ KDB+ สำหรับบริษัทที่ต้องการประมวลผลข้อมูลจำนวนมาก ฉันจะไม่ลงรายละเอียดการใช้งาน KDB+ หรือรายละเอียดของภาษาการเขียนโปรแกรม Q ทั้งสองหัวข้อนี้กว้างมากและสมควรได้รับบทความแยกกัน ข้อมูลมากมายเกี่ยวกับหัวข้อเหล่านี้สามารถพบได้ที่ code.kx.com รวมถึงหนังสือเกี่ยวกับ Q - Q For Mortals (ดูลิงก์ด้านล่าง)
เงื่อนไขบางประการ
- ฐานข้อมูลในหน่วยความจำ ฐานข้อมูลที่เก็บข้อมูลไว้ใน RAM เพื่อการเข้าถึงที่รวดเร็วยิ่งขึ้น ข้อดีของฐานข้อมูลดังกล่าวมีความชัดเจน แต่ข้อเสียคือความเป็นไปได้ที่ข้อมูลจะสูญหายและจำเป็นต้องมีหน่วยความจำจำนวนมากบนเซิร์ฟเวอร์
- ฐานข้อมูลเรียงเป็นแนว ฐานข้อมูลที่จัดเก็บข้อมูลแบบคอลัมน์ต่อคอลัมน์ แทนที่จะบันทึกตามบันทึก ข้อได้เปรียบหลักของฐานข้อมูลดังกล่าวคือข้อมูลจากคอลัมน์หนึ่งจะถูกเก็บไว้ด้วยกันบนดิสก์และในหน่วยความจำซึ่งช่วยเพิ่มความเร็วในการเข้าถึงได้อย่างมาก ไม่จำเป็นต้องโหลดคอลัมน์ที่ไม่ได้ใช้ในการสืบค้น ข้อเสียเปรียบหลักคือ การแก้ไขและลบบันทึกทำได้ยาก
- อนุกรมเวลา ข้อมูลที่มีคอลัมน์วันที่หรือเวลา โดยทั่วไป การจัดลำดับเวลามีความสำคัญสำหรับข้อมูลดังกล่าว เพื่อให้คุณสามารถระบุได้อย่างง่ายดายว่าระเบียนใดอยู่ข้างหน้าหรือตามหลังระเบียนปัจจุบัน หรือใช้ฟังก์ชันที่ผลลัพธ์ขึ้นอยู่กับลำดับของระเบียน ฐานข้อมูลแบบคลาสสิกถูกสร้างขึ้นบนหลักการที่แตกต่างไปจากเดิมอย่างสิ้นเชิง - เป็นตัวแทนของคอลเลกชันของระเบียนเป็นชุด โดยที่ตามหลักการไม่ได้กำหนดลำดับของระเบียน
- เวกเตอร์ ในบริบทของ KDB+ นี่คือรายการองค์ประกอบที่มีประเภทอะตอมมิกเดียวกัน เช่น ตัวเลข กล่าวอีกนัยหนึ่งคืออาร์เรย์ขององค์ประกอบ อาร์เรย์ต่างจากรายการตรงที่สามารถจัดเก็บแบบกะทัดรัดและประมวลผลโดยใช้คำสั่งตัวประมวลผลเวกเตอร์
ข้อมูลทางประวัติศาสตร์
KX ก่อตั้งขึ้นในปี 1993 โดย Arthur Whitney ซึ่งก่อนหน้านี้เคยทำงานที่ Morgan Stanley Bank ในภาษา A+ ซึ่งเป็นผู้สืบทอดของ APL ซึ่งเป็นภาษาดั้งเดิมและครั้งหนึ่งเคยเป็นที่นิยมในโลกการเงิน แน่นอนว่าใน KX อาเธอร์ยังคงดำเนินต่อไปด้วยจิตวิญญาณเดียวกันและสร้างภาษาเวกเตอร์ที่ใช้งานได้ K ซึ่งได้รับคำแนะนำจากแนวคิดเรื่องความเรียบง่ายสุดขั้ว โปรแกรม K ดูเหมือนการผสมเครื่องหมายวรรคตอนและอักขระพิเศษเข้าด้วยกัน ความหมายของเครื่องหมายและฟังก์ชันขึ้นอยู่กับบริบท และการดำเนินการแต่ละรายการจะมีความหมายมากกว่าในภาษาโปรแกรมทั่วไปมาก ด้วยเหตุนี้ โปรแกรม K จึงใช้พื้นที่น้อยที่สุด เพียงไม่กี่บรรทัดสามารถแทนที่หน้าข้อความในภาษาที่ละเอียด เช่น Java และเป็นการนำอัลกอริธึมไปใช้ที่มีความเข้มข้นสูง
ฟังก์ชันใน K ที่ใช้ตัวสร้างพาร์เซอร์ LL1 ส่วนใหญ่ตามไวยากรณ์ที่กำหนด:
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),"]";""]]}
อาเธอร์รวบรวมปรัชญาของประสิทธิภาพขั้นสูงสุดนี้ด้วยการเคลื่อนไหวร่างกายขั้นต่ำใน KDB+ ซึ่งปรากฏในปี 2003 (ฉันคิดว่าตอนนี้ชัดเจนว่าตัวอักษร K ในชื่อมาจากไหน) และไม่มีอะไรมากไปกว่าล่ามของ K เวอร์ชันที่สี่ มีการเพิ่มเวอร์ชันที่เป็นมิตรต่อผู้ใช้มากขึ้นที่ด้านบนของ KK ที่เรียกว่า Q นอกจากนี้ Q ยังเพิ่มการรองรับภาษาถิ่นเฉพาะของ SQL - QSQL และล่าม - รองรับตารางเป็นประเภทข้อมูลระบบเครื่องมือสำหรับการทำงานกับตาราง ในหน่วยความจำและบนดิสก์ ฯลฯ
จากมุมมองของผู้ใช้ KDB+ เป็นเพียงล่ามภาษา Q ที่รองรับตารางและนิพจน์สไตล์ LINQ ที่คล้ายกับ SQL จาก C# นี่คือข้อแตกต่างที่สำคัญที่สุดระหว่าง KDB+ และฐานข้อมูลอื่นๆ และความได้เปรียบทางการแข่งขันหลักซึ่งมักถูกมองข้าม นี่ไม่ใช่ฐานข้อมูล + ภาษาเสริมที่ปิดใช้งาน แต่เป็นภาษาการเขียนโปรแกรมที่ทรงพลังเต็มรูปแบบ + การสนับสนุนฟังก์ชันฐานข้อมูลในตัว ความแตกต่างนี้จะมีบทบาทชี้ขาดในการแสดงรายการคุณประโยชน์ทั้งหมดของ KDB+ ตัวอย่างเช่น…
ขนาด
ตามมาตรฐานสมัยใหม่ KDB+ มีขนาดเล็กมาก แท้จริงแล้วเป็นไฟล์ปฏิบัติการขนาดย่อยหนึ่งเมกะไบต์และไฟล์ข้อความขนาดเล็กหนึ่งไฟล์ที่มีฟังก์ชันระบบบางอย่าง ในความเป็นจริง - น้อยกว่าหนึ่งเมกะไบต์และสำหรับโปรแกรมนี้ บริษัท ต่าง ๆ จ่ายเงินนับหมื่นดอลลาร์ต่อปีสำหรับโปรเซสเซอร์หนึ่งตัวบนเซิร์ฟเวอร์
- ขนาดนี้ช่วยให้ KDB+ รู้สึกดีเยี่ยมกับฮาร์ดแวร์ทุกชนิด ตั้งแต่ไมโครคอมพิวเตอร์ Pi ไปจนถึงเซิร์ฟเวอร์ที่มีหน่วยความจำเทราไบต์ สิ่งนี้ไม่ส่งผลกระทบต่อฟังก์ชันการทำงาน แต่อย่างใด ยิ่งไปกว่านั้น Q จะเริ่มทำงานทันทีซึ่งทำให้สามารถใช้เป็นภาษาสคริปต์ได้
- ด้วยขนาดนี้ ตัวแปล Q จะพอดีกับแคชของโปรเซสเซอร์ทั้งหมด ซึ่งจะช่วยเร่งการทำงานของโปรแกรมให้เร็วขึ้น
- ด้วยขนาดของไฟล์ปฏิบัติการนี้ กระบวนการ Q จะใช้พื้นที่ในหน่วยความจำเพียงเล็กน้อย คุณสามารถเรียกใช้งานได้หลายร้อยไฟล์ ยิ่งไปกว่านั้น หากจำเป็น Q สามารถทำงานกับหน่วยความจำหลายสิบหรือหลายร้อยกิกะไบต์ภายในกระบวนการเดียว
ความเก่งกาจ
Q เหมาะสำหรับการใช้งานที่หลากหลาย กระบวนการ Q สามารถทำหน้าที่เป็นฐานข้อมูลเชิงประวัติและให้การเข้าถึงข้อมูลเทราไบต์ได้อย่างรวดเร็ว ตัวอย่างเช่น เรามีฐานข้อมูลในอดีตหลายสิบฐานข้อมูล ซึ่งบางฐานข้อมูลที่ไม่มีการบีบอัดหนึ่งวันก็กินพื้นที่มากกว่า 100 กิกะไบต์ อย่างไรก็ตาม ภายใต้ข้อจำกัดที่สมเหตุสมผล การสืบค้นไปยังฐานข้อมูลจะเสร็จสิ้นภายในสิบถึงหลายร้อยมิลลิวินาที โดยทั่วไป เรามีการหมดเวลาสากลสำหรับคำขอของผู้ใช้ - 30 วินาที - และใช้งานได้น้อยมาก
Q อาจเป็นฐานข้อมูลในหน่วยความจำได้อย่างง่ายดายเช่นกัน ข้อมูลใหม่จะถูกเพิ่มลงในตารางในหน่วยความจำอย่างรวดเร็วจนคำขอของผู้ใช้เป็นปัจจัยจำกัด ข้อมูลในตารางจะถูกจัดเก็บไว้ในคอลัมน์ ซึ่งหมายความว่าการดำเนินการใดๆ ในคอลัมน์จะใช้แคชของตัวประมวลผลอย่างเต็มประสิทธิภาพ นอกจากนี้ KX ยังพยายามใช้การดำเนินการพื้นฐานทั้งหมด เช่น เลขคณิต ผ่านคำสั่งเวกเตอร์ของโปรเซสเซอร์ เพื่อเพิ่มความเร็วสูงสุด Q ยังสามารถทำงานที่ไม่ปกติสำหรับฐานข้อมูล เช่น ประมวลผลข้อมูลสตรีมมิ่งและคำนวณใน “เรียลไทม์” (โดยมีความล่าช้าจากสิบมิลลิวินาทีถึงหลายวินาที ขึ้นอยู่กับงาน) ฟังก์ชันการรวมต่างๆ สำหรับเครื่องมือทางการเงินในช่วงเวลาที่แตกต่างกัน ช่วงเวลาหรือสร้างแบบจำลองของอิทธิพลของธุรกรรมที่สมบูรณ์แบบสู่ตลาด และดำเนินการสร้างโปรไฟล์เกือบจะในทันทีหลังจากเสร็จสิ้น ในงานดังกล่าว ส่วนใหญ่แล้วการหน่วงเวลาหลักไม่ใช่ Q แต่เป็นความจำเป็นในการซิงโครไนซ์ข้อมูลจากแหล่งต่างๆ ความเร็วสูงเกิดขึ้นได้เนื่องจากข้อมูลและฟังก์ชันที่ประมวลผลอยู่ในกระบวนการเดียว และการประมวลผลลดลงเหลือเพียงการดำเนินการนิพจน์ QSQL และการรวมหลายรายการ ซึ่งไม่ได้รับการตีความ แต่ดำเนินการด้วยรหัสไบนารี่
สุดท้ายนี้ คุณสามารถเขียนกระบวนการบริการใดๆ ลงใน Q ได้ ตัวอย่างเช่น กระบวนการเกตเวย์ที่กระจายคำขอของผู้ใช้ไปยังฐานข้อมูลและเซิร์ฟเวอร์ที่จำเป็นโดยอัตโนมัติ โปรแกรมเมอร์มีอิสระเต็มที่ในการใช้อัลกอริธึมใดๆ เพื่อปรับสมดุล การจัดลำดับความสำคัญ การทนต่อข้อผิดพลาด สิทธิ์ในการเข้าถึง โควต้า และโดยพื้นฐานแล้วสิ่งอื่นๆ ที่เขาปรารถนา ปัญหาหลักที่นี่คือคุณจะต้องดำเนินการทั้งหมดนี้ด้วยตัวเอง
ตามตัวอย่าง ฉันจะแสดงรายการประเภทของกระบวนการที่เรามี ทั้งหมดนี้ใช้งานและทำงานร่วมกันอย่างจริงจัง โดยรวมฐานข้อมูลหลายสิบแห่งไว้ในที่เดียว ประมวลผลข้อมูลจากหลายแหล่ง และให้บริการผู้ใช้และแอปพลิเคชันหลายร้อยราย
- ตัวเชื่อมต่อ (ตัวป้อน) กับแหล่งข้อมูล โดยทั่วไปกระบวนการเหล่านี้จะใช้ไลบรารีภายนอกที่โหลดลงใน Q อินเทอร์เฟซ C ใน Q นั้นง่ายมาก และช่วยให้คุณสร้างฟังก์ชันพร็อกซีสำหรับไลบรารี C/C++ ใดๆ ได้อย่างง่ายดาย Q เร็วพอที่จะจัดการ เช่น ประมวลผลข้อความ FIX จำนวนมากจากตลาดหุ้นยุโรปทั้งหมดพร้อมกัน
- ผู้จัดจำหน่ายข้อมูล (tickerplant) ซึ่งทำหน้าที่เป็นตัวเชื่อมระดับกลางระหว่างตัวเชื่อมต่อและผู้บริโภค ในเวลาเดียวกัน พวกเขาเขียนข้อมูลขาเข้าลงในบันทึกไบนารีพิเศษ เพื่อให้ผู้บริโภคมีความแข็งแกร่งต่อการสูญเสียการเชื่อมต่อหรือการรีสตาร์ท
- ฐานข้อมูลในหน่วยความจำ (rdb) ฐานข้อมูลเหล่านี้ช่วยให้เข้าถึงข้อมูลดิบและสดใหม่ได้เร็วที่สุดเท่าที่จะเป็นไปได้โดยจัดเก็บไว้ในหน่วยความจำ โดยทั่วไปแล้วจะรวบรวมข้อมูลในตารางในระหว่างวันและรีเซ็ตในเวลากลางคืน
- ฐานข้อมูลถาวร (pdb) ฐานข้อมูลเหล่านี้ช่วยให้แน่ใจว่าข้อมูลสำหรับวันนี้ถูกจัดเก็บไว้ในฐานข้อมูลเชิงประวัติ ตามกฎแล้วไม่เหมือนกับ rdb ตรงที่จะไม่เก็บข้อมูลไว้ในหน่วยความจำ แต่ใช้แคชพิเศษบนดิสก์ในระหว่างวันและคัดลอกข้อมูลในเวลาเที่ยงคืนไปยังฐานข้อมูลประวัติ
- ฐานข้อมูลเชิงประวัติ (hdb) ฐานข้อมูลเหล่านี้ให้การเข้าถึงข้อมูลของวัน เดือน และปีก่อนหน้า ขนาด (เป็นวัน) ถูกจำกัดด้วยขนาดของฮาร์ดไดรฟ์เท่านั้น ข้อมูลสามารถอยู่ที่ใดก็ได้ โดยเฉพาะบนดิสก์ที่แตกต่างกันเพื่อเพิ่มความเร็วในการเข้าถึง สามารถบีบอัดข้อมูลโดยใช้อัลกอริธึมหลายแบบให้เลือก โครงสร้างของฐานข้อมูลมีการจัดทำเป็นเอกสารไว้อย่างดีและเรียบง่าย ข้อมูลจะถูกจัดเก็บทีละคอลัมน์ในไฟล์ปกติ จึงสามารถประมวลผลได้ รวมถึงผ่านทางระบบปฏิบัติการด้วย
- ฐานข้อมูลที่มีข้อมูลรวม โดยจะจัดเก็บการรวมกลุ่มต่างๆ ซึ่งโดยปกติจะจัดกลุ่มตามชื่อเครื่องมือและช่วงเวลา ฐานข้อมูลในหน่วยความจำจะอัพเดตสถานะด้วยข้อความขาเข้าแต่ละข้อความ และฐานข้อมูลประวัติจะจัดเก็บข้อมูลที่คำนวณไว้ล่วงหน้าเพื่อเพิ่มความเร็วในการเข้าถึงข้อมูลประวัติ
- ในที่สุด กระบวนการเกตเวย์การให้บริการแอปพลิเคชันและผู้ใช้ Q ช่วยให้คุณสามารถใช้การประมวลผลข้อความขาเข้าแบบอะซิงโครนัสอย่างสมบูรณ์ กระจายข้อความข้ามฐานข้อมูล ตรวจสอบสิทธิ์การเข้าถึง ฯลฯ โปรดทราบว่าข้อความไม่จำกัดและส่วนใหญ่มักจะไม่ใช่นิพจน์ SQL เช่นเดียวกับในฐานข้อมูลอื่นๆ บ่อยครั้งที่นิพจน์ SQL ถูกซ่อนอยู่ในฟังก์ชันพิเศษและสร้างขึ้นตามพารามิเตอร์ที่ผู้ใช้ร้องขอ - เวลาถูกแปลง, กรอง, ข้อมูลถูกทำให้เป็นมาตรฐาน (เช่นราคาหุ้นจะถูกทำให้เท่ากันหากจ่ายเงินปันผล) เป็นต้น
สถาปัตยกรรมทั่วไปสำหรับประเภทข้อมูลเดียว:

ความเร็ว
แม้ว่า Q จะเป็นภาษาที่ตีความ แต่ก็เป็นภาษาเวกเตอร์ด้วย ซึ่งหมายความว่าฟังก์ชันบิวท์อินจำนวนมาก โดยเฉพาะฟังก์ชันทางคณิตศาสตร์ รับอาร์กิวเมนต์ในรูปแบบใดๆ เช่น ตัวเลข เวกเตอร์ เมทริกซ์ รายการ และโปรแกรมเมอร์คาดว่าจะนำโปรแกรมไปใช้ในลักษณะการดำเนินการของอาร์เรย์ ในภาษาดังกล่าว หากคุณเพิ่มเวกเตอร์สองตัวจากหนึ่งล้านองค์ประกอบ การตีความภาษานั้นไม่สำคัญอีกต่อไป การบวกจะดำเนินการโดยฟังก์ชันไบนารี่ที่ปรับให้เหมาะสมที่สุด เนื่องจากส่วนแบ่งเวลาส่วนใหญ่ในโปรแกรม Q นั้นถูกใช้ไปกับการดำเนินการกับตารางที่ใช้ฟังก์ชัน vectorized พื้นฐานเหล่านี้ ผลลัพธ์จึงมีความเร็วการทำงานที่เหมาะสมมาก ทำให้เราสามารถประมวลผลข้อมูลจำนวนมหาศาลได้แม้ในกระบวนการเดียว สิ่งนี้คล้ายกับไลบรารีทางคณิตศาสตร์ใน Python แม้ว่า Python เองจะเป็นภาษาที่ช้ามาก แต่ก็มีไลบรารีที่ยอดเยี่ยมมากมายเช่น numpy ที่ให้คุณประมวลผลข้อมูลตัวเลขด้วยความเร็วของภาษาที่คอมไพล์ (อย่างไรก็ตาม numpy นั้นใกล้เคียงกับ Q ในเชิงอุดมคติ ).
นอกจากนี้ KX ยังใช้แนวทางอย่างระมัดระวังในการออกแบบตารางและเพิ่มประสิทธิภาพการทำงานด้วย ประการแรก รองรับดัชนีหลายประเภท ซึ่งได้รับการสนับสนุนโดยฟังก์ชันในตัว และสามารถใช้ได้ไม่เพียงแต่กับคอลัมน์ของตารางเท่านั้น แต่ยังรวมถึงเวกเตอร์ใดๆ ด้วย เช่น การจัดกลุ่ม การเรียงลำดับ คุณลักษณะเฉพาะ และการจัดกลุ่มพิเศษสำหรับฐานข้อมูลเชิงประวัติ มีการใช้ดัชนีอย่างง่ายดายและจะปรับโดยอัตโนมัติเมื่อเพิ่มองค์ประกอบลงในคอลัมน์/เวกเตอร์ สามารถใช้ดัชนีกับคอลัมน์ตารางได้อย่างเท่าเทียมกันทั้งในหน่วยความจำและบนดิสก์ เมื่อดำเนินการค้นหา QSQL ดัชนีจะถูกใช้โดยอัตโนมัติหากเป็นไปได้ ประการที่สอง การทำงานกับข้อมูลประวัติจะดำเนินการผ่านกลไกในการแสดงไฟล์ OS (แผนที่หน่วยความจำ) ตารางขนาดใหญ่จะไม่ถูกโหลดลงในหน่วยความจำ แต่คอลัมน์ที่จำเป็นจะถูกแมปลงในหน่วยความจำโดยตรงและมีเพียงบางส่วนเท่านั้นที่ถูกโหลดจริง (ดัชนียังช่วยได้ที่นี่) ที่จำเป็น โปรแกรมเมอร์ไม่ได้สร้างความแตกต่างไม่ว่าข้อมูลจะอยู่ในหน่วยความจำหรือไม่ก็ตาม กลไกในการทำงานกับ mmap นั้นถูกซ่อนไว้อย่างสมบูรณ์ในส่วนลึกของ Q
KDB+ ไม่ใช่ฐานข้อมูลเชิงสัมพันธ์ ตารางสามารถมีข้อมูลที่กำหนดเองได้ ในขณะที่ลำดับของแถวในตารางจะไม่เปลี่ยนแปลงเมื่อมีการเพิ่มองค์ประกอบใหม่ และสามารถใช้ได้และควรใช้เมื่อเขียนแบบสอบถาม คุณลักษณะนี้จำเป็นเร่งด่วนสำหรับการทำงานกับอนุกรมเวลา (ข้อมูลจากการแลกเปลี่ยน การวัดระยะไกล บันทึกเหตุการณ์) เพราะหากข้อมูลถูกจัดเรียงตามเวลา ผู้ใช้ไม่จำเป็นต้องใช้เทคนิค SQL ใด ๆ เพื่อค้นหาแถวแรกหรือแถวสุดท้ายหรือ N แถวในตาราง กำหนดว่าบรรทัดใดต่อจากบรรทัดที่ N เป็นต้น การรวมตารางยังทำให้ง่ายขึ้นไปอีก ตัวอย่างเช่น การค้นหาใบเสนอราคาสุดท้ายสำหรับธุรกรรม 16000 VOD.L (Vodafone) ในตารางที่มีองค์ประกอบ 500 ล้านองค์ประกอบจะใช้เวลาประมาณหนึ่งวินาทีบนดิสก์และสิบมิลลิวินาทีในหน่วยความจำ
ตัวอย่างของการรวมเวลา - ตารางใบเสนอราคาถูกแมปกับหน่วยความจำ ดังนั้นจึงไม่จำเป็นต้องระบุ VOD.L โดยที่ดัชนีในคอลัมน์ sym และข้อเท็จจริงที่ว่าข้อมูลถูกจัดเรียงตามเวลาถูกใช้โดยปริยาย การรวมเกือบทั้งหมดใน Q เป็นฟังก์ชันปกติ ไม่ใช่ส่วนหนึ่งของนิพจน์ที่เลือก:
1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]
สุดท้ายนี้ เป็นที่น่าสังเกตว่าวิศวกรของ KX ซึ่งเริ่มต้นจาก Arthur Whitney เองนั้น หลงใหลในประสิทธิภาพอย่างแท้จริง และพยายามอย่างเต็มที่เพื่อให้ได้ประโยชน์สูงสุดจากคุณสมบัติมาตรฐานของ Q และปรับรูปแบบการใช้งานที่พบบ่อยที่สุดให้เหมาะสม
ทั้งหมด
KDB+ ได้รับความนิยมในหมู่ธุรกิจโดยหลักแล้วเนื่องมาจากความสามารถรอบด้านที่โดดเด่น โดยทำหน้าที่เป็นฐานข้อมูลในหน่วยความจำได้ดีพอๆ กัน เป็นฐานข้อมูลสำหรับจัดเก็บข้อมูลประวัติขนาดเทราไบต์ และเป็นแพลตฟอร์มสำหรับการวิเคราะห์ข้อมูล เนื่องจากการประมวลผลข้อมูลเกิดขึ้นโดยตรงในฐานข้อมูล ทำให้สามารถทำงานและประหยัดทรัพยากรได้อย่างรวดเร็ว ภาษาการเขียนโปรแกรมเต็มรูปแบบที่รวมเข้ากับฟังก์ชันฐานข้อมูลช่วยให้คุณสามารถใช้กระบวนการที่จำเป็นทั้งหมดบนแพลตฟอร์มเดียวตั้งแต่การรับข้อมูลไปจนถึงการประมวลผลคำขอของผู้ใช้
สำหรับข้อมูลเพิ่มเติม
ข้อ จำกัด
ข้อเสียเปรียบที่สำคัญของ KDB+/Q คือเกณฑ์การเข้าที่สูง ภาษามีไวยากรณ์ที่แปลก บางฟังก์ชันมีการใช้งานมากเกินไป (เช่น ค่ามีกรณีการใช้งานประมาณ 11 กรณี) สิ่งสำคัญที่สุดคือต้องใช้แนวทางการเขียนโปรแกรมที่แตกต่างอย่างสิ้นเชิง ในภาษาเวกเตอร์ คุณต้องคิดในแง่ของการแปลงอาเรย์เสมอ ใช้การวนซ้ำทั้งหมดผ่านตัวแปรต่างๆ ของแผนที่/ฟังก์ชันลด (ซึ่งเรียกว่าคำวิเศษณ์ใน Q) และอย่าพยายามประหยัดเงินด้วยการแทนที่การดำเนินการเวกเตอร์ด้วยการดำเนินการแบบอะตอมมิก ตัวอย่างเช่น หากต้องการค้นหาดัชนีขององค์ประกอบลำดับที่ N ในอาร์เรย์ คุณควรเขียน:
1. (where element=vector)[N]
แม้ว่าสิ่งนี้ดูเหมือนจะไม่มีประสิทธิภาพอย่างมากตามมาตรฐาน C/Java (= สร้างเวกเตอร์บูลีน โดยที่ส่งคืนดัชนีที่แท้จริงขององค์ประกอบในนั้น) แต่สัญลักษณ์นี้ทำให้ความหมายของนิพจน์ชัดเจนยิ่งขึ้น และคุณใช้การดำเนินการเวกเตอร์ที่รวดเร็ว แทนที่จะเป็นการดำเนินการแบบอะตอมที่ช้า ความแตกต่างทางแนวคิดระหว่างภาษาเวกเตอร์กับภาษาอื่นๆ นั้นเทียบได้กับความแตกต่างระหว่างแนวทางที่จำเป็นและเชิงฟังก์ชันในการเขียนโปรแกรม และคุณต้องเตรียมพร้อมสำหรับสิ่งนี้
ผู้ใช้บางรายไม่พอใจกับ QSQL เช่นกัน ประเด็นก็คือมันดูเหมือน SQL จริงเท่านั้น ในความเป็นจริง มันเป็นเพียงล่ามของนิพจน์ที่คล้ายกับ SQL ที่ไม่สนับสนุนการปรับให้เหมาะสมของแบบสอบถาม ผู้ใช้จะต้องเขียนคำสั่งที่เหมาะสมที่สุดด้วยตัวเองและใน Q ซึ่งหลายคนยังไม่พร้อม ในทางกลับกัน คุณสามารถเขียนแบบสอบถามที่เหมาะสมที่สุดได้ด้วยตนเอง แทนที่จะอาศัยเครื่องมือเพิ่มประสิทธิภาพกล่องดำ
นอกจากนี้ ยังมีหนังสือเกี่ยวกับ Q - Q For Mortals ให้บริการฟรีที่ นอกจากนี้ยังมีวัสดุที่มีประโยชน์อื่น ๆ อีกมากมายที่รวบรวมไว้ที่นั่น
ข้อเสียใหญ่อีกประการหนึ่งคือต้นทุนของใบอนุญาต นั่นคือหมื่นดอลลาร์ต่อปีต่อ CPU มีเพียงบริษัทขนาดใหญ่เท่านั้นที่สามารถจ่ายค่าใช้จ่ายดังกล่าวได้ เมื่อเร็วๆ นี้ KX ได้ทำให้นโยบายการออกใบอนุญาตมีความยืดหยุ่นมากขึ้น และให้โอกาสในการชำระเฉพาะเวลาใช้งานหรือเช่า KDB+ ในระบบคลาวด์ของ Google และ Amazon KX ยังเสนอให้ดาวน์โหลดอีกด้วย (เวอร์ชัน 32 บิตหรือ 64 บิตตามคำขอ)
สินค้า
มีฐานข้อมูลพิเศษจำนวนไม่น้อยที่สร้างขึ้นบนหลักการที่คล้ายกัน - แบบเรียงเป็นแนวในหน่วยความจำซึ่งเน้นที่ข้อมูลจำนวนมาก ปัญหาคือฐานข้อมูลเหล่านี้เป็นฐานข้อมูลเฉพาะ ตัวอย่างที่ชัดเจนคือ Clickhouse ฐานข้อมูลนี้มีหลักการที่คล้ายกันมากกับ KDB+ สำหรับการจัดเก็บข้อมูลบนดิสก์และสร้างดัชนี โดยจะดำเนินการบางอย่างได้เร็วกว่า KDB+ แม้ว่าจะไม่สำคัญก็ตาม แต่ถึงแม้จะเป็นฐานข้อมูล Clickhouse ก็มีความเชี่ยวชาญมากกว่า KDB+ - การวิเคราะห์เว็บเทียบกับอนุกรมเวลาตามอำเภอใจ (ความแตกต่างนี้สำคัญมาก - ด้วยเหตุนี้ เช่น ใน Clickhouse จึงไม่สามารถใช้การเรียงลำดับบันทึกได้) แต่ที่สำคัญที่สุด Clickhouse ไม่มีความสามารถรอบด้านของ KDB+ ซึ่งเป็นภาษาที่อนุญาตให้ประมวลผลข้อมูลโดยตรงในฐานข้อมูล แทนที่จะโหลดข้อมูลลงในแอปพลิเคชันแยกต่างหากก่อน สร้างนิพจน์ SQL ตามอำเภอใจ การใช้ฟังก์ชันที่กำหนดเองในแบบสอบถาม สร้างกระบวนการ ไม่เกี่ยวข้องกับการดำเนินการของฟังก์ชันฐานข้อมูลประวัติ ดังนั้นจึงเป็นเรื่องยากที่จะเปรียบเทียบ KDB+ กับฐานข้อมูลอื่น อาจดีกว่าในบางกรณีหรือดีกว่าเมื่อพูดถึงงานฐานข้อมูลแบบคลาสสิก แต่ฉันไม่รู้จักเครื่องมืออื่นที่มีประสิทธิภาพและอเนกประสงค์เท่ากันสำหรับการประมวลผลข้อมูลชั่วคราว
บูรณาการหลาม
เพื่อให้ KDB+ ใช้งานได้ง่ายขึ้นสำหรับผู้ที่ไม่คุ้นเคยกับเทคโนโลยีนี้ KX ได้สร้างไลบรารีเพื่อผสานรวมกับ Python อย่างแน่นหนาภายในกระบวนการเดียว คุณสามารถเรียกใช้ฟังก์ชัน Python ใดก็ได้จาก Q หรือในทางกลับกัน - เรียกใช้ฟังก์ชัน Q ใดก็ได้จาก Python (โดยเฉพาะนิพจน์ QSQL) ไลบรารีจะแปลงข้อมูลจากรูปแบบของภาษาหนึ่งไปเป็นรูปแบบของอีกภาษาหนึ่ง หากจำเป็น (ไม่ใช่เพื่อประสิทธิภาพเสมอไป) เป็นผลให้ Q และ Python อาศัยอยู่ในความสัมพันธ์ที่ใกล้ชิดจนขอบเขตระหว่างพวกเขาเบลอ เป็นผลให้โปรแกรมเมอร์สามารถเข้าถึงไลบรารี Python ที่มีประโยชน์มากมายได้อย่างเต็มที่ ในทางกลับกัน เขาได้รับฐานที่รวดเร็วสำหรับการทำงานกับข้อมูลขนาดใหญ่ที่รวมอยู่ใน Python ซึ่งมีประโยชน์อย่างยิ่งสำหรับผู้ที่เกี่ยวข้องกับการเรียนรู้ของเครื่อง หรือการสร้างแบบจำลอง
การทำงานกับ Q ใน 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')
การอ้างอิง
เว็บไซต์บริษัท -
เว็บไซต์สำหรับนักพัฒนา -
หนังสือ Q For Mortals (เป็นภาษาอังกฤษ) -
บทความเกี่ยวกับแอปพลิเคชัน KDB+/Q จากพนักงาน kx -
ที่มา: will.com
