Autor Zpráva
luma64
Profil
Zdravim, poradte pls, ak sa da a vseobecne plati.. Mam obludny selekt nad 7 tabulkami ; su to v podstate 2 datove a 5 ciselnikovych tabuliek.Selekt spustam z php. Tabulky su indexovane. Selekt sa vykona za cca 10 sekund. Co by ste mi mohli doporucit ? Dakujem.
mimochodec
Profil
luma64:
Co by ste mi mohli doporucit ?

Abys ten dotaz ukázal.
Jan Tvrdík
Profil
luma64:
Co by ste mi mohli doporucit ?
V prvé řadě je dobré si zvyknout nepsat před otazník mezeru, protože tam nepatří. A v druhé řadě se koukni na EXPLAIN toho dotazu. Velmi pravděpodobně se ty indexy nepoužívají.
luma64
Profil
Ten sql posielam upraveny.
Select distinct(h.epiz),max(h.vynosy) as vynosy,sum(p.naklady) as naklady,h.epiz_id,r.skratka as nazovriadznak, h.kododd,s.nazov ,h.rc,h.meno, h.datzacplanhosp,
(select min(m.datzachosp) from  planovane m where m.epiz=p.epiz and m.skratka='$skratka') as datzachosp, (select max(m.datukonhosp) from  planovane m where m.epiz=p.epiz and m.skratka='$skratka') as datukonhosp , t.typnazov,  h.zp,h.typhosp, h.riadznak,h.dgprij
 From histpacient h , pzs s, oddelenia o, uzivatelia u , typhosp t,  riadznak r, planovane p
  Where u.oddelenie='$dept_id' and u.oddelenie=o.id and h.kododd=s.kododd and h.kododd=p.kododd
  and (substr(h.datzacplanhosp,1,4) ='$rok' or substr(h.datzachosp,1,4) ='$rok' or substr(h.datukonhosp,1,4) ='$rok')
  and (
(substr(h.datzacplanhosp,6,2)='$mes_porcis' and h.datzachosp is null and h.datukonhosp is null)
 or (substr(h.datzacplanhosp,6,2)='$mes_porcis' and substr(h.datzachosp,6,2)='$mes_porcis' and substr(h.datukonhosp,6,2)='$mes_porcis')
 or (h.datzacplanhosp is null and (h.datzachosp is not null and convert(substr(h.datzachosp,6,2),UNSIGNED INTEGER)<$cismes+1) and h.datukonhosp is null)
 or (h.datzacplanhosp is null and h.datzachosp is not null and substr(h.datukonhosp,6,2)='$mes_porcis')
 or (h.datzacplanhosp is null and (h.datzachosp is not null and convert(substr(h.datzachosp,6,2),UNSIGNED INTEGER)<$cismes+1) and convert(substr(h.datukonhosp,6,2),UNSIGNED INTEGER)>$cismes)
) and h.riadznak=r.riadznak and s.skratka=o.skratka and o.skratka='$skratka' and u.id='$uziv_id' and h.typhosp=t.typskratka 
and h.epiz=p.epiz group by h.epiz

Ten Explain poslat v akom tvare ?
Jan Tvrdík
Profil
luma64:
Rovnou sem pošli i ten EXPLAIN + ten SQL dotaz můžeš prohnat nějakým zkrásňovačem, aby byl aspoň trochu čitelný.
Kajman
Profil
Pokud v nějakém sloupečku hledáte datumy z konkrétního měsíce, nepoužívejte pomalý substr nad sloupcem. Přepište to na něco jako
where sloupec>'2012-08-01' and sloupec <='2012-08-31' # doplnte 23:59:59, pokud tam je i cas
Pak teprve ty indexy nad datumovými sloupci budou moci být použity.
luma64
Profil
Pouzil som link na formatovanie SQL ale v spodnom okne mi furt pisalo chybu: h(9,80) expected token:Unknown
peta
Profil
luma64: Zvol tam databazi mysql. A dej tam skutecny sql dotaz, ne s $rok z php. Do phpmyadminu pak dej tez ten dotaz a klikni na explain.
SELECT DISTINCT( h.epiz ),
               Max(h.vynosy)                       AS vynosy,
               Sum(p.naklady)                      AS naklady,
               h.epiz_id,
               r.skratka                           AS nazovriadznak,
               h.kododd,
               s.nazov,
               h.rc,
               h.meno,
               h.datzacplanhosp,
               (SELECT Min(m.datzachosp)
                FROM   planovane m -- spatne, duplicitni m
                WHERE  m.epiz = p.epiz
                       AND m.skratka = '$skratka') AS datzachosp,
               (SELECT Max(m.datukonhosp)
                FROM   planovane m -- spatne, duplicitni m
                WHERE  m.epiz = p.epiz
                       AND m.skratka = '$skratka') AS datukonhosp,
               t.typnazov,
               h.zp,
               h.typhosp,
               h.riadznak,
               h.dgprij
FROM   histpacient h,
       pzs s,
       oddelenia o,
       uzivatelia u,
       typhosp t,
       riadznak r,
       planovane p
WHERE  u.oddelenie = '$dept_id' -- spatne, php
       AND u.oddelenie = o.id
       AND h.kododd = s.kododd
       AND h.kododd = p.kododd
       AND ( Substr(h.datzacplanhosp, 1, 4) = '$rok' -- spatne, php
              OR Substr(h.datzachosp, 1, 4) = '$rok' -- spatne, php
              OR Substr(h.datukonhosp, 1, 4) = '$rok' ) -- spatne, php
       AND ( ( Substr(h.datzacplanhosp, 6, 2) = '$mes_porcis' -- spatne, php
               AND h.datzachosp IS NULL
               AND h.datukonhosp IS NULL )
              OR ( Substr(h.datzacplanhosp, 6, 2) = '$mes_porcis' -- spatne, php
                   AND Substr(h.datzachosp, 6, 2) = '$mes_porcis' -- spatne, php
                   AND Substr(h.datukonhosp, 6, 2) = '$mes_porcis' ) -- spatne, php
              OR ( h.datzacplanhosp IS NULL
                   AND ( h.datzachosp IS NOT NULL
                         AND CONVERT(Substr(h.datzachosp, 6, 2), UNSIGNED
                             INTEGER) <$cismes -- spatne, php
                             + 1
                       )
                   AND h.datukonhosp IS NULL )
              OR ( h.datzacplanhosp IS NULL
                   AND h.datzachosp IS NOT NULL
                   AND Substr(h.datukonhosp, 6, 2) = '$mes_porcis' ) -- spatne, php
              OR ( h.datzacplanhosp IS NULL
                   AND ( h.datzachosp IS NOT NULL
                         AND CONVERT(Substr(h.datzachosp, 6, 2), UNSIGNED
                             INTEGER) <$cismes -- spatne, php
                             + 1
                       )
                   AND CONVERT(Substr(h.datukonhosp, 6, 2), UNSIGNED INTEGER) >$
                       cismes
                 ) )
       AND h.riadznak = r.riadznak
       AND s.skratka = o.skratka
       AND o.skratka = '$skratka' -- spatne, php
       AND u.id = '$uziv_id'
       AND h.typhosp = t.typskratka
       AND h.epiz = p.epiz
GROUP  BY h.epiz  
luma64
Profil
Na tom linku som nakopiroval so clipboardu vygenerovany select a potom som formatovany select nakopiroval do phpmyadmin a spustil :
Explain SELECT DISTINCT( h.epiz ), 
               Max(h.vynosy)                  AS vynosy, 
               Sum(p.naklady)                 AS naklady, 
               h.epiz_id, 
               r.skratka                      AS nazovriadznak, 
               h.kododd, 
               s.nazov, 
               h.rc, 
               h.meno, 
               h.datzacplanhosp, 
               (SELECT Min(m.datzachosp) 
                FROM   planovane m 
                WHERE  m.epiz = p.epiz 
                       AND m.skratka = 'ALG') AS datzachosp, 
               (SELECT Max(m.datukonhosp) 
                FROM   planovane m 
                WHERE  m.epiz = p.epiz 
                       AND m.skratka = 'ALG') AS datukonhosp, 
               t.typnazov, 
               h.zp, 
               h.typhosp, 
               h.riadznak, 
               h.dgprij 
FROM   histpacient h, 
       pzs s, 
       oddelenia o, 
       uzivatelia u, 
       typhosp t, 
       riadznak r, 
       planovane p 
WHERE  u.oddelenie = '6' 
       AND u.oddelenie = o.id 
       AND h.kododd = s.kododd 
       AND h.kododd = p.kododd 
       AND ( Substr(h.datzacplanhosp, 1, 4) = '2012' 
              OR Substr(h.datzachosp, 1, 4) = '2012' 
              OR Substr(h.datukonhosp, 1, 4) = '2012' ) 
       AND ( ( Substr(h.datzacplanhosp, 6, 2) = '08' 
               AND h.datzachosp IS NULL 
               AND h.datukonhosp IS NULL ) 
              OR ( Substr(h.datzacplanhosp, 6, 2) = '08' 
                   AND Substr(h.datzachosp, 6, 2) = '08' 
                   AND Substr(h.datukonhosp, 6, 2) = '08' ) 
              OR ( h.datzacplanhosp IS NULL 
                   AND ( h.datzachosp IS NOT NULL 
                         AND CONVERT(Substr(h.datzachosp, 6, 2), UNSIGNED 
                             INTEGER) < 8 
                             + 1 
                       ) 
                   AND h.datukonhosp IS NULL ) 
              OR ( h.datzacplanhosp IS NULL 
                   AND h.datzachosp IS NOT NULL 
                   AND Substr(h.datukonhosp, 6, 2) = '08' ) 
              OR ( h.datzacplanhosp IS NULL 
                   AND ( h.datzachosp IS NOT NULL 
                         AND CONVERT(Substr(h.datzachosp, 6, 2), UNSIGNED 
                             INTEGER) < 8 
                             + 1 
                       ) 
                   AND CONVERT(Substr(h.datukonhosp, 6, 2), UNSIGNED INTEGER) > 
                       8 ) ) 
       AND h.riadznak = r.riadznak 
       AND s.skratka = o.skratka 
       AND o.skratka = 'ALG' 
       AND u.id = '21' 
       AND h.typhosp = t.typskratka 
       AND h.epiz = p.epiz 
GROUP  BY h.epiz 
ORDER  BY h.rc, 
          h.epiz, 
          h.epiz_id

Vysledok je 9 zaznamov. Co s nimi ?
Apropo radsej pouzivam Mysql QueryBrowser.
mimochodec
Profil
luma64:
Doporučuju víc pozornosti věnovat příspěvkům Kajmana, naopak peta je něco, co lze bez větší újmy ignorovat.
Jan Tvrdík
Profil
luma64:
Vysledok je 9 zaznamov. Co s nimi ?
Ukázat nám je. Obsahují informace o tom, co MySQL musí udělat pro vyhodnocení toho dotazu.
peta
Profil
mimochodec: Mohl bych vedet, co neni v mem prispevku v chybne? Protoze uplne shodne muzu okomentovat tvuj prispevek.
mimochodec
Profil
peta:
mimochodec: Mohl bych vedet, co neni v mem prispevku v chybne? Protoze uplne shodne muzu okomentovat tvuj prispevek.

Řekněme, že navzdory tvým vyjadřovacím schopnostem chápu, na co ses asi chtěl zeptat, takže můžu odpovědět: nimráš se v detailech, odbíháš od podstaty.
luma64
Profil
peta:
ako ti to poslem? v akom tvare ? Ktore polia ?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: