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í
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 16:00 | Nová verze

Byla vydána verze 0.98 svobodného nelineárního video editoru Pitivi. Z novinek lze zmínit například přizpůsobitelné klávesové zkratky. Videoukázka práce s nejnovější verzí Pitivi na YouTube.

Ladislav Hagara | Komentářů: 0
dnes 15:00 | Zajímavý software

Stop motion je technika animace, při níž je reálný objekt mezi jednotlivými snímky ručně upravován a posouván o malé úseky, tak aby po spojení vyvolala animace dojem spojitosti. Jaký software lze pro stop motion použít na Linuxu? Článek na OMG! Ubuntu! představuje Heron Animation. Ten bohužel podporuje pouze webové kamery. Podpora digitálních zrcadlovek je začleněna například v programu qStopMotion.

Ladislav Hagara | Komentářů: 1
včera 21:21 | Nová verze Ladislav Hagara | Komentářů: 0
včera 11:44 | Zajímavý projekt

Na Indiegogo byla spuštěna kampaň na podporu herní mini konzole a multimediálního centra RetroEngine Sigma od Doyodo. Předobjednat ji lze již od 49 dolarů. Požadovaná částka 20 000 dolarů byla překonána již 6 krát. Majitelé mini konzole si budou moci zahrát hry pro Atari VCS 2600, Sega Genesis nebo NES. Předinstalováno bude multimediální centrum Kodi.

Ladislav Hagara | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 4.7 redakčního systému WordPress. Kódové označením Vaughan bylo vybráno na počest americké jazzové zpěvačky Sarah "Sassy" Vaughan. Z novinek lze zmínit například novou výchozí šablonu Twenty Seventeen, náhledy pdf souborů nebo WordPress REST API.

Ladislav Hagara | Komentářů: 4
6.12. 12:00 | Zajímavý projekt

Projekt Termbox umožňuje vyzkoušet si linuxové distribuce Ubuntu, Debian, Fedora, CentOS a Arch Linux ve webovém prohlížeči. Řešení je postaveno na projektu HyperContainer. Podrobnosti v často kladených dotazech (FAQ). Zdrojové kódy jsou k dispozici na GitHubu [reddit].

Ladislav Hagara | Komentářů: 27
6.12. 11:00 | Bezpečnostní upozornění

Byly zveřejněny informace o bezpečnostní chybě CVE-2016-8655 v Linuxu zneužitelné k lokální eskalaci práv. Chyba se dostala do linuxového jádra v srpnu 2011. V upstreamu byla opravena minulý týden [Hacker News].

Ladislav Hagara | Komentářů: 2
5.12. 22:00 | Komunita

Přibližně před měsícem bylo oznámeno, že linuxová distribuce SUSE Linux Enterprise Server (SLES) běží nově také Raspberry Pi 3 (dokumentace). Obraz verze 12 SP2 pro Raspberry Pi 3 je ke stažení zdarma. Pro registrované jsou po dobu jednoho roku zdarma také aktualizace. Dnes bylo oznámeno, že pro Raspberry Pi 3 je k dispozici také nové openSUSE Leap 42.2 (zprávička). K dispozici je hned několik obrazů.

Ladislav Hagara | Komentářů: 6
5.12. 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 50
5.12. 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 10
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 795 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: MySQL velký SELECT

30.4.2008 15:22 Petr
MySQL velký SELECT
Přečteno: 1460×
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: 50 | 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: 66 | 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: 36 | 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
Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
30.4.2008 21:14 ZAH | skóre: 42 | 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: 36 | 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
Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
1.5.2008 12:03 Dejv | skóre: 36 | 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
Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
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: 36 | 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
Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
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: 48
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áknoNahoru

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.