abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 04:00 | Komunita

    Stát Kalifornie zažaloval výrobce 3D tiskových filamentů Polymaker. Vrchní soud San Diego County tvrdí, že firma propagací svých výrobků mezi příznivci 3D tištěných zbraní podporovala výrobu takzvaných 'ghost guns' (DIY zbraní) a že její PLA filament pro 3D tiskárny lze za těchto okolností považovat za součást určenou k výrobě střelné zbraně. Žaloba požaduje mimo jiné finanční sankce a soudní zákaz činnosti, Polymaker se hájí tím, že filament je běžný a sám o sobě legální produkt. Celý text žaloby (PDF na Google Drive).

    ❗Červivý Hřib krade❗ | Komentářů: 5
    dnes 03:33 | Nová verze

    V červnu byla představena aplikace Myna pro převod řeči na text v prostředí desktopu Ubuntu. Včera byla Myna zpřístupněna širší komunitě Ubuntu formou technologické ukázky dostupné v Ubuntu 24.04 LTS, Ubuntu 26.04 LTS a Ubuntu 26.10 s GNOME na Waylandu.

    Ladislav Hagara | Komentářů: 1
    včera 21:11 | Komunita

    Ubuntu 27.04 bude Tenacious T-Rex.

    Ladislav Hagara | Komentářů: 1
    včera 20:44 | Nová verze

    Byla vydána nová verze 2026.4.0 "Never-slop" svobodného softwaru ScummVM (Wikipedie) umožňujícího bezproblémový běh mnoha klasických adventur na zařízeních, pro které nebyly nikdy určeny. Přehled novinek v poznámkách k vydání a na GitHubu. ScummVM oslavil 25 let. Verze 0.0.1 vyšla 8. října 2001.

    Ladislav Hagara | Komentářů: 1
    včera 17:22 | Humor

    Kanadský vývojář Anthony Sistilli vytvořil ironický DIY projekt parodující kamerové systémy Flock, s cílem názorně demonstrovat rizika masového sledování jaké provozují tyto komerční ALPR systémy. Z levné IP kamery a vlastního ML softwaru (napsaného s pomocí SI circa za 20 minut, kód se mi bohužel nepodařilo dohledat) běžícího v laptopu sestavil jednoduchý systém, který detekuje výhradně policejní vozidla, zaznamenává jejich SPZ a

    … více »
    ❗Červivý Hřib krade❗ | Komentářů: 8
    včera 12:44 | Upozornění

    Část údajů uživatelů internetového supermarketu Rohlík byla odcizena. Kyberútočníci napadli nástroj zákaznické podpory Rohlíku, odcizili tak jména, e-mailové adresy, v některých případech také telefonní čísla nebo přepisy komunikace mezi klienty a zákaznickou podporou. Rohlík incident nahlásil příslušným orgánům a přijal příslušné opatření, aby zamezil podobným případům v budoucnosti, uvedla firma.

    Ladislav Hagara | Komentářů: 15
    včera 11:11 | IT novinky

    Aplikace eDoklady fungovala v obou volebních dnech stabilně a prakticky bez front. Digitální a informační agentura (DIA) odhaduje, že se digitálním dokladem prokázalo více než 100.000 voličů. Aplikaci si před volbami či během nich aktualizovalo 247.517 uživatelů. Nových registrací bylo 19.431 a do aplikace se přihlásilo 357.879 lidí. Největší nápor přišel bezprostředně po otevření volebních místností mezi 14. a 16. hodinou, kdy si

    … více »
    Ladislav Hagara | Komentářů: 9
    včera 00:55 | Pozvánky

    Začal semestr, začal i podzim a kromě hub rostou jako po dešti i veřejné dílny v Praze. Nedávno strahováci referovali o hackerspacu Bordel, nyní se otevřela dílna Dejvice Lab jen kousek od ČVUT. Na blížící Virtuální Bastlírně tak uslyšíte nejen report z návštěvy dílny HWLab, ale i řadu novinek, událostí a úsměvných momentů, které se za poslední měsíc ve světě techniky, ale i vědy udály. Připojte se tedy již v úterý 13.10. od 20:00 a zapojte se do

    … více »
    bkralik | Komentářů: 0
    11.10. 11:33 | Nová verze

    Byl vydán LineageOS 24 (Mastodon). LineageOS (Wikipedie) je svobodný operační systém pro chytré telefony, tablety a set-top boxy založený na Androidu. Jedná se o nástupce CyanogenModu. LineageOS 24 je založený na Androidu 17.

    Ladislav Hagara | Komentářů: 0
    11.10. 03:55 | IT novinky

    Společnost Valve publikovala na svém GitLabu nákresy a schémata zapojení headsetu Steam Frame. Pro nekomerční účely.

    Ladislav Hagara | Komentářů: 1
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (21%)
     (29%)
     (8%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2838 hlasů
     Komentářů: 32, poslední 11.10. 17:02
    Rozcestník

    Dotaz: MySQL velký SELECT

    30.4.2008 15:22 Petr
    MySQL velký SELECT
    Přečteno: 1739×
    Dobrý den,

    když spustím tento dotaz, běží několik minut (pak jsem ho ukončil) a ostatní uživatele nemohou s databází vůbec pracovat:

    SELECT Records.ClientNr, Clients.Name AS Nazev, LEFT(Clients.VSB,2) AS Obch, COUNT(DISTINCT Records.RecordNr) AS Spisy, DATE_FORMAT(Recdate,'%Y%m') AS DatM, MAX(CASE WHEN VChrontable.Kuerzel = 'V23' THEN VChrontable.Datum END) AS DatSml, SUM(CASE WHEN Chrontable.Kuerzel LIKE 'RG%' AND Chrontable.Kuerzel <> 'RGKČX' OR Chrontable.Kuerzel LIKE 'Z00%' THEN Chrontable.Betrag ELSE 0 END) AS Suma From Records, Chrontable, Clients, VChrontable Where Records.RecordNr = Chrontable.RecordNr And Records.ClientNr = Clients.ClientNr And Clients.ClientNr = VChrontable.ClientNr GROUP BY Records.ClientNr, DatM

    Je špatně napsaný ten SELECT, nebo špatný hardware nebo nastavení MySQL? Recordset je otevřen na straně serveru. Verze MySQL 4.1.13, linux SUSE.

    tabulka Records má 65 000 záznamů, Chrontable 880 000, Clients 12 000, VChrontable 95 000 záznamů.

    Odpovědi

    Heron avatar 30.4.2008 15:27 Heron | skóre: 53 | blog: root_at_heron | Olomouc
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Chtělo by to upravit formátování.

    Co na to řekne EXPLAIN? Používají se indexy nebo fullscan? Jaký je typ tabulek? Jaký je to HW? Tabulky jsou poměrně malé, neměl by být důvod pro takovéto časy.
    30.4.2008 16:07 Petr
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    typ tabulek je MyISAM. HW nevím, je to nějaký nový server.
    EXPLAIN:
    -------+-----+------+--------------+----------+-------+-----------------+-----+--------------+
    |select|table|type  |possible_keys |key       |key_len|ref              |rows |Extra         |
    -------+-----+------+--------------+----------+-------+-----------------+-----+--------------+
    |SIMPLE|Recor|ALL   |PRIMARY,CL_IDX|[NULL]    | [NULL]|[NULL]           |65621|Using filesort|
    |SIMPLE|Clien|eq_ref|PRIMARY       |PRIMARY   |      4|Records.ClientNr |    1|              |
    |SIMPLE|VChro|ref   |Client_idx    |Client_idx|      5|Clients.ClientNr |    7|Using where   |
    |SIMPLE|Chron|ref   |Record_idx    |Record_idx|      5|Records.RecordNr |   13|Using where   |
    +------+------------+--------------+----------+-------+-----------------+-----+--------------+
    30.4.2008 16:11 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    odporčam vám ísť na to postupne, najprv select jeden stĺpec, potom pridať ďaľší, až to jeden zblbne úplne (napr v poradí 1, 2, 3, 5, 4, 6, 7)
    30.4.2008 23:38 kafa | skóre: 10
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Nechybí vám v tabulce Records index na sloupci RecordNr, podle kterého spojujete?
    1.5.2008 10:51 Petr
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Nechybí. Všechny sloupce RecordNr a ClientNr jsou indexovány. Index je i na Chrontable.Kuerzel, Clients.Name, ale není na VChrontable.Kuerzel
    1.5.2008 18:49 kafa | skóre: 10
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Jo, už to vidím. Výběr z Chrontable ani Clients není nijak omezen, takže Records se musí číst celý. Problém ovšem vidím v tom, že v tabulce Records (evidentně M:N) se ClentNr bude mnohokrát opakovat a pro každý výskyt se musí znovu provést výběr podřízených řádků v tabulce Vchrontable. Já bych nejprve v jednom selectu vytvořil temporary tabulku ze spojení Clients a Vchrontable, (GROUP BY ClientsNr - víc než 12000 řádků by neměla) a pak bych Records spojoval pouze s Chrontable a touto temporary tabulkou). Jsem přesvědčen, že výsledek by byl mnohokrát rychleji.
    1.5.2008 20:52 kafa | skóre: 10
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Nebo ho alespoň přinutit, aby nezačínal spojení tabulkou M:N. Vyzkoušel bych SELECT STRAIGHT_JOIN ... a seznam tabulek za FROM seřadil v pořadí Clients, Vchrontable, Records, Chrontable. Pak se Vchrontable bude prohledávat pro každého použitého klienta pouze jednou.
    30.4.2008 15:59 Filip Jirsák | skóre: 67 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Trochu upravím formátování:
    SELECT
      Records.ClientNr,
      Clients.Name AS Nazev,
      LEFT(Clients.VSB,2) AS Obch,
      COUNT(DISTINCT Records.RecordNr) AS Spisy,
      DATE_FORMAT(Recdate,'%Y%m') AS DatM,
      MAX(CASE WHEN VChrontable.Kuerzel = 'V23' THEN VChrontable.Datum END) AS DatSml,
      SUM(CASE WHEN Chrontable.Kuerzel LIKE 'RG%' AND Chrontable.Kuerzel <> 'RGKČX'
        OR Chrontable.Kuerzel LIKE 'Z00%' THEN Chrontable.Betrag ELSE 0 END) AS Suma
    FROM
      Records,
      Chrontable,
      Clients,
      VChrontable
    WHERE
      Records.RecordNr = Chrontable.RecordNr
      AND Records.ClientNr = Clients.ClientNr
      AND Clients.ClientNr = VChrontable.ClientNr
    GROUP BY Records.ClientNr, DatM
    
    Jinak mi není jasné, co tím dotazem vlastně chcete zjistit. Ty podmínky v agregačních funkcích vypadají divně (proč nejsou ve WHERE?), používat za SELECTem mimo agregační funkce sloupce, které nejsou v GROUP BY, by vám v jiné databázi než MySQL neprošlo (a bez pohledu do dokumentace nedokážu určit, jak moc náhodně bude MySQL vybírat hodnoty pro ty sloupečky). Teď mne ještě praštilo do očí – pokud je DatM v GROUP BY opravdu ten formátovaný řetězec, pak chudák databáze – na to nemůže použít žádný index. A jestli se nepletu tohle by vám opět u jiných databází neprošlo.
    30.4.2008 16:06 happy barney | skóre: 34 | blog: dont_worry_be_happy
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    ad DatM v group by: to by prešlo, alternatívne je možné písať group by 1, 5 (podľa prvého a piateho stĺpca)

    mne osobne sa nepáči:
    - spomínané chýbajúce stĺpce v group by
    - distinct v count
    - or v SUM - chýbajúce else v MAX

    podmienky v agregačných funkciách majú zmysel, aj keď podivný (návrh databázy smrdí nemčinou, tam sa podivnosti očakávať dajú)

    30.4.2008 16:30 Petr
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Pokusím se popsat tabulky :
    Records(RecordNr long,ClientNr long, Recdate date)
    Chrontable(Kuerzel varchar,Betrag double)
    Clients(ClientNr long, VSB varchar)
    VChrontable(ClientNr long, Kuerzel varchar, Datum date)
    
    a co chci zjistit:
    ClientNr, počet RecordNr, k nim součet RG (v mém dotazu AS Suma), první dva znaky z Clients.VSB,
    VChrontable.datum pro Kuerzel = 'V23' (pokud existuje) seskupeno podle ClientNr 
    a podle měsíce z Records.Recdate (yyyymm)
    
    nebo jinými slovy počet Records.RecordNr, 
    součet Chrontable.Betrag kde RecordNr=Records.RecordNr a kde Kuerzel LIKE 'RG%' ... za každý měsíc
     dle Records.Recdate a k tomu VChrontable.Datum kde je Kuerzel = 'V23' a k tomu Clients.VSB
    
    30.4.2008 17:03 Petr
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    když do WHERE přidám Records.ClientNr < 25, tak to proběhne za cca 20s a vrátí 140 řádků
    30.4.2008 20:46 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Co zase me prastilo do oci je spojeni tabulek. Nejsem si jisty, ale mam pocit, ze tebou pouzite spojeni spoji zaznamy kazdy s kazdym a teprve tohle spojeni filtruje podle where. Podle jmen sloupcu (a tvojeho where) odhaduji, ze by to mohlo byt
    FROM
      Records
      join Clients on Clients.ClientNr=Records.ClientNr
      join VChrontable on VChrontable.ClientNr=Records.ClientNr
      join Chrontable on Chrontable.Kuerzel=VChrontable.Kuerzel
    
    A urcite bych se pokusil vyhnout spojeni pres varchar polozku.

    Pokud placam nesmysly, prosim zkusenejsi, aby me opravili :-)

    Dejv
    Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
    30.4.2008 21:14 ZAH | skóre: 43 | blog: ZAH
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Skoro bych se připojil osobně bych zkusil subselecty. (Doufám že nekecám a MySQL to umí)
    SELECT
      Records.ClientNr,
      select Clients.Name from clients where Records.ClientNr = Clients.ClientNr AS Nazev,
      LEFT(Clients.VSB,2) AS Obch,
      select ....
      DATE_FORMAT(Recdate,'%Y%m') AS DatM,
      select .... 
      select ........
    FROM  
         Records
    GROUP BY 
          Records.ClientNr, DatM
    
    1.5.2008 00:45 kafa | skóre: 10
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Mýlíte se, oba způsoby spojení se provádějí naprosto identicky. Jde jen o jiný formát zápisu, který oddělí spojovací podmínky od ostatních, aby byl přehlednější pro člověka a ten méně chyboval. Databázi je to jedno - oba styly vyhodnocuje shodně.
    1.5.2008 11:52 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Hm, ja to tusil, ze zase placam blbosti :-D Diky za opravu :-)

    Dejv
    Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
    1.5.2008 12:03 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Ale jeste jeden tip pridam. Nechybi ve spojeni tabulek (teda ve where) jeste pole Chrontable.Kuerzel=VChrontable.Kuerzel?

    Dejv
    Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
    1.5.2008 12:12 Petr
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Ne. Tyto tabulky nemaji byt navzajem propojeny.
    1.5.2008 14:12 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    A jo, blbne jsem se dival, promin. V popisu tabulek nemas uvedeny sloupec Chrontable.RecordNr a ja si nevsiml, ze to podle neho mas spojene ve where.

    Priste zkusim lip cist :-D

    Dejv
    Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
    1.5.2008 15:52 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    "Ty podmínky v agregačních funkcích vypadají divně (proč nejsou ve WHERE?), používat za SELECTem mimo agregační funkce sloupce, které nejsou v GROUP BY, by vám v jiné databázi než MySQL neprošlo"
    MySQL něco takového opravdu sežere a ani nepípne? Není to "poněkud" proti SQL normě?
    1.5.2008 16:00 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    Jo. Něco podobného se mi kdysi povedlo s InterBase 6, když jsem to pak chtěl pustit na Firebirdu, tak na mne křičel :-) Ale už si nepamatuju přesně, o co šlo.
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    1.5.2008 17:16 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    No když seskupuješ, tak musíš sloupce výsledku buď agregovat, nebo bez agregací používat sloupce s hodnotama, který jsou pro každý agregovaný řádek prokazatelně jednoznačný...třeba právě ty hodnoty, podle kterých se seskupuje. ;-) (Možná že v SQL normě jsou jen ty agregovaný sloupce a sloupce z GROUP BY, možná má databáze povolený inferovat další jednoznačný buňky - tím už si nejsem jistej.)

    Což Ti asi vysvětlovat nemusím, ale jsem si skoro jistý, že se Ti stalo právě tohle - taky se mi občas stane, že na to zapomenu, ale nikdy by mě nenapadlo, že může existovat ("relační", zde v uvozovkách ;-)) databáze, která na to neupozorní. BTW, pokud náhodou skutečně potřebuješ skupinu hodnot čistě do výsledku, ve Firebirdu 2.1 přibyla agregační fce LIST( [ {ALL | DISTINCT } ] <value_expression> [ ',' <delimiter_value> ] ), která umí "atomizovat" sloupce do seznamu prezentovatelného uživateli. Vrací to řetězec. Asi záleží na klientské straně, ale chvílema se to může hodit, třeba v ISQL.
    30.4.2008 20:38 cronin | skóre: 49
    Rozbalit Rozbalit vše Re: MySQL velký SELECT
    1.5.2008 18:43 Tomas
    Rozbalit Rozbalit vše Re: MySQL velký SELECT

    Formátování by opravdu hodně pomohlo na čitelnosti.

    Zkusil bych následující kroky ke zjištění co dělá problém:

    • Vyhodit COUNT( DISTINCT ...)
    • Vyhodit agregace a vyzkoušet jak dlouho poběží samotné joiny a zda se vrátí přibližně správný počet záznamů.
    • Ve frázi GROUP BY místo DatM dát RecDate a vyhodit ze selectu sloupec DatM

    Založit nové vlákno • Nahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.