Portál AbcLinuxu, 1. května 2025 11:30

Nástroje: Začni sledovat (4) ?Zašle upozornění na váš email při vložení nového komentáře.

Vložit další komentář
8.9.2008 17:00 janik | blog: janko
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Odpovědět | Sbalit | Link | Blokovat | Admin
$ time mysql -u ab ab < orig.sql
count(R.cislo)
380

real 0m1.936s
user 0m0.011s
sys 0m0.007s
$ time mysql -u ab ab < new.sql
count(R.cislo)
380

real 0m0.273s
user 0m0.012s
sys 0m0.004s

SQL prikaz:
select
    count(R.cislo)
from
    relace R
    LEFT JOIN stitkovani nvidia ON (nvidia.cislo = R.potomek AND nvidia.stitek='nvidia' AND nvidia.typ = 'P')
    LEFT JOIN stitkovani ati ON (ati.cislo = R.potomek AND ati.stitek='ati' AND ati.typ = 'P')
    LEFT JOIN stitkovani ubuntu ON (ubuntu.cislo = R.potomek AND ubuntu.stitek='ubuntu' AND ubuntu.typ = 'P')
    LEFT JOIN stitkovani fglrx ON (fglrx.cislo = R.potomek AND fglrx.stitek='fglrx' AND fglrx.typ = 'P')
WHERE
    R.typ_potomka = 'P' AND R.predchozi=49490 AND
    ((nvidia.cislo IS NOT NULL OR ati.cislo IS NOT NULL) AND ubuntu.cislo IS NOT NULL AND NOT fglrx.cislo IS NOT NULL)

8.9.2008 19:41 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?

A pokud si chceme trochu zaprasit...

$ time mysql abc_test < new.sql
count(R.cislo)
380

real    0m0.558s
user    0m0.016s
sys     0m0.004s
$ time mysql abc_test < q.sql
count(r.cislo)
380

real    0m0.187s
user    0m0.008s
sys     0m0.004s
$ cat q.sql

select
        count(r.cislo)
from
        (
        select
                s.cislo
        from
                stitkovani s
        where
                s.typ = 'P'
                and s.stitek in ('nvidia', 'ati', 'ubuntu', 'fglrx')
        group by
                s.cislo
        having
                bit_or(s.stitek = 'nvidia' or s.stitek = 'ati') = 1
                and bit_or(s.stitek = 'ubuntu') = 1
                and bit_or(s.stitek = 'fglrx') = 0
        ) s
        join relace r on (s.cislo = r.potomek)
where
        r.typ_potomka = 'P'
        and r.predchozi = 49490
;
Luboš Doležel (Doli) avatar 8.9.2008 23:45 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Tak jsem napsal parser vyhledávacích výrazů, který pomůže vygenerovat obdobné SQL. Díky moc, je to dost rychlé :-)
Josef Kufner avatar 8.9.2008 21:10 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Místo toho kopce joinů by se dal použít jeden a spočítat, kolik se jich trefilo. Něco jako:
SELECT R.cislo, COUNT(s.stitek)
FROM
    relace R
    LEFT JOIN stitkovani s ON (s.cislo = R.potomek AND s.typ = 'P')
WHERE
    R.typ_potomka = 'P' AND R.predchozi=49490 AND
    s.stitek IN ('ati', 'nvidia', 'ubuntu', 'fglrx')
GROUP BY R.cislo
HAVING count(s.stitek) = 4
Nezkoušel jsem to, jen mě to tak napadlo. Ale nenapadá mě, jak do toho zakomponovat ty ostatní operace (or, not).
Hello world ! Segmentation fault (core dumped)
Luboš Doležel (Doli) avatar 8.9.2008 21:46 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Něco podobného jsem napsal taky a taky jsem nevěděl, jak zařadit takové operace. Nicméně to, co napsal Sinuhet, vypadá dobře :-)
Josef Kufner avatar 8.9.2008 22:58 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Hmm... ono ty operace vlastně ani nejsou moc potřeba, rozhodně ne všechny.

Když se dotaz převede do tvaru DNF, tak stačí zprovoznit operace A AND B, NOT C a X OR Y, aby se dalo spočítat (A AND B) OR (A AND NOT C). A tohle stačí na vyhodnocení jakéhokoliv výrazu.

A AND B jsem napsal před chvílí, X OR Y zvládne UNION. Takže zbývá vyřešit operaci NOT C.
Hello world ! Segmentation fault (core dumped)
rADOn avatar 8.9.2008 19:00 rADOn | skóre: 44 | blog: bloK | Praha
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Odpovědět | Sbalit | Link | Blokovat | Admin
a co na to rika EXPLAIN ? ja bych tipnul ze neco ve smyslu ze ty subselecty jedou fulscanem
"2^24 comments ought to be enough for anyone" -- CmdrTaco
8.9.2008 20:10 Leoš Literák | skóre: 74 | blog: LL | Praha
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
To je v linkovane chybe.
Zakladatel tohoto portálu. Twitter, LinkedIn, blog, StackOverflow
8.9.2008 19:25 Ignor
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Odpovědět | Sbalit | Link | Blokovat | Admin
Tak SQL expert teda opravdu nejsem, což ale mi nebrání k tomu něco říct. Kdybych to dělal já, tak bych jednoznačně měl tabulku stitky, kde by byly... štítky. A do tabulky stitkovani bych strkal místo řetězce odkaz na klíč do tabulky stitky. Nad tím integerem by se navíc dělal index mnohem příjemnějc než nad varchar(30).

A docela by mě zajímalo jak by to vypadalo, kdyby se použila (první co mě napadne) možnost 'and' dělám 'intersect' a 'or' dělám 'union'.
9.9.2008 08:14 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
No a zrovna od tebe bych čekal spíš, že řekneš, že tohle patří do databázové poradny ;-)
When your hammer is C++, everything begins to look like a thumb.
Josef Kufner avatar 8.9.2008 20:58 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Odpovědět | Sbalit | Link | Blokovat | Admin
Nezapomeňte na minimalizaci dotazu, který uživatel zadá (pokud to již neděláte).

ps: Místo hradel si tam představ sql dotaz ;)
Hello world ! Segmentation fault (core dumped)
8.9.2008 21:02 depka | skóre: 20 | blog: eterity
Rozbalit Rozbalit vše Re: Filtrování podle štítků - pomohou SQL experti?
Odpovědět | Sbalit | Link | Blokovat | Admin
pouziva vubec nekdo ty stitky?

Založit nové vláknoNahoru

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

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.