Avatar billede dl Nybegynder
27. marts 2008 - 20:33 Der er 16 kommentarer og
1 løsning

MSSQL: Slet 200000 logs uden transaction

Jeg kom udfor en sjov problem stilling.

Vi har 200000+ logs som vi skal have slettet. Hvordan gør vi det ?

Vi kan ikke truncate tabellen, og vi kan ikke fortage transaction, da det skabber for meget disk IO og og tager for meget ydelse.

Kan man slå transaction fra, for en given tabel.
Vores systemadmin, mener at DELETE er transaktionelt og derfor altid vil blive brugt.

Noget det kan komme med et svar på dette? og helst også noget dokumention på dette ?

//dl
Avatar billede dl Nybegynder
27. marts 2008 - 20:35 #1
Tidligere svar på dette sp:
http://www.eksperten.dk/spm/825455

Siden jeg fik lagt det i en forkert gruppe.
Avatar billede HenrikSjang Nybegynder
27. marts 2008 - 21:12 #2
Du kan evt. slette i mindre batches. Samlet set vil IO'en vist være nogenlunde det samme, men det bliver ikke en stor intensiv klump.

Afhængigt af hvor mange rækker du har totalt, og hvor mange der er du skal slette, og hvor lang tid det må tage - så kan du evt lave et scheduleret job, der kører hvert minut (eller sjældnere), som laver følgende:

-------------------------
SET ROWCOUNT 1000
DELETE FROM dinTabel
WHERE <kriterie>
-------------------------

Hvis du bruger SQL 2005, så kan du i stedet gøre sådan her:
-------------------------
DELETE TOP (1000) FROM dinTabel
WHERE <kriterie>
-------------------------

Ved hver kørsel, slettes kun 1000 rækker, og vil dermed kunne eksekveres noget hurtigere. Hvis det er 200.000 rækker der skal slettes, og du tager det i klumper af 1000 via et minutligt job via SQL Agenten, så vil det tage små 4 timer.

Hvis situationen er, at du i dag har rigtig mange rækker i tabellen, og kun en lille del skal efterlades (fx hvis du har 2 års log, men kun skal gemme 3 måneder) - så kan det være væsentlig hurtigere og smartere, og kopiere de 3 måneders log over i en anden midlertidig tabel. Og så truncate den store tabel, og kopiere de 3 måneder tilbage. Men den ide er lidt afhængig af om tabellen er "aktiv" hele tiden, eller om du godt kan leve med at tabellen er tom i et kort øjeblik, inden du får kopieret dataene tilbage.
Avatar billede bennytordrup Nybegynder
27. marts 2008 - 21:38 #3
Hvis opgaven er at tømme en tabel fuldstænding, så kan du bruge truncate table. Denne bliver ikke logget under transaktion
Avatar billede bennytordrup Nybegynder
27. marts 2008 - 21:39 #4
Hmmm. fik ikke læst fuldstændig.

Hvorfor kan der ikke truncates??
Avatar billede HenrikSjang Nybegynder
27. marts 2008 - 21:42 #5
dl skriver i en anden tråd (den der linkes til ovenfor) følgende:

vi kan ikke truncate den :)  da vi stadig SKAL bevare 3 måneders log.
Avatar billede bennytordrup Nybegynder
27. marts 2008 - 21:53 #6
Jeg tror, du skal forfølge den løsning, kalp foreslog i den anden tråd.

Lav en select, som finder de tre måneder, der skal gemmes. Udvid derefter forespørgslen med en "insert into", så du får dem i en anden tabel. Truncate tabellen og select derefter tilbage fra backup tabellen.
Avatar billede HenrikSjang Nybegynder
27. marts 2008 - 21:56 #7
Jeg kom til at tænke på. Har I forsøgt at slette de 200.000 rækker? Umiddelbart ville jeg ikke være så nervøs for den IO det giver, samt det performance impact det giver. DOG vil DELETE'n nok kræve en table lock, som kan gøre at tabellen ikke kan tilgås i x sekunder. Hvis tabellen er "hot", dvs meget aktiv, så er dette selvfølgelig et problem.

Vend evt. tilbage med lidt mere info om hvor mange rækker der findes i tabellen, samt hvor mange der skal slettes/efterlades, og hvor "hot" tabellen er. Ligeledes kunne det være interessant at høre lidt om hvilket system databasen kører på.
Avatar billede dl Nybegynder
28. marts 2008 - 05:55 #8
Som sjang skriver: "mindre batches", og jeg tror det er det jeg gør efter.
Da vores system er bygget sådan op, at den table er MEGET MEGET "HOT" og kan på ingen måde tage en table lock i alt for langtid.

Men der må da være en løsning. Jeg ved man kan gøre disse ting i oracle, slette og slå transaction fra. Men det gæller måske ikke delete. mySQL har lidt samme funktion som oracle.

Hvad angår informationer, så har i ren faktisk selv beskrevet problemmet meget godt.

sjang >> jeg tror vist det er dit svar jeg bruger :) Så vis du lige sender mig en fakture,  så kreditere jeg med 60 point :D
Avatar billede nielle Nybegynder
28. marts 2008 - 06:54 #9
Jeg mener stadig væk at den bedste løsnin nok er at partitionere tabellen - med nogloe passende partitioer vil det være muligt at slette dele af tabellen (f.eks. det der er for gammelt) unden at det kan føles nævneværdigt på reten af systemet.
Avatar billede teepee Nybegynder
28. marts 2008 - 08:11 #10
opret en anden database med simple recovery og log i denne i stedet.
Avatar billede dl Nybegynder
28. marts 2008 - 10:44 #11
nielle >>  partitionere tablen ??  hvad mener du med det ?
Avatar billede HenrikSjang Nybegynder
28. marts 2008 - 15:27 #12
dl: at partitionere tabellen er en feature der kun findes i SQL 2005 Enterprise Edition, så hvis ikke du har den version - så er der sådan set ingen grund til at tale mere om den feature. Så derfor er det også altid en brand god ide at skrive hvilken version sql server man benytter, da mulighederne er forskellige.

Men Kimberly L. Tripp har skrevet denne artikel, der beskriver det ganske udmærket synes jeg. Artiklen fortæller om hvordan man gjorde det i ældre SQL server udgaver - via views.

Forestil dig, at du har 12 tabeller - en for januar, en for februar osv. Når du gemmer dine data, gemmer du dem i den tabel der nu er relevant. Så laver du et view ovenpå, som union'er dem alle. Når du selecter alt indhold fra view'et, får du altså indholdet fra alle dine 12 tabeller. Men view'et kan laves så smart, at hvis du kun vil selecte noget fra januar, så behøver view'et ikke selecte fra alle de andre 11 tabeller. Og det vil også sige, at hvis du vil slette al data fra januar til og med oktober, ja så kan du roligt trunkere disse 10 tabeller, og efterlade november og december tabellerne intakte.

Det er i grove træk hvad det går ud på. Det udføres i praksis anderledes end jeg lige beskrev, og er som sagt en Enterprise Edition only funktion.
Avatar billede HenrikSjang Nybegynder
28. marts 2008 - 15:28 #13
Avatar billede nielle Nybegynder
07. april 2008 - 17:55 #14
Er du kommet vidre med denne her?
Avatar billede dl Nybegynder
07. april 2008 - 19:43 #15
ja, og har også bedt sjang om svar.

det jeg har gjort er at dele den op i små bider, og så får den bare lov til at køre stille og rolig.

Et andet sp. er måske, hvor meget data skal man enlig logge... da det jo kommer til at fylde en del.
Avatar billede HenrikSjang Nybegynder
07. april 2008 - 20:16 #16
Den havde jeg sgu misset ;)

Her er et svar.
Avatar billede dl Nybegynder
07. april 2008 - 21:56 #17
hehe .. sådan kan det gå.
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