Programátor PHP – Praha – dlouhodobá spolupráce
Zobrazují se odpovědi 1 až 14 z 14

Fce SUM pro vic tabulek naraz

  1. zdravim, potreboval bych pomoct s dotazem. puvodne sem mel jednoduse:
    PHP kód:
    SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM table WHERE `date`='$date' AND type='0' GROUP BY id ORDER BY data1 DESC 
    nastala ale nutnost tabulku rozdelit na nekolik mensich se stejnou strukturou a ted nevim jak dotaz prepsat abych dostal stejny vysledek.
    jeste nez se tu zacne resit proc to nezustalo v jedne tabulce tak to situace opravdu neumoznuje, muj dotaz je jak dosahnout stejnyho vysledku kdyz nebudu vybirat z jedne tabulky ale treba s 5ti ze stejnou strukturou.
    dokud sem nepotreboval group a order, tak sem to resil cyklem v php co prosel postupne vsechny tabulky a bylo to bez problemu ted sem ale uz dva dny zaseklej na tomhle a nevim jak dal, nejspis to pujde pres nejakej join ale ty tak uplne nechapu a nepovedlo se mi to dat dohromady

  2. Happy Robot :]
  3. na tohle v databzich existuje partitioning (rozdelovani dat do ruznych tabulek podle klice, pricemz se dotaz ale dela pouze na hlavni zakladni tabulku) pokud se nemylim... zda se ze si zbytecne pridelavate praci s necim co uz je vyresene

    (snad tu o tom nekdo napise vic, protoze osobne jsem s tim jeste nepracoval)

  4. Hodně pomůže pokud uvedeš struktury tabulek, nicméně možné řešení je třeba:

    Kód:
       SELECT
       tab1.id, tab1.data1 + tab2.data1 + tab3.data1 + ... + tabX.data1 as data1, tab1.data2 + tab2.data2 + tab3.data2 + ... + tabX.data2 as data2
       (SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM table1 WHERE `date`='$date' AND type='0' GROUP BY id) as tab1
       JOIN
       (SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM table1 WHERE `date`='$date' AND type='0' GROUP BY id) as tab2
       ON tab1.id = tab2.id
       JOIN
       (SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM table1 WHERE `date`='$date' AND type='0' GROUP BY id) as tab3
       ON tab1.id = tab3.id
       ...
       JOIN
       (SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM table1 WHERE `date`='$date' AND type='0' GROUP BY id) as tabX
       ON tab1.id = tabX.id
       ORDER BY tab1.data1 + tab2.data1 + tab3.data1 + ... + tabX.data1
    Pokud nemáš pevný počet tabulek, tak si to SQL generuj dynamicky.

    Je to sice z hlediska záteže serveru prasárna, ale při rozdělení co máš to asi hezčí udělat moc nepůjde.

    ---------- Příspěvek doplněn 22.12.2011 v 11:51 ----------

    Jinak souhlas s Alešem, nedovedu si představit důvod, proč rozdělit 1 tabulku na víc naprosto stejných. Nedovedu si ten důvod představit ani pro tabulku v řádech stamilionů záznamů a velikosti desítek terabajtů.

  5. abych to teda priblizil, slo o tabulku s miliony zaznamu na kterou bylo extremni mnozstvi dotazu co se tykali jen male casti dat. po rozdeleni klesla zatez serveru o 90% a funguje to nadherne, spocitat data napric vsema tabulkama je potreba jen parkrat za den takze behem toho se vetsi zatez prezije. pevnej pocet neni, dynamicky sql dotazy generuju uz ted. du vyzkouset tohle reseni a dam vedet

  6. dotazy se spravnym indexem, pokud to nejsou nejake hodne specialni dotazy by meli byt v radech milisekund a temer bez zateze i na velkych tabulkach :) resit to roztristenim dat tedy pomuze, ale v podstate tim jen resite problem ktery maji resit indexy ikoliv tristeni dat

  7. Pokud na tabulku bylo extrémní množství dotazů na menší množství dat a pomohlo rozdělení na malé tabulky svědčí to o jediném. Máte špatně udělné indexy a neumíte s nimi pracovat. Indexy jsou různých druhů. Správně naindexovaná tabulka se správně udělanými dotazy vrací i z milionů záznamů výsledky v milisekundách až vteřinách.

  8. praveze ani indexy nestacily, na te tabulce je opravdu extremni provoz, v prumeru 30 milionu dotazu za hodinu. az po rozdeleni kdy uz dotazy smerujou na konkretni mensi tabulky to jede i s touhle zatezi perfektni rychlosti. pokud to pujde pres ten join tak i kdyz to bude prasarna tak si vysledek ulozim do cache a staci mi aktualizovat jen parkrat za den coz se da prezit

  9. Buď cache, nebo si udělej jednu tabulku, kde budou předpočítané hodnoty a párkrát za den jí aktualizuj. Záleží co bude rychlejší, v cache máš výsledky, ale předpočtenou tabulku jde indexovat a joinovat.

    8333 dotazů za vteřinu by pořád mělo jít na dostatečně dimenzovaném serveru rozumně zvládat. Je to už trošku výzva, ale pořád nic co by bylo nutné řešit rozdělením tabulek.

  10. SELECT id,SUM(data1) AS data1,SUM(data2) AS data2 FROM
    (

    SELECT id,data1,data FROM table1 WHERE `date`='$date' AND type='0' union all
    SELECT id,data1,data FROM table2 WHERE `date`='$date' AND type='0' union all
    ...
    SELECT id
    ,data1,data FROM table3 WHERE `date`='$date' AND type='0'
    ) GROUP BY id order by data1 desc



  11. du vyzkouset, jen dotaz pro pochopeni, proc v te posledni uz neni union all?

    ---------- Příspěvek doplněn 22.12.2011 v 14:08 ----------

    tak uz sem ten union pochopil, musel sem jeste za konec te zavorky pridat alias a pocita to bezchybne :) diky moc :)

  12. union all je mezi první a druhou, druhou a třetí,...,předposlední a poslední

  13. několikanásobný UNION ALL mezi tabulkami kde je v součtu několik milionů řádků ... uff, to bude peklo. Ten můj dotaz nevypadá tak pěkně, ale nebude zatěžovat DB tak moc.

    ---------- Příspěvek doplněn 22.12.2011 v 15:01 ----------

    Tím nechci říct, že je ten UNION špatně, je to funkční řešení, akorát pro tyhle podmínky bude nevhodné z hlediska zátěže.

  14. UNION nemusi byt vubec spatne reseni. Pocitam ze tam stejne pouziva nejaky limit (nebo pracuje s milionem zaznamu?). Kdyz prida odpovidajici nasobky limitu, do tech union selectu a zaroven i tam bude radit...

    Provedou se dva, tri, podle poctu tech tabulek, velice rychle selecty, ktere se pak dotridi bez indexu, ale tam uz bude malo zaznamu...

    Stejne si myslim, ze ty indexy nebyli optimalni... Ale jinak bych mel stejne nejakou master tabulku, kde bude vse. A z ni se daji pres triggery generovat specificke slave tabulky. Pak se jen pouzije pozadovana tabulka.

  15. uz to mam v provozu a ten union me opravdu zachranil, i kdyz spojuje hromadu tabulek s hodne daty tak to funguje uzasne rychle :)

Podobná témata

  1. Zavolanie sady funkcii naraz
    By node in forum Javascript
    Odpovědí: 5
    Poslední příspěvek: 03.08.2011, 15:04
Hostujeme u Server powered by TELE3