[SQL] Delete van veel gegevens

Pagina: 1
Acties:

  • foske
  • Registratie: Juli 2001
  • Laatst online: 23:24
Het probleem is als volgt:

Ik heb een MSSQL 2000 database (webapp) en deze bevat veel gegevens verspreid over verschillende tabellen. (per klant kan dit over de 100.000 records gaan in zo'n 15 tabellen. In het totaal zijn er miljoenen records verspreid over die tabellen).

Nou komt het uiteraard wel eens voor dat een klant er mee stopt, en mogen zijn gegevens weg gegooit worden. Maar, om zoveel records te verwijderen zorgt voor een lange lock op de tabellen. Nu heb ik mij al voorgenomen om dit verwijderen 's nachts te doen, maar dan nog, het proces kan aardig wat tijd in beslag nemen (4 tot 8 min zelfs) en zodra er wat weggeschreven moet worden onder de naam van die klant (ook al wordt hij verwijderd, kan dat gebeuren) kan het hele systeem niet gebruikt worden, omdat de invoer van die klant, in de wacht wordt gezet, en alle andere writes naar de tabel moeten dan achteraan de rij aansluiten.

In eerste instantie was het gewoon een delete from clienten where id = x, en de relaties alles laten afhandelen, maar dit zorge voor een timeout van het andere verkeer.
Toen heb ik geprobeerd om per tabel te deleten, en als laaste clienten. Maar hiermee werd de executietijd alleen maar langer en de lange locks bleven. (met timeouts dus)

Wat ik nog niet heb geprobeerd, is in een aparte tabel bijhouden wie er verwijderd gaan worden, en als hij daarin staat, mag een client niets meer wegschrijven, zodat hij ook de wachtrij niet kan ophouden. Dat ga ik zometeen nog proberen, maar ik vroeg mij ondertussen af of jullie misschien nog goede ideeën hebben om dit aan te pakken.

Bedankt!

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
100.000 records deleten is natuurlijk wel veel, maar dat het zo lang duurt.....

Heb je het executie - plan al eens bekeken van die DELETE query ?

https://fgheysels.github.io/


  • foske
  • Registratie: Juli 2001
  • Laatst online: 23:24
Net gedaan, maar ik moet eerlijk bekennen dat ik hiermee nooit een ster ben geweest. maar zo te zien heeft hij veel 'problemen' met de indexes (voornamelijk de clustered indexes, cost: 45850%).

Zal eens kijken of die speciale tabel wat gaat uitmaken, hoop het wel, maar verder niet 'een algemene tip bij deletes?'

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:52
Dat verklaart al een hoop.
Een clustered index bepaalt de fysieke opslagvolgorde van de reords in je tabel. Dat wil dus zeggen dat, als je een record verwijderd uit een tabel met een clustered index, de records ahw opnieuw gegroepeerd moeten worden.
Je kan dus eens proberen om die clustered indexes non-clustered te maken, en kijken hoe lang het dan duurt.
Een clustered index is vooral interessant als je hem op een veld plaatst dat je gebruikt om 'range-selects' te doen, en als dat veld niet of nauwelijks onderhevig is aan wijzigingen.

https://fgheysels.github.io/


  • foske
  • Registratie: Juli 2001
  • Laatst online: 23:24
Ik zal mijn idexes weer eens onder de loop nemen, is lang geleden :)