/ 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
Design
Fra : Morten


Dato : 29-06-07 11:37


Hej. Jeg har en tabel users_in_groups der skal opdateres med en vis
frekvens, fex. 24 timer. Den indeholder en summation af relationer
mellem 2 andre tabeller, har man fex.:

table groups (id)
table users (id, group_id fk groups(id))

Så er indholdet af users_in_groups givet ved:

SELECT groups.name, groups.id, count(*)
FROM users, groups
WHERE users.group_id = groups.id
GROUP BY 1, 2

Problemstillingen her er en simplificering, den query der skal til er
ret dyr og der er ikke behov for et up-to-date resultat, hvorfor jeg
ikke vil køre den on demand. Men hvad så? Det er til MySQL - under
Oracle ville jeg benytte et materialized view.

Hvad gør man under MySQL 5? DROP/CREATE er lidt for farligt (og måske
for langsomt) da den applikation der bruger databasen vil regne med at
tabellen altid eksisterer.

Jeg har overvejet at have to users_in_groups tabeller, fex.
users_in_groups_odd og users_in_groups_event, og så have et view
users_in_groups som gør select * from users_in_groups_odd. På lige dage
populerer man så users_in_groups_even i baggrunden, og når man er færdig
laver alter view på users_in_groups view'et og sætter det til at pege på
users_in_groups_even, og omvendt for ulige dage. Hvis der er en smartere
måde vil jeg gerne høre om det.

Tak.

Morten





 
 
Carsten Pedersen (29-06-2007)
Kommentar
Fra : Carsten Pedersen


Dato : 29-06-07 13:16

Morten wrote:
>
> Hej. Jeg har en tabel users_in_groups der skal opdateres med en vis
> frekvens, fex. 24 timer. Den indeholder en summation af relationer
> mellem 2 andre tabeller, har man fex.:
>
> table groups (id)
> table users (id, group_id fk groups(id))
>
> Så er indholdet af users_in_groups givet ved:
>
> SELECT groups.name, groups.id, count(*)
> FROM users, groups
> WHERE users.group_id = groups.id
> GROUP BY 1, 2
>
> Problemstillingen her er en simplificering, den query der skal til er
> ret dyr og der er ikke behov for et up-to-date resultat, hvorfor jeg
> ikke vil køre den on demand. Men hvad så? Det er til MySQL - under
> Oracle ville jeg benytte et materialized view.
>
> Hvad gør man under MySQL 5? DROP/CREATE er lidt for farligt (og måske
> for langsomt) da den applikation der bruger databasen vil regne med at
> tabellen altid eksisterer.
>
> Jeg har overvejet at have to users_in_groups tabeller, fex.
> users_in_groups_odd og users_in_groups_event, og så have et view
> users_in_groups som gør select * from users_in_groups_odd. På lige dage
> populerer man så users_in_groups_even i baggrunden, og når man er færdig
> laver alter view på users_in_groups view'et og sætter det til at pege på
> users_in_groups_even, og omvendt for ulige dage. Hvis der er en smartere
> måde vil jeg gerne høre om det.

Hæld de nye data i users_in_groups_new, og så

RENAME users_in_group TO users_in_groups_old,
users_in_groups_old TO users_in_groups

Denne operation er atomisk (atomær?).

/ Carsten

Morten (29-06-2007)
Kommentar
Fra : Morten


Dato : 29-06-07 13:42

Carsten Pedersen wrote:

>
> Hæld de nye data i users_in_groups_new, og så
>
> RENAME users_in_group TO users_in_groups_old,
> users_in_groups_old TO users_in_groups
>
> Denne operation er atomisk (atomær?).
>
> / Carsten

Meget nydeligt! Tak.

Morten

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

Månedens bedste
Årets bedste
Sidste års bedste