/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Optimering af query
Fra : Mikkel Bundgaard


Dato : 28-03-07 19:57

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?

Prøvede at lægge min query ind som et VIEW i mssql2000 men det vil den
ikke acceptere :-/ ?

Hilsen Mikkel Bundgaard


--
From: Mikkel Bundgaard
Replace "invalid" with "dk" in address
homepage: http://www.notfound.dk/main/index.html?page=usenet

 
 
Kristian Damm Jensen (29-03-2007)
Kommentar
Fra : Kristian Damm Jensen


Dato : 29-03-07 12:29

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



Michael Zedeler (29-03-2007)
Kommentar
Fra : Michael Zedeler


Dato : 29-03-07 20:06

Mikkel Bundgaard skrev:
> 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?

Disse to:

(SELECT DISTINCT Category FROM REM_Service) RS_cat
(SELECT DISTINCT Priority FROM REM_Service) RS_prio

Tyder på dårligt databasedesign. Der /kan/ være en god grund til at de
er sådan, men det er også meget muligt at du kan vinde en del ved at
normalisere din database ordentligt.

Dernæst kan du undersøge om dine tabeller er indekseret korrekt. Hvis de
ikke er det, kan du få helt simple forespørgsler til nærmest aldrig at
slutte.

Kristian har skrevet lidt om at optimere selve forespørgslen, så det vil
jeg ikke blande mig i.

Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste