Avatar billede donkazz Nybegynder
27. juni 2007 - 13:42 Der er 13 kommentarer og
1 løsning

Smarteste måde at trække og indsætte data?

Hejsa!

Jeg er ved at lave et slags nyhedsmodul, som egentligt bare skal hive en nyhed ud fra tabellen "news". Tabellen har følgende felter:
* id
header
newsDate
theContent
thePage

"thePage" er numerisk og angiver hvilket side ID nyheden skal vises på. F.eks. hvis en nyhed har thePage = 1, og forsiden på hjemmesiden har ID=1, så skal den vise nyheden dér.
Samtidigt skal jeg så lige lave en slags statistik over hvor meget nyhederne er blevet vist og selvfølgelig hvornår... Men hvad er den smarteste løsning, rent database- og resourcemæssigt?

Hvis jeg skulle lave det uden hjælp lige nu, så ville jeg lave en ekstra tabel med felterne:
* id
newsID
thePage
visited (datetime)
Og når jeg så loopede igennem nyhederne der skulle vises på den aktuelle side, så ville jeg køre en SQL der indsatte data i statistiktabellen. Umiddelbart virker det for mig som noget der kunne gå ned hvis nu der var 1000 der så på hjemmesiden samtidigt. Meget optimistisk, I know, men man kan jo ligeså godt lære at optimere. :-D

Hvad siger MS SQL hajerne?
Avatar billede hrc Mester
28. juni 2007 - 00:18 #1
Var det ikke bare at smække en trigger på din news-tabel så den automatisk indsatte en record i statistik-tabellen når recorden blev hentet?
Avatar billede donkazz Nybegynder
28. juni 2007 - 08:08 #2
Det lyder smart, men hvordan siger du man gør det? :-D
Avatar billede hrc Mester
28. juni 2007 - 09:27 #3
Det kan man desværre alligevel ikke. Var lidt for hurtig der. Eneste undskyldning er at det var sengetid. En trigger kan kun bruges på de tre manipulerende operationer insert, update og delete. Jeg søger videre. Hvilken database bruger du?
Avatar billede donkazz Nybegynder
28. juni 2007 - 09:29 #4
Uhm.. MS SQL?
Avatar billede hrc Mester
28. juni 2007 - 09:42 #5
Åh ja, så meget forstod jeg. Versionsnummeret var interessant. I øvrigt tror jeg ikke der bliver de store ydelsesproblemer. Du skal bare huske at pakke dine "inserts" ind i transaktioner. Det speeder tingene op betragteligt. Hvis vi tager udgangspunkt i dine 1000 brugere. De ser hver ... skal vi sige 20 nyheder? Du får så 1000 transaktioner med hver 20 inserts; i total 20000 inserts. Det skal databasen sagtens kunne håndtere.
Din største flaskehals bliver nok internetbåndbredden.
Avatar billede hrc Mester
28. juni 2007 - 09:47 #6
Måske kan "bulk insert" bruges? Den er godtnok beregnet til at indlæse datafiler, men hvem ved om den passer ind.

http://msdn2.microsoft.com/en-us/library/aa225968(SQL.80).aspx

Indgangen til MS' side om TSQL (for MSSQL 2000) er her:

http://msdn2.microsoft.com/en-us/library/aa299742(SQL.80).aspx
Avatar billede lorentsnv Nybegynder
28. juni 2007 - 13:31 #7
Hvor ofte skal du trække statistik ud af tabellen?
Det antal inserts der her er tale som, bør ikke være noge problem for en SQL Server, ihertfald ikke hvis der ikke er indexer på den tabel som du laver insert i.

Hvis du ikke har indexer på statistik tabellen, vil det selvfølgelig tage længere tid at generere statistik, afhængig af hvor stor tabellen er.

Alternativt er at have en tabel uden indexer, hvor inserts bliver lavet når brugerne besøger siden, så kan du med jævne mellemrum hente rækkerne fra denne tabel over i en tilsvarende tabel med indexer på, som er optimeret for forespørgsler.
Avatar billede donkazz Nybegynder
28. juni 2007 - 14:06 #8
Det er ikke særligt ofte der skal trækkes statistik, jeg forestiller mig det bliver max et par gange om måneden jeg vil ind og se hvilke sider der er blevet vist mest, til gengæld skal der så laves en insert i statistiktabellen hver gang en nyhed bliver vist.
Sådan som jeg havde forestillet mig, så blev der bare executet en sql med en insert hver gang en nyhed blev hevet ud og vist, men i form af min begrænsede ekspertise, ved jeg jo ikke om dette er den smarteste måde at gøre det på, derfor mit spørgsmål om der var en smartere måde.. :-D
Avatar billede lorentsnv Nybegynder
28. juni 2007 - 22:49 #9
Du bør sagtens kunne køre dine inserts. Nu ved jeg ikke hvor kraftig maskine du kører SQL på, men hvis du ikke har index på din tabel, skal du kunne lave rigtig mange tusinde inserts hver time. Hvis du har index på tabellen, tager det en del mere tid, afhængig af hvad du indekserer, og hvor mange indexer du har, til at vedligeholde disse.

Når du kun skal lave statistik nogle gange om måneden, ville jeg vurdere at heller lave en kørsel som trækker statistik data over i en anden indekseret tabel, således at du til rapportering kan bruge indexer som passer til dette formål.

Du kan eventuelt køre et job hver gang, som overfører dagens statistik til en anden tabel, og samtidig tømmer tabellen uden indexer.
Avatar billede donkazz Nybegynder
29. juni 2007 - 08:19 #10
Jeg tror ikke jeg er helt med på den snak om indexer.. :-) Hvad er et index?
Avatar billede lorentsnv Nybegynder
29. juni 2007 - 12:22 #11
Du lægger index på bestemte kolonner i tabel, for at kunne søge data hurtigere. Hvis du ikke har indexer i din tabel, skal databasen læse hele tabeleln igennem, hver gang du søger efter data. Det betyder ikke så meget, når du har små tabeller.

Men hvis du har store tabeller, med mange tusinder rækker, vil det kunne betyde ret meget om du søger på et felt som er indexeret. På rigtig store tabeller, med flere/mange millioner records, kan det tage mange minutter at søge efter data, hvis du ikke har index, hvorimod med index, vil du kunne søge efter data på splitsekund.

Uden at gå i dubden med forklaring, så har en index samme funktion som index har i en bog. Hvis det du søger i, finde i indexet, kan du hurtig finde det frem. Hvis det ikke er i indexet, skal du i princippet kigge hele bogen igenne, før du er sikker på at du har fundet alle steder hvor det du søger efter er beskrevet.

Indexer kan have meget stor positiv efftekt når du skal læse data, men påvirker også negativt når du ændrer data som er indekseret, eller indsetter nye data. Når du indsetter nye data i en tabel med indexer på, vil arbejdet med at skrive data ned i tabellen kun være en minimal del af arbejdet databasen har ved at vedligeholde indexet.
Avatar billede donkazz Nybegynder
29. juni 2007 - 12:42 #12
Okay det lyder faktisk ret interessant.. Så forstår jeg bedre det med at det var smartere at lave index på en statistiktabel man bare hev data over i når man skulle bruge det, men jeg tror faktisk at jeg bare kører med de nu mange millioner records og ser hvad der sker, ellers vender jeg tilbage..

Gider du evt. smide et link til noget mere dybdegående om index på MS SQL og så et svar? så er der point dén vej
Avatar billede lorentsnv Nybegynder
29. juni 2007 - 14:11 #13
Avatar billede lorentsnv Nybegynder
30. august 2007 - 09:38 #14
Måske på tide at lukke spørgsmålet ;-)
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