Avatar billede arnejan Nybegynder
25. marts 2004 - 01:28 Der er 21 kommentarer og
1 løsning

Database design spm

Hej.

Jeg har en database system med ca 20 tabeler. Bla f.eks. en 'kunde_tabel'

Nu har jeg brug for et system, hvor jeg for hver kunde i kunde_tabel, vil logge noget info om denne kunde.

Min plan er når man opretter en nye kunde med f.eks. id = 56, så samtidig oprette en nye tabel (fra koden forstås) med navnet 'kunde_56_log_tabel' . Og tilsvarende slette denne tabel når kunden slettes.

Derefter vil jeg så skrive logging info til 'kunde_56_log_tabel' efterhånden som systemet kører.

Jeg er i tvivl om myt design er helt forkert. Om jeg istedet blot skulle lave en enkel tabel som hed 'kunde_log_tabel' og så skrive logging info fra alle kunder til den med angivelse af kunde id.

Der bliver ca 200 kunder i mit system, og hver kunde får ca 1000 loging linjer per dag.

Hvis jeg vælger design 2, vil der altså blive skrevet til 'kunde_log_tabel' 200.000 gange per dag.

Hvilket design er det rigtige ? og er mit design 1 helt helt forkert.

Med venlig hilsen
Avatar billede jara06 Nybegynder
25. marts 2004 - 01:32 #1
er ikke db exprt, men ville nok vælge nr 2 fremfor 200 tabeller ... :)
hvilken maskine kommer det til at køre på og hvilket os ?
Avatar billede arnejan Nybegynder
25. marts 2004 - 01:36 #2
Windows 2003 Server, med SQL Server 2000 sp3.

Jo, det tror jeg sku også. Men jeg er også ude efter at finde ud af om mit design 1 er helt helt forkert og misforstået. Eller blot almindeligt forkert.
Avatar billede arnejan Nybegynder
25. marts 2004 - 01:37 #3
Men hvis jeg vælger design 2, føler jeg bare at log tabelen bliver så fantastisk stor at jeg er bange for at "den bliver for stor".

Men det er måske noget pjat.
Avatar billede jara06 Nybegynder
25. marts 2004 - 01:41 #4
den vil blive meget stor ...! :D
kunderne kan ikke indeles yderligere, eller f.eks. begrænse det til 10 eller 20 tabeller ialt ?
Avatar billede arne_v Ekspert
25. marts 2004 - 07:26 #5
En tabel - uden tvivl.

Pæneste design.

Performance er irrelevant med den belastning.

200000 INSERT/dag af 8 timer = 417 INSERT/minut

hvilket ikke bør være noget problem.

Jeg er iøvrigt ikke nødvendigvis overbevist om at 200 tabeller er
hurtigere end 1 tabel.
Avatar billede trer Nybegynder
25. marts 2004 - 07:27 #6
Hvis du opretter tabeller ad hoc til de enkelte kunder får du et sikkerhedshul af dimensioner idet brugeren du forbinder med så skal have ret til at oprette tabeller.

Det betyder at brugeren også har ret til at droppe tabeller; Enhver der får adgang til din db kan så - i teorien - smadre din database (f.eks. via SQL Injection).

200.000 rækker pr dag er en stor tabel - men den er ikke umanerligt stor. Jeg har arbejdet med tabeller med op til 900 millioner rækker, SQL Server klarer det fint, omend det kræver seriøse mængder ram. 

Til gengæld, med mindre du vil gøre en storage sælger glad, hvor mange dage vil du have liggende i din log? Uanset om du vælger design 1 eller 2 vil du få samme antal rækker i databasen og dermed samme mængde data. På et år taler vi om over 70 millioner rækker.

Mht antal dage i loggen - oprydning når du skal slette log data vil også ske nemmest fra en enkelt tabel.
Avatar billede trer Nybegynder
25. marts 2004 - 07:29 #7
arne_v> Umiddelbart vil jeg mene at 200 tabeller vil være langsommere end 1 tabel. Al SQL vil skulle være dynamisk og dermed vil alt blive rekompileret ved hvert kald inkl. at lave query planer etc. Man vil også få ekstra joins - og det koster også.
Avatar billede arne_v Ekspert
25. marts 2004 - 07:53 #8
Argumentet for de mange må være: færre samtidigheds problemer, nemme at dele IO
ud på diske.

Jeg tror ikke på at dynamisk eller ej SQL vil betyde noget i denne sammehæng.

Argumentet mod de mange må være: meget dårligere caching, de famøse
JOINS/UNIONS der eventuelt skal til.
Avatar billede trer Nybegynder
25. marts 2004 - 08:08 #9
Mht at dele IO ud på diske så er det dybt lige gyldigt om du har en eller mange tabeller. Man kan blot understøtte tabellens filgruppe med mange separate filer - det vil faktisk give en bedre spredning af belastningen (end ved mange tabeller) i det SQL Server vil vælge at benytte hver fil lige meget.

Med ordenlige indeks (bl.a. på kundenummer) så vil der heller ikke være noget samtidighedsproblem / låseproblem med en enkelt tabel.

Dynamtisk SQL har betyding i og med det vil kræve væsentligt mere CPU kraft for den enkelte query - og kræve det for hver afvikling. Normalt vil en query blive cachet (og hvis man er heldig - parameteriseret) så query planer mv kan genbruges fra gang til gang - det sker ikke med dynamisk SQL.

Mht caching og joins er vi ganske enige.

Så alt i alt er det svært at argumentere for de mange tabeller.
Avatar billede trer Nybegynder
25. marts 2004 - 08:12 #10
Videre vedr. caching af tabeller.

Da det er log tabeller vi snakker om, så vil der nok sjældent være tale om læsninger, mest skrivninger. Indsættelserne sker i slutningen af tabellen, så SQL Server kan kunne nøjes med at cache sidste extent af tabellen (det er jo der der indsættes) - vælger man mange tabeller skal der caches et extent for hver tabel.

At lokke SQL Server til kun at cache sidste extent er ikke særlig svært, det kræver blot at man har et (clustered) indeks på en kolonne der altid vil være i stigende orden ifht indsættelserne. Typisk en identity kolonne eller datetime med default getdate() - aldrig en GUID eller lignende.
Avatar billede arne_v Ekspert
25. marts 2004 - 08:39 #11
Det er netop på grund af index at du får et samtidigheds problem med en tabel. Fordi
flere inserts skal opdatere samme index page.
Avatar billede arne_v Ekspert
25. marts 2004 - 08:44 #12
Hvis SQLServer som du antyder inserter records spredt ud, så vil det da gå
ud over SELECT performance. Jeg ville have troet at den fyldte datapages op
inden den skiftede device.
Avatar billede arne_v Ekspert
25. marts 2004 - 08:46 #13
Jeg kender godt princippet i query planer.

Men:
  - jeg tvivler på at gevindsten er stor ved simple INSERT
  - hvis der er forskel i disk IO så vil det normalt dominere i forhold til
    SQL parsning & analyse
Avatar billede trer Nybegynder
25. marts 2004 - 08:51 #14
Indeks opdateringerne vil også ske på sidste extent, så vidt har du ret, men antallet af opdateringer er ikke så ekstremt (okay, de kommer nok i grupper fremfor jævnt fordelt over hele døgnet, men..) - jeg ville være mere opsat på at undgå pagesplits etc.
Avatar billede arne_v Ekspert
25. marts 2004 - 08:52 #15
Med hensyn til cahing så er det min hypotese, at SQLServer bedre vil kunne effektivt
cache 1 last datapage + index pages for 1 tabel end 200 last datapages
og index pages for 200 tabeller.

Og at det er der de 200 tabeller vil knække.
Avatar billede trer Nybegynder
25. marts 2004 - 08:54 #16
SQL Server læser og skriver naturligvis altid i hele extents - men med flere fysiske filer der understøtter en filgruppe vil den sprede de læste og skrevne extents ud over de forskellige filer - og dermed sprede belastningen. Det større antal fysiske filer betyder bl.a. at den kan have flere asynkrone i/o igang for den enkelte query.

Får man for mange fysiske filer sker der i øvrigt det, at ens filsystem bliver en flaskehals og performance ryger ned - man skal finde en balance.
Avatar billede trer Nybegynder
25. marts 2004 - 08:57 #17
Vores bevæggrunde er forskellige, men der er vist ingen tvivl om at vi begge støtter tanken om 1 tabel fremfor 200 :-)
Avatar billede arne_v Ekspert
25. marts 2004 - 09:12 #18
Det er der ingen tvivl om !
Avatar billede arnejan Nybegynder
25. marts 2004 - 22:17 #19
Tak for de fine svar, så bliver det sådan.

Iøvrigt vil jeg ikke skrive hele tiden, men have en klasse som holder 'log-entry´s" i ram, og så f.eks. flusher til DB, hvergang der er 100 eller hvert kvarter eller noget (og før systemet lukker ned).

Tabelen vil blive slettet løbende, og istedet skrevet i nogen filer til langtidsopbevaring.

Tak for de fine kommentarer.

Kom med et svar, hvis nogen vil have pointene.

Mvh
Avatar billede arne_v Ekspert
25. marts 2004 - 22:22 #20
Hvorfor vil du vente med at skrive ?

Normalt vil jeg sige at det vil være bedst at fordele skrivningerne jævnt ud.

Og hvad nu hvis din applikation crasher.

Eneste potentielle performance fordel vil være hvis du bundter de 100 INSERT
i en enkelt transaktion.

Ved nogle databaser giver det en performance forbedring.
Avatar billede arne_v Ekspert
25. marts 2004 - 22:22 #21
svar
Avatar billede trer Nybegynder
25. marts 2004 - 22:42 #22
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester