Autor | Zpráva | ||
---|---|---|---|
rampa76 Profil |
#1 · Zasláno: 10. 7. 2013, 17:30:19
Zdravím, potřeboval bych nějaký nápad ohledně odstranění duplicity.
1. Dotaz, který vrátí všechno: SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH' Zobrazeny záznamy 0 - 29 (21 661 celkem, Dotaz zabral 0.0012 sekund) EXPLAIN id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE I6SpresentTree ref SptStrId,SptStiId SptStrId 4 const 475 1 SIMPLE CpsStiVal ref StiId,CpsVyhledat,Grupovani StiId 4 web21db1.I6SpresentTree.SptStiId 19 Using where 2. Dotaz bez duplicit SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH' GROUP BY CpsCategory Zobrazeny záznamy 0 - 18 (19 celkem, Dotaz zabral 0.1752 sekund) EXPLAIN id select_type table type possible_keys key key_len ref rows Extra 1 SIMPLE I6SpresentTree ref SptStrId,SptStiId SptStrId 4 const 475 Using temporary; Using filesort 1 SIMPLE CpsStiVal ref StiId,CpsVyhledat,Grupovani StiId 4 web21db1.I6SpresentTree.SptStiId 19 Using where Má někdo prosím nápad, který by to odstranění duplicit neprodloužil "stokrát"? Distinct jsem zkoušel, výsledek je stejný. Díky moc za případnou radu. |
||
Tori Profil |
rampa76:
Jaký je počet řádků v obou tabulkách a) celkem, b) po přidání omezení ve WHERE? Kterých tabulek se týkají podmínky ve WHERE? Zkoušel jste něco jako SELECT DISTINCT sloupec FROM t1 JOIN (SELECT id FROM t2 WHERE ....) tj ON t1.id = tj.id |
||
rampa76 Profil |
#3 · Zasláno: 11. 7. 2013, 11:04:03 · Upravil/a: rampa76
Tori:
Bez omezeni WHERE: Tabulka CpsStiVal - Zobrazeny záznamy 0 - 29 (170 499 celkem, Dotaz zabral 0.0005 sekund) Tabulka I6SpresentTree - Zobrazeny záznamy 0 - 29 (138 442 celkem, Dotaz zabral 0.0012 sekund) Po přidání podmínek do dotazu a spojeni tabulek: Zobrazeny záznamy 0 - 29 (21 661 celkem, Dotaz zabral 0.0012 sekund) WHERE se týká těch dvou tabulek výše, jak je patrně z sql dotazu v prvním postu. Ten dotaz co navrhujete jsem zkoušel, vrátí to stejně n opakujících se řádků, které je pak nutné opět zgrupovat, takže to problém neřeší :-( Tori: Dotaz typu: select distinct CpsCategory from CpsStiVal join ( select SptStiId from I6SpresentTree where SptStrId = 14727 ) t on (SptStiId = StiId) where CpsVyhledat = 'VYH' je ještě o zlomek pomalejší (Dotaz zabral 0.3362 sekund) než původní seskupený dotaz "SELECT CpsCategory FROM CpsStiVal JOIN I6SpresentTree ON (StiId = SptStiId) WHERE SptStrId = '14727' AND CpsVyhledat = 'VYH' GROUP BY CpsCategory", který zabral 0.1746 sekund. |
||
tiso Profil |
#4 · Zasláno: 11. 7. 2013, 11:39:14
rampa76: v takýchto prípadoch (30 záznamov vs. 19) je rýchlejšie vybrať viac riadkov a prefiltrovať ich až pri výpise (PHP).
btw. tie názvy tabuliek a stĺpcov vymýšľal kto? |
||
rampa76 Profil |
#5 · Zasláno: 11. 7. 2013, 11:42:52
tiso:
jj, taky to vidíme na php. Já vím, že názvy nejsou zrovna košér, ale co s tím už teď nadělám... |
||
Kajman Profil |
#6 · Zasláno: 11. 7. 2013, 12:22:44
rampa76:
Existuje pro CpsCategory číselník (další tabulka)? A kolik je v ní případně řádků? |
||
rampa76 Profil |
#7 · Zasláno: 11. 7. 2013, 14:58:16
Kajman:
Ano, existuje tabulka CpsCategory kterou jsem si založil, když to teď řeším - sloupce: CpcId (Primary), CpcIdKat, CpcNameKat. Dále mám v tabulce CpsStiVal vazební sloupec CpsIdKat, ktery se rovná CpcIdKat v tabulce CpsCategory. Chtěl jsem to nějak svázat a vybrat, ale stále končím u toho, že buď je to potřeba zgrupovat v poddotazu do tabulka CpsStival, nebo grupovat až nad výsledným dotazem co tabulky CpsCategory. Vždy je to řádově "stokrát" pomalejší než úplně první dotaz v mém prvním příspěvku, kde se negrupuje a vrátí to cca 22 tisíc záznamů téměř okamžitě. |
||
Kajman Profil |
#8 · Zasláno: 11. 7. 2013, 16:37:48
Možná by šlo něco takového, ale je třeba to bude ještě pomalejší. Počet řádků v číselníky to hodně ovlivní.
SELECT cpcnamekat FROM cpscategory c WHERE EXISTS (SELECT cpsidkat FROM cpsstival JOIN i6spresenttree ON ( stiid = sptstiid ) WHERE sptstrid = '14727' AND cpsvyhledat = 'VYH' AND cpsstival.cpsidkat = c.cpsidkat LIMIT 1) Také by se mohl hodit index na více sloupci (StiId,CpsVyhledat,CpsIdKat) |
||
Časová prodleva: 12 let
|
0