Mikkel Bundgaard wrote:
> Hej Gruppe,
>
> Mit problem er at nedenstående query tager ca. 16-18 minutter at
> gennemføre på en quad XEON maskine
>
> Jeg kan som sådan godt forstå at det tager tid, jeg kan bare ikke
> finde en måde at optimere det på. Jeg er løbet lidt tør for ideer.
>
> Jeg har prøvet først med GROUP BY, men ud fra hvis samtlige categorier
> og prioriter ikke eksisterer den pågældende dato giver det ikke det
> korrekte resultat.
>
> TABELLEN datetable:
> date_row
> 2006-01-01
> ....
> ....
> ....
> 2007-03-28
>
>
> TABELLEN REM_Service (ca. 45000 Rows, 20 Categorier, 5 Prioriteter)
> består af: CreateDate, ResolvedDate, Category, Priority
> 2006-01-01 2007-01-02 SomeProgram 0-HIGH
> 2007-01-01 NULL anotherProgram 1-MEDIUM
> ....
> ....
> ....
> 2007-03-28 .... ...... ......
>
> Ideen er at jeg først danner et cross product(Cartesian map)
>
> som giver (dato X Category X Priority)
> og ud fra dette kører en query(subselect) som tæller WORK IN
> PROGRESS(WIP) op, set ud fra pr. dag.
>
> SELECT date_row as date_row,
> rs_cat.Category as Category,
> rs_prio.Priority as Priority,
> (SELECT count(*) FROM REM_Service
> WHERE rs_cat.Category=Category AND
> rs_prio.Priority=Priority AND CreateDate<=date_row
> AND (ResolvedDate is null or ResolvedDate>=date_row))
> FROM DateTable,
> (SELECT DISTINCT Category FROM REM_Service) RS_cat,
> (SELECT DISTINCT Priority FROM REM_Service) RS_prio
>
> Nogen forslag til forbedring eller hvad jeg skal lede efter?
Undgå den fjollede subselect.
SELECT date_row as date_row,
rs_cat.Category as Category,
rs_prio.Priority as Priority,
count(*)
WHERE rs_cat.Category=Category AND
rs_prio.Priority=Priority AND CreateDate<=date_row
AND (ResolvedDate is null or ResolvedDate>=date_row))
FROM DateTable
JOIN (SELECT DISTINCT Category FROM REM_Service) RS_cat
JOIN (SELECT DISTINCT Priority FROM REM_Service) RS_prio
JOIN REM_service
ON rs_cat.Category=Category
AND rs_prio.Priority=Priority
AND CreateDate<=date_row
AND (ResolvedDate is null or ResolvedDate>=date_row)
GROUP BY date_row ,
rs_cat.Category ,
rs_prio.Priority
Subselect er nyttige, specielt efter at de med nyere udgaver af SQL kan
bruges i både select- og from-klausulen. Men de misbruges alt for ofte, hvor
et simplere design med direkte join kunne bruges i stedet.
--
Venlig hilsen /Best regards
Kristian Damm Jensen