Baza e të dhënave KDB+: nga financat deri në "Formulën 1"

KDB+, produkt i kompanisĂ« KX — Ă«shtĂ« njĂ« bazĂ« tĂ« dhĂ«nash kolonore, shumĂ« e njohur nĂ« rrethin e ngushtĂ«, dhe jashtĂ«zakonisht e shpejtĂ«, e dizajnuar pĂ«r ruajtjen e serive temporale dhe llogaritjeve analitike mbi to. Fillimisht, ajo ka pasur (dhe ka) njĂ« popullaritet tĂ« madh nĂ« industrinĂ« financiare — e pĂ«rdorin tĂ« gjitha 10 bankat mĂ« tĂ« mira tĂ« investimeve dhe shumĂ« fonde hedging tĂ« njohura, bursa dhe organizata tĂ« tjera. SĂ« fundmi, nĂ« KX kanĂ« vendosur tĂ« zgjasin bazĂ«n e klientĂ«ve dhe tani ofrojnĂ« zgjidhje edhe nĂ« sektorĂ« tĂ« tjerĂ«, ku ka njĂ« sasi tĂ« madhe tĂ« dhĂ«nash tĂ« sistemuara temporalisht apo ndryshe — telekomunikacion, bioinformatikĂ«, prodhim etj. Po ashtu, ata janĂ« partnerĂ« tĂ« ekipit Aston Martin Red Bull Racing nĂ« "Formula 1", ku ndihmojnĂ« nĂ« mbledhjen dhe pĂ«rpunimin e tĂ« dhĂ«nave nga sensorĂ«t e garave dhe nĂ« analizimin e testeve nĂ« tunelin e ajrit. NĂ« kĂ«tĂ« artikull, dua tĂ« flas pĂ«r cilĂ«sitĂ« qĂ« e bĂ«jnĂ« KDB+ jashtĂ«zakonisht efikase, pse kompanitĂ« janĂ« tĂ« gatshme tĂ« shpenzojnĂ« shumĂ« para pĂ«r tĂ«, dhe sĂ« fundi, pse nĂ« tĂ« vĂ«rtetĂ« kjo nuk Ă«shtĂ« njĂ« bazĂ« tĂ« dhĂ«nash.
 
Baza e të dhënave KDB+: nga financat deri në "Formulën 1"
 
NĂ« kĂ«tĂ« artikull, do tĂ« pĂ«rpiqem tĂ« pĂ«rshkruaj se çfarĂ« Ă«shtĂ« KDB+, cilat mundĂ«si dhe kufizime ka, dhe çfarĂ« dobie ka pĂ«r kompanitĂ« qĂ« dĂ«shirojnĂ« tĂ« procesojnĂ« sasi tĂ« mĂ«dha tĂ« dhĂ«nash. Nuk do tĂ« hyj nĂ« detajet e implementimit tĂ« KDB+ dhe nĂ« detajet e gjuhĂ«s sĂ« saj programore Q. TĂ« dy kĂ«to tema janĂ« shumĂ« tĂ« gjera dhe meritohen artikuj tĂ« veçantĂ«. Informacione tĂ« shumta pĂ«r kĂ«to tema mund tĂ« gjenden nĂ« faqen code.kx.com, pĂ«rfshirĂ« librin pĂ«r Q — Q For Mortals (shihni lidhjen mĂ« poshtĂ«).

Disa terma

  • Baza e tĂ« dhĂ«nave nĂ« memorie. NjĂ« bazĂ« tĂ« dhĂ«nash qĂ« ruan tĂ« dhĂ«nat nĂ« memorien operativ pĂ«r tĂ« pĂ«rshpejtuar aksesin. Avantazhet e kĂ«saj baze janĂ« tĂ« qarta, ndĂ«rsa mangĂ«sitĂ« janĂ« mundĂ«sia e humbjes sĂ« tĂ« dhĂ«nave, nevoja pĂ«r tĂ« pasur shumĂ« memorie nĂ« server.
  • Baza e tĂ« dhĂ«nave kolonore. NjĂ« bazĂ« tĂ« dhĂ«nash ku tĂ« dhĂ«nat ruhen kolonĂ« pĂ«r kolonĂ«, dhe jo rekord pĂ«r rekord. Avantazhi kryesor i kĂ«saj baze Ă«shtĂ« se tĂ« dhĂ«nat nga njĂ« kolonĂ« ruhen sĂ« bashku nĂ« disk dhe nĂ« memorie, çka e pĂ«rshpejton ndjeshĂ«m aksesin nĂ« to. Nuk ka nevojĂ« tĂ« ngarkohen kolonat qĂ« nuk pĂ«rdoren nĂ« kĂ«rkesĂ«. MangĂ«sia kryesore Ă«shtĂ« se Ă«shtĂ« e vĂ«shtirĂ« tĂ« modifikohen dhe tĂ« fshihen rekordet.
  • Seri temporale. TĂ« dhĂ«nat me kolonĂ«n e tipit datĂ« ose kohĂ«. Si zakonisht, pĂ«r kĂ«to tĂ« dhĂ«na rĂ«ndĂ«sia e renditjes sipas kohĂ«s Ă«shtĂ« e madhe, qĂ« mund tĂ« pĂ«rcaktohet lehtĂ«sisht se cila shĂ«nim e paraprin ose ndjek atĂ« aktualen, ose qĂ« tĂ« aplikohet funksione, rezultatet e tĂ« cilave varen nga rendi i shĂ«nimeve. Databazat klasike janĂ« ndĂ«rtuar mbi njĂ« parim krejt tjetĂ«r — paraqitjen e grupit tĂ« shĂ«nimeve si njĂ« shumĂ«, ku rendi i shĂ«nimeve nĂ« thelb nuk pĂ«rcaktohet.
  • Vektori. NĂ« kontekstin e KDB+ — kjo Ă«shtĂ« njĂ« listĂ« elementesh tĂ« njĂ« tipi atomar, pĂ«r shembull, numra. NĂ« other fjalĂ«, njĂ« masĂ« elementesh. Masat, ndryshe nga listat, mund tĂ« ruhen nĂ« mĂ«nyrĂ« kompakte dhe tĂ« pĂ«rpunohen duke pĂ«rdorur instruksione vektoriale tĂ« procesorit.

 

Kronologjia historike

Kompania KX u themelua nĂ« vitin 1993 nga Arthur Whitney, i cili pĂ«rpara kĂ«saj kishte punuar nĂ« bankĂ«n Morgan Stanley mbi gjuhĂ«n A+, pasardhĂ«s i APL — njĂ« gjuhĂ« shumĂ« origjinale dhe njĂ«herĂ«sh e njohur nĂ« botĂ«n financiare. Sigurisht, nĂ« KX, Arthur vazhdoi nĂ« tĂ« njĂ«jtin frymĂ« dhe krijoi gjuhĂ«n vektoriale-funksionale K, duke u udhĂ«hequr nga ideja e minimalizmit radikal. Programet nĂ« K duken si njĂ« grup i çrregullt simboleve tĂ« pikĂ«simit dhe simbolikave speciale, ku kuptimi i simboleve dhe funksioneve varet nga konteksti, dhe çdo operacion mban mĂ« shumĂ« kuptim se zakonisht ndodh nĂ« gjuhĂ«t e zakonshme tĂ« programimit. FalĂ« kĂ«saj, programi nĂ« K zĂ« minimum hapĂ«sire — disa rreshta mund tĂ« zĂ«vendĂ«sojnĂ« faqe teksti tĂ« njĂ« gjuhe tĂ« folur si Java — dhe Ă«shtĂ« njĂ« realizim jashtĂ«zakonisht tĂ« pĂ«rqendruar tĂ« algoritmit.
 
Një funksion në K, që realizon pjesën më të madhe të gjeneratorit LL1 parser sipas një gramatike të caktuar:

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),"]";""]]}  

 Kjo filozofi e efikasitetit ekstrem me sa mĂ« pak lĂ«vizje, Arthur e ka implementuar gjithashtu nĂ« KDB+, e cila u shfaq nĂ« vitin 2003 (mendoj se tani Ă«shtĂ« e qartĂ« nga vjen letra K nĂ« emĂ«r) dhe Ă«shtĂ« asgjĂ« tjetĂ«r veçse njĂ« interpretuese e versionit tĂ« katĂ«rt tĂ« gjuhĂ«s K. Mbi K Ă«shtĂ« shtuar njĂ« version mĂ« tĂ« kĂ«ndshĂ«m pĂ«r sy ndĂ«rsa quhet Q. NĂ« Q Ă«shtĂ« shtuar gjithashtu mbĂ«shtetje pĂ«r njĂ« dialekt specifik SQL — QSQL, dhe nĂ« interpretuese — mbĂ«shtetje pĂ«r tabela si lloj tĂ« dhĂ«nash sistemike, mjete pĂ«r punĂ« me tabela nĂ« memorie dhe nĂ« disk, etj.
 
Kështu, nga këndvështrimi i përdoruesit, KDB+ është thjesht një interpretuese e gjuhës Q me mbështetje për tabela dhe shprehje të ngjashme me SQL në stilin LINQ nga C#. Ky është dallimi kryesor midis KDB+ dhe bazave të tjera të të dhënave dhe avantazhi i saj kryesor konkurrues, i cili shpesh kalon pa u vënë re. Kjo nuk është një bazë të dhënash + një gjuhë ndihmëse e paaftë, por një gjuhë programimi e fuqishme + mbështetje e integruar për funksionet e bazës së të dhënave. Ky dallim do të luajë një rol përcaktues në renditjen e të gjitha avantazheve të KDB+.
 

Madhësia

Dhe sipas standardeve moderne, KDB+ ka njĂ« madhĂ«si thjesht mikroskopike. Kjo Ă«shtĂ« nĂ« kuptimin e vĂ«rtetĂ« njĂ« skedar i ekzekutueshĂ«m me njĂ« madhĂ«si mĂ« tĂ« vogĂ«l se njĂ« megabajt dhe njĂ« skedar tĂ« vogĂ«l teksti me disa funksione sistemike. NĂ« realitet — mĂ« pak se njĂ« megabajt dhe pĂ«r kĂ«tĂ« program kompanitĂ« paguajnĂ« dhjetĂ«ra mijĂ«ra dollarĂ« nĂ« vit pĂ«r njĂ« procesor nĂ« server.

  • Kjo madhĂ«si lejon qĂ« KDB+ tĂ« funksionojĂ« shkĂ«lqyeshĂ«m nĂ« çdo harduer — nga mikrocomputeri Pi deri te serverat me terabajtĂ« memorie. Kjo nuk ka asnjĂ« efekt mbi funksionalitetin, madje pĂ«r mĂ« tepĂ«r Q starton menjĂ«herĂ«, çka e bĂ«n tĂ« pĂ«rdorshĂ«m gjithashtu si njĂ« gjuhĂ« skriptuese.
  • Me njĂ« madhĂ«si tĂ« tillĂ«, interpretuese e Q plotĂ«sisht futet nĂ« cache tĂ« procesorit, gjĂ« qĂ« pĂ«rshpejton ekzekutimin e programeve.
  • Me njĂ« madhĂ«si tĂ« tillĂ« tĂ« skedarit ekzekutues, procesi Q zĂ« njĂ« hapĂ«sirĂ« tĂ« papĂ«rfillshme nĂ« memorie, mund tĂ« fillojnĂ« me qindra. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, nĂ«se nevojitet, Q mund tĂ« operojĂ« edhe me dhjetĂ«ra dhe qindra gigabajt memorie brenda njĂ« procesi.

Universialiteti

Q është ideale për një gamë të gjerë detyrash. Procesi Q mund të funksionojë si një bazë të dhënash historike dhe ofron qasje të shpejtë në terabajt informacione. Për shembull, ne kemi dhjetëra baza historike, në disa prej të cilave një ditë e dhënash të pakompresuara zë më shumë se 100 gigabajt. Megjithatë, me kufizime të arsyeshme, një kërkesë në bazë do të përfundojë për disa dhjetëra deri në qindra milisekonda. Në përgjithësi, për kërkesat e përdoruesve ne kemi një kohë e përgjithshme e cila është 30 sekonda dhe kjo ndodh shumë rrallë.
 
Me po aq lehtësi, Q mund të jetë një bazë të dhënash në memorie. Shtimi i të dhënave të reja në tabelat në memorie ndodh aq shpejt sa që faktori kufizues janë kërkesat e përdoruesve. Të dhënat në tabela ruhen sipas kolone, që do të thotë se çdo operacion në kolona do të përdorë kuletat e procesorit në kapacitet të plotë. Përveç kësaj, në KX janë përpjekur të implementojnë të gjitha operacionet bazë si ato aritmetike përmes instruksioneve vektoriale të procesorit, duke maksimalizuar shpejtësinë e tyre. Q mund të realizojë edhe detyra që zakonisht nuk janë të lidhura me bazat e të dhënave - për shembull, punimin e të dhënave në fluks dhe llogaritjen në 'kohë reale' (me vonesa prej dhjetëra milisekondash deri në disa sekonda në varësi të detyrës) për funksionet agreguese për instrumentet financiare për intervale të ndryshme kohore ose të ndërtojë një model të ndikimit të një transaksioni në treg dhe të bëjë profilizimin e tij praktikisht menjëherë pas përfundimit të tij. Në këto detyra, zakonisht vonesa kryesore sjell ndjeshëm nuk është Q, por nevoja për të sinkronizuar të dhënat nga burime të ndryshme. Shpejtësia e lartë arrihet falë faktit se të dhënat dhe funksionet që i përpunojnë ato ndodhen në një proces të vetëm, dhe përpunimi përfshin ekzekutimin e disa shprehjeve QSQL dhe bashkimeve, të cilat nuk interpretohen, por ekzekutohen në kodin binar.
 
Në fund, në Q mund të shkruhen edhe çdo procese shërbimi. Për shembull, proceset Gateway, që shpërndajnë automatikisht kërkesat e përdoruesve në bazat dhe serverët e nevojshëm. Programatori ka lirinë e plotë për të implementuar çdo algoritëm për balancimin, prioritetizimin, qëndrueshmërinë, të drejtat e qasjes, kuotat dhe gjithçka që dëshiron. Problemi kryesor këtu është se do të duhet ta realizosh gjithçka vetë.
 
Për shembull, do të përmend disa tipa procesesh që kemi. Të gjitha ato përdoren aktivisht dhe punojnë së bashku, duke bashkuar në një tërësi dhjetëra baza të ndryshme, duke përpunuar të dhëna nga shumë burime dhe duke shërbyer qindra përdoruesve dhe aplikacioneve.

  • KonektorĂ«t (feedhandler) pĂ«r burimet e tĂ« dhĂ«nave. KĂ«to procese zakonisht pĂ«rdorin biblioteka tĂ« jashtme, tĂ« cilat ngarkohen nĂ« Q. Interfata nĂ« C nĂ« Q Ă«shtĂ« jashtĂ«zakonisht e thjeshtĂ« dhe lejon pa ndonjĂ« vĂ«shtirĂ«si tĂ« krijoni funksione proxy pĂ«r çdo bibliotekĂ« C/C++. Q Ă«shtĂ« mjaft i shpejtĂ« pĂ«r tĂ« pĂ«rballuar, pĂ«r shembull, pĂ«rpunimin e rrjedhĂ«s sĂ« mesazheve FIX nga tĂ« gjitha bursat evropiane njĂ«kohĂ«sisht.
  • ShpĂ«rndarĂ«sit e tĂ« dhĂ«nave (tickerplant), tĂ« cilĂ«t shĂ«rbejnĂ« si lidhje ndĂ«rmjet konektorĂ«ve dhe konsumatorĂ«ve. NjĂ«kohĂ«sisht, ata shkruajnĂ« tĂ« dhĂ«nat hyrĂ«se nĂ« njĂ« log binar tĂ« veçantĂ«, duke siguruar stabilitet pĂ«r konsumatorĂ«t pĂ«r humbjen e lidhjes ose rindezjen.
  • Baza tĂ« dhĂ«nash nĂ« memorie (rdb). KĂ«to baza ofrojnĂ« qasje maksimale tĂ« shpejtĂ« nĂ« tĂ« dhĂ«na tĂ« fresh, duke i ruajtur ato nĂ« memorie. Zakonisht, ato grumbullojnĂ« tĂ« dhĂ«na nĂ« tabela gjatĂ« ditĂ«s dhe i zerojnĂ« ato natĂ«n.
  • Baza tĂ« dhĂ«nash tĂ« qĂ«ndrueshme (pdb). KĂ«to baza sigurojnĂ« ruajtjen e tĂ« dhĂ«nave pĂ«r ditĂ«n e sotme nĂ« njĂ« bazĂ« historike. Zakonisht, pĂ«r shkak se dallojnĂ« nga rdb, ato nuk ruajnĂ« tĂ« dhĂ«na nĂ« memorie, por pĂ«rdorin njĂ« cache tĂ« veçantĂ« nĂ« disk gjatĂ« ditĂ«s dhe kopjojnĂ« tĂ« dhĂ«nat nĂ« mesnatĂ« nĂ« bazĂ«n historike.
  • Baza historike (hdb). KĂ«to baza ofrojnĂ« qasje nĂ« tĂ« dhĂ«nat pĂ«r ditĂ«t, muajt dhe vitet e mĂ«parshme. MadhĂ«sia e tyre (nĂ« ditĂ«) Ă«shtĂ« e kufizuar vetĂ«m nga madhĂ«sia e hard diskĂ«ve. TĂ« dhĂ«nat mund tĂ« gjenden kudo, sidomos nĂ« disqe tĂ« ndryshme pĂ«r tĂ« pĂ«rshpejtuar qasjen. Ka mundĂ«si pĂ«r tĂ« kompresuar tĂ« dhĂ«nat, duke pĂ«rdorur disa algoritme pĂ«r zgjedhjen. Struktura e bazĂ«s Ă«shtĂ« e dokumentuar mirĂ« dhe e thjeshtĂ«, tĂ« dhĂ«nat ruajnĂ« kolonat nĂ« skedarĂ« tĂ« zakonshĂ«m, kĂ«shtu qĂ« ato mund tĂ« pĂ«rpunohen edhe me ndihmĂ«n e sistemit operativ.
  • Baza me informacion tĂ« grumbulluar. Ruhen agregate tĂ« ndryshme, zakonisht tĂ« grupuara sipas emrit tĂ« instrumentit dhe intervalit tĂ« kohĂ«s. Baza in-memory pĂ«rditĂ«son gjendjen e saj me çdo mesazh tĂ« hyrjes, ndĂ«rsa historike ruajnĂ« tĂ« dhĂ«na tĂ« parakalkuluara pĂ«r tĂ« pĂ«rshpejtuar qasjen nĂ« tĂ« dhĂ«nat historike.
  • Finally, proceset gateway, aplikacione dhe pĂ«rdorues. Q lejon realizimin e pĂ«rpunimit tĂ« plotĂ« asinkron tĂ« mesazheve tĂ« ardhura, ndarjen e tyre nĂ« bazat e tĂ« dhĂ«nave, kontrollin e tĂ« drejtave tĂ« aksesit, etj. ShĂ«noni se mesazhet nuk janĂ« tĂ« kufizuara dhe shpesh nuk janĂ« shprehje SQL, siç ndodh me bazat e tjera tĂ« tĂ« dhĂ«nave. Shpesh shprehja SQL Ă«shtĂ« e fshehur nĂ« njĂ« funksion tĂ« veçantĂ« dhe costruhet nĂ« bazĂ« tĂ« parametrave tĂ« kĂ«rkuar nga pĂ«rdoruesi — kryhet konvertimi i kohĂ«s, filtrimi, tĂ« dhĂ«nat normalizohen (p.sh., çmimi i aksioneve rregullohet nĂ« rast se ka pasur shpĂ«rblime dividendĂ«sh) etj.

Arkitektura tipike për një tip të dhënash:

Baza e të dhënave KDB+: nga financat deri në "Formulën 1"

Shpejtësia

NdĂ«rsa Q Ă«shtĂ« njĂ« gjuhĂ« e interpretuar, ajo Ă«shtĂ« gjithashtu njĂ« gjuhĂ« vektoriale. Kjo do tĂ« thotĂ« se shumĂ« funksione tĂ« ndĂ«rtuara, veçanĂ«risht ato aritmetike, pranojnĂ« argumente tĂ« çdo forme — numra, vektora, matrica, lista, dhe prej programuesit pritet qĂ« ai tĂ« implementojĂ« programin si operacione mbi masa. NĂ« njĂ« gjuhĂ« tĂ« tillĂ«, nĂ«se ju mbani dy vektora me njĂ« milion elemente, nuk ka rĂ«ndĂ«si qĂ« gjuha Ă«shtĂ« e interpretuar, mbledhja do tĂ« kryhet nga njĂ« funksion binar superoptimal. Duke qenĂ« se pjesa mĂ« e madhe e kohĂ«s nĂ« programet nĂ« Q shpenzohet pĂ«r operacione me tabela qĂ« pĂ«rdorin kĂ«to funksione bazike tĂ« vektorizuara, rezultati Ă«shtĂ« njĂ« shpejtĂ«si mjaft e mirĂ« e punĂ«s, e cila lejon pĂ«rpunimin e njĂ« sasi tĂ« madhe tĂ« dhĂ«nash edhe nĂ« njĂ« proces. Kjo Ă«shtĂ« e ngjashme me bibliotekat matematikore nĂ« Python — edhe pse vetĂ« Python Ă«shtĂ« njĂ« gjuhĂ« mjaft e ngadalshme, ka shumĂ« biblioteka tĂ« shkĂ«lqyera si numpy, tĂ« cilat lejojnĂ« pĂ«rpunimin e tĂ« dhĂ«nave numerike me shpejtĂ«sinĂ« e njĂ« gjuhe tĂ« kompiluar (pĂ«r tĂ« dyja, numpy Ă«shtĂ« ideologjikisht e afĂ«rt me Q).
 
Përveç kësaj, në KX janë treguar shumë të kujdesshëm në projektimin e tabelave dhe optimizimin e punës me to. Së pari, mbështeten disa lloje indeksesh, të cilat mbështeten nga funksione të brendshme dhe mund të aplikohen jo vetëm në kolonat e tabelave, por edhe në çdo vektor - grupim, renditje, atribut unik dhe grupim të veçantë për bazat historike. Indeksi vendoset në mënyrë elementare dhe korigjohet automatikisht kur shtohen elemente në kolonë/vektor. Indeksat mund të vendosen me sukses në kolonat e tabelave, si në kujtesë, ashtu edhe në disqe. Kur ekzekutohet një kërkesë QSQL, indeksat përdoren automatikisht, nëse është e mundur. Së dyti, puna me të dhënat historike është bërë përmes mekanizmit të mapimit të skedareve të OS (memory map). Tabelat e mëdha kurrë nuk ngarkohen në kujtesë, në vend të kësaj, kolonat e nevojshme shfaqen drejtpërdrejt në kujtesë dhe ngarkohet realisht vetëm ato pjesë (për këtë ndihmojnë gjithashtu indeksat), që janë të nevojshme. Për programuesin nuk ka ndonjë ndryshim nëse të dhënat janë në kujtesë apo jo, mekanizmi i punës me mmap është plotësisht i fshehur në thellësitë e Q.
 
KDB+ është një bazë të dhënash jo relacional, tabelat mund të përmbajnë të dhëna të rastësishme, dhe rendi i rreshtave në tabelë nuk ndryshon me shtimin e elementeve të rinj dhe mund dhe duhet të përdoret gjatë shkruarjes së kërkesave. Ky veçori është thelbësore për punën me seri temporale (të dhëna nga bursat, telemetria, logjet e ngjarjeve), sepse nëse të dhënat janë renditur sipas kohës, përdoruesi nuk ka nevojë të aplikojë ndonjë truk SQL për të gjetur rreshtin e parë ose të fundit sipas kohës në tabelë ose N rreshta, të përcaktojë se cili rresht ndjek rreshtin N dhe kështu me radhë. Akoma më shumë thjeshtohet bashkimi i tabelave, për shembull, gjetja e ofertës më të fundit për 16000 transaksione VOD.L (Vodafone) në një tabelë me 500 milion elemente zgjon rreth një sekondë në disk dhe një dhjetëzak në kujtesë.
 
Një shembull i bashkimit sipas kohës - tabela quote shfaqet në kujtesë, prandaj nuk ka nevojë të specifikohet VOD.L në where, indeksi në kolonën sym përdoret në mënyrë të paqartë dhe ajo që të dhënat janë renditur sipas kohës. Pothuajse të gjitha bashkimet në Q janë funksione të zakonshme dhe jo pjesë e shprehjes select:

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

Së fundi, merret parasysh se inxhinierët në KX, që nga Arthur Whitney, janë vërtet të obsesionuar pas efikasitetit dhe bëjnë të gjitha përpjekjet për të nxjerrë maksimumin nga funksionet standarde Q dhe për të optimizuar modelet më të shpeshta të përdorimit.
 

Përfundimi

KDB+ është e njohur në biznes kryesisht për shkak të shumëanshmërisë së saj të jashtëzakonshme - ajo shërben njësoj mirë si një bazë in-memory, ashtu edhe si një bazë për ruajtjen e terabajtëve të të dhënave historike, dhe si një platformë për analizën e të dhënave. Duke qenë se përpunimi i të dhënave bëhet direkt në bazë, arrihen shpejtësi të lartë të punës dhe kursim burimesh. Një gjuhë e plotë programimi, e integruar me funksionet e bazës së të dhënave, lejon realizimin në një platformë të gjithë shtyllën e proceseve të nevojshme - nga marrja e të dhënave deri te përpunimi i kërkesave të përdoruesve.
 

Informacione shtesë

Mangësitë

Një tjetër disavantazh të rëndësishëm të KDB+/Q është pragu i lartë i hyrjes. Gjuha ka një sintaksë të çuditshme, disa funksione janë shumë të mbingarkuara (p.sh. value ka rreth 11 mënyra përdorimi). Më e rëndësishmja, ajo kërkon një qasje radikalisht të ndryshme për të shkruar programe. Në gjuhën vektoriale, duhet të mendoni vazhdimisht në terma transformimesh të matricave, çdo cikël duhet të implementohet përmes disa varianteve të funksioneve map/reduce (të cilat quhen adverbs në Q), asnjëherë nuk duhet të përpiqeni të kurseni, duke zëvendësuar operacionet vektoriale me ato atomike. Për shembull, për të gjetur indeksin e N-të të shfaqjes së një elementi në një matricë, duhet të shkruani:

1. (where element=vector)[N]  

edhe pse kjo duket jashtëzakonisht e paefektshme sipas standardeve të C/Java (= krijon një vektor boolean, where kthen indeksat e elementeve true në të). Por një shkrim i tillë e bën kuptimin e shprehjes më të lehtë për t'u kuptuar dhe ju përdorni operacione vektoriale të shpejta në vend të atyre të ngadalta atomike. Diferenca konceptuale midis gjuhës vektoriale dhe të tjerave është e ngjashme me diferencën midis qasjeve imperative dhe funksionale në programim, dhe për këtë duhet të jeni të gatshëm.
 
Disa përdorues të tjerë gjithashtu ndihen të pakënaqur me QSQL. Në të vërtetë, ai duket si SQL i vërtetë. Por në të vërtetë, është vetëm një interpreter i shprehjeve që ngjajnë me SQL, i cili nuk mbështet optimizimin e pyetjeve. Përdoruesi duhet të shkruajë vetë pyetje optimale, dhe këtë në Q, për të cilin shumë nuk janë të gatshëm. Nga ana tjetër, sigurisht, gjithmonë mund të shkruani vetë një pyetje optimale, e jo të mbështeteni te optimizuesi si një kuti e zezë.
 
NjĂ« pĂ«rfitim nga libri pĂ«r Q — Q For Mortals Ă«shtĂ« nĂ« dispozicion falas nĂ« faqen e kompanisĂ«, pĂ«rveç kĂ«saj, aty Ă«shtĂ« mbledhur shumĂ« material pĂ«rdorues tĂ« tjerĂ« tĂ« dobishĂ«m.
 
Një tjetër disavantazh i madh është kostoja e licencës. Kjo është disa dhjetra mijëra dollarë në vit për një CPU. Vetëm kompanitë e mëdha mund t'i lejojnë ato shpenzime. Kohët e fundit, KX ka bërë politikën e licencës më fleksibël dhe ofron mundësinë për të paguar vetëm për kohën e përdorimit ose për të marrë me qira KDB+ në re të Google dhe Amazon. Po ashtu, KX ofron për shkarkim një version falas për qëllime jo-komerciale (versioni 32-bit ose 64-bit me kërkesë).
 

Konkurrentët

Ekziston njĂ« numĂ«r i konsiderueshĂ«m bazash tĂ« specializuara, tĂ« ndĂ«rtuara mbi parime tĂ« ngjashme — kolumnare, in-memory, tĂ« orientuara ndaj sasi tĂ« mĂ«dha tĂ« dhĂ«nash. Problemi Ă«shtĂ« se kĂ«to janĂ« pikĂ«risht baza tĂ« dhĂ«nash tĂ« specializuara. NjĂ« shembull i shkĂ«lqyer Ă«shtĂ« Clickhouse. Kjo bazĂ« e tĂ« dhĂ«nave ka njĂ« parim tĂ« ngjashĂ«m me KDB+ pĂ«r ruajtjen e tĂ« dhĂ«nave nĂ« disk dhe ndĂ«rtimin e indekseve, disa kĂ«rkesa ajo i ekzekuton mĂ« shpejt se KDB+, megjithatĂ« jo nĂ« mĂ«nyrĂ« tĂ« dukshme. Por edhe si njĂ« bazĂ« tĂ« dhĂ«nash, Clickhouse Ă«shtĂ« mĂ« e specializuar se KDB+ — analiza web vs seri kohore tĂ« rastĂ«sishme (kjo dallim Ă«shtĂ« shumĂ« e rĂ«ndĂ«sishme — pĂ«r shkak tĂ« saj, pĂ«r shembull, nĂ« Clickhouse nuk ka mundĂ«si pĂ«r tĂ« pĂ«rdorur renditjen e shĂ«nimeve). Por, mĂ« kryesorja, Clickhouse nuk ka universallitetin e KDB+, njĂ« gjuhĂ« qĂ« lejon qĂ« tĂ« dhĂ«nat tĂ« pĂ«rpunohen drejtpĂ«rdrejt nĂ« bazĂ«, dhe jo tĂ« ngarkohen paraprakisht nĂ« njĂ« aplikacion tĂ« veçantĂ«, ndĂ«rtuar shprehje SQL tĂ« rastĂ«sishme, tĂ« aplikohen funksione tĂ« rastĂ«sishme nĂ« kĂ«rkesĂ«, tĂ« krijohen procese qĂ« nuk lidhen me ekzekutimin e funksioneve tĂ« bazĂ«s historike. Prandaj, Ă«shtĂ« e vĂ«shtirĂ« tĂ« krahasosh KDB+ me baza tĂ« tjera, ato mund tĂ« jenĂ« mĂ« tĂ« mira nĂ« skenarĂ« tĂ« veçantĂ« pĂ«rdorimi ose thjesht mĂ« tĂ« mira nĂ«se flitet pĂ«r detyrat e bazave tradicionale tĂ« dhĂ«nash, por nuk mĂ« Ă«shtĂ« njohur ndonjĂ« mjet po aq efikas dhe universale pĂ«r pĂ«rpunimin e tĂ« dhĂ«nave temporale.
 

Integrimi me Python

PĂ«r tĂ« thjeshtuar punĂ«n me KDB+ pĂ«r njerĂ«zit qĂ« nuk janĂ« tĂ« njohur me teknologjinĂ«, KX krijoi biblioteka pĂ«r integrim tĂ« ngushtĂ« me Python nĂ« kuadĂ«r tĂ« njĂ« procesi. Mund tĂ« thirret çdo funksion python nga Q, dhe anasjelltas — tĂ« thirret çdo funksion Q nga Python (nĂ« veçanti shprehjet QSQL). Bibliotekat kthejnĂ« sipas nevojĂ«s (pĂ«r shkak tĂ« efikasitetit, jo gjithmonĂ«) tĂ« dhĂ«nat nga formati i njĂ« gjuhe nĂ« formatin e tjetĂ«rs. Si rezultat, Q dhe Python jetojnĂ« nĂ« njĂ« simbiozĂ« tĂ« tillĂ« tĂ« ngushtĂ«, sa qĂ« kufijtĂ« ndĂ«rmjet tyre fshihen. Si pasojĂ«, programatori, nga njĂ«ra anĂ«, ka qasje tĂ« plotĂ« nĂ« bibliotekat e shumta tĂ« dobishme tĂ« Python, nga ana tjetĂ«r, ai merr njĂ« bazĂ« tĂ« shpejtĂ« tĂ« integruar nĂ« Python pĂ«r punĂ« me tĂ« dhĂ«na tĂ« mĂ«dha, çka Ă«shtĂ« veçanĂ«risht e dobishme pĂ«r ata qĂ« merren me mĂ«sim tĂ« makinerive ose modelim.
 
Puna me Q në 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')  

Linket

Faqja e kompanisĂ« — https://kx.com/
Faqja pĂ«r zhvilluesit — https://code.kx.com/v2/
Libri Q For Mortals (nĂ« anglisht) — https://code.kx.com/q4m3/
Artikuj mbi pĂ«rdorimet e KDB+ / Q nga punonjĂ«sit e kx — https://code.kx.com/v2/wp/

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster