Programim dhe zhvillim, javascript, python, php, html

Cila është mënyra më e shpejtë për të numëruar hyrjet e përdoruesve në një tabelë sesionesh?

Objektivi im është të numëroj në mënyrë efikase numrin e hyrjeve për secilin përdorues përgjatë kombinimeve të datave. Vlen të theksohet se:

  1. Marzhi i gabimit pranohet (le të themi deri në 3% për hir të shembullit).
  2. Numri nuk është i dallueshëm (nëse një përdorues është identifikuar më shumë se një herë, unë dua të di numrin e herëve)

Unë kam krijuar një shembull të thjeshtuar për të ilustruar më mirë mendimin tim.

Le të themi se kemi një tabelë të madhe sesionesh që përmban vetëm një user_id dhe një timestamp që duket si:

CREATE TABLE sessions (
    user_id text,
    tstamp  timestamp
)

Tani le të themi se ne duam të numërojmë numrin e seancave që ka pasur çdo përdorues (nëse një user_id është i pranishëm në një kohë, ne e dimë që do të thotë një hyrje) si në shkallëzimin e një dite ashtu edhe në muajin. Kjo mund të ilustrohet me këtë pyetje (të cilën unë dua ta optimizoj):

    SELECT user_id,
           date_trunc('day', tstamp)::date   AS cohort_day,
           date_trunc('month', tstamp)::date AS cohort_month,
           count(*)                          AS number_of_sessions
    FROM sessions
    GROUP BY 1,2,3;

Tabela e rezultateve duhet të duket diçka si kjo:

user_id    cohort_date cohort_month  number_of_sessions 
123456789  2020-06-25  2020-06-01    3                  
622428294  2020-06-22  2020-06-01    2                  
222678293  2020-06-23  2020-06-01    9                  
422288297  2020-06-24  2020-06-01    1      

Së fundmi, kjo tabelë është pjesë e ETL (Postgres) dhe tabelat hidhen dhe rindërtohen në çdo ekzekutim.

25.06.2020

  • Kjo klauzolë GROUP BY 1,2,3 është mënyra e frikshme për të shkruar GROUP BY user_id, date_trunc('day', tstamp)::date, date_trunc('month', tstamp)::date. Është e ngadaltë sepse detyron një skanim të plotë të tabelës për të llogaritur vlerat e ditës dhe muajit përpara se t'i grupojë ato, gjë që nuk mund të përshpejtohet duke indeksuar. 25.06.2020
  • Dëshironi përgjigjet më të shpejta për pyetjet ad hoc në lidhje me përdoruesit e rastësishëm për hollësi në kohë të rastësishme? 25.06.2020
  • Si e shkurtoni 2020-06-25 në muaj dhe merrni 2020-03-01? Nuk e kuptoj se si pyetja juaj e dhënë mund të bëjë atë që dëshironi, me çdo shpejtësi. 25.06.2020
  • Faleminderit @jjanes që më bëri ta vërej këtë. Kam krijuar të dhëna të rastësishme, kështu që duhet të kem zëvendësuar një 06 me një 03. Unë e kam redaktuar pyetjen time në përputhje me rrethanat. 25.06.2020

Përgjigjet:


1

Krijoni një pamje të materializuar për pyetjen tuaj që përmban të dhënat tashmë të grumbulluara. Kjo është e shpejtë për t'u pyetur dhe nëse e rifreskoni mjaft shpesh pamjen e materializuar, të dhënat do të jenë mjaft afër realitetit.

count vetë nuk është kurrë i shpejtë.

25.06.2020
  • Faleminderit Laurenz. Pamja e materializuar mund të jetë pak e ndërlikuar pasi kjo tabelë është pjesë e ETL dhe tabelat hidhen dhe rindërtohen në çdo paraqitje. A është e mundur të përdoret hashing ose ndonjë teknikë tjetër për të grumbulluar më shpejt të dhënat? 25.06.2020
  • Nëse tabelat përdoren më shpesh sesa rindërtohen, kjo duhet të jetë e thjeshtë: thjesht ndërtoni pamjen e materializuar si pjesë e procesit ETL. 25.06.2020
  • Kjo është një qasje "depo e të dhënave", e cila është qasja më e shpejtë. Ju mund të gjeni se bazat e të dhënave nosql janë më të shpejta se një RDBMS si Postgres (i cili funksionon shumë mirë), por ndoshta nuk do të jenë aq shumë më të shpejta në terma absolute. 25.06.2020
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..