Vraag Hoeveel records kan ik opslaan in een Sql-servertabel voordat deze lelijk wordt?


ik ben gevraagd om een ​​aantal prestatietests voor een nieuw systeem uit te voeren. Het draait maar net met een paar clients, maar omdat ze verwachten te groeien, zijn dit de getallen waarmee ik werk voor mijn test:

200 clients, 4 jaar gegevens en de gegevensveranderingen per .... 5 minuten. Dus elke 5 minuten voor elke klant is er 1 record. Dat betekent 365 * 24 * 12 = 105.000 records per klant per jaar, dat wil zeggen 80 miljoen records voor mijn test. Het heeft één FK naar een andere tabel, één PK (uniqueidentifier) ​​en één index op de clientID.

Is dit iets waar SqlServer om lacht omdat het hem niet bang maakt, wordt dit teveel voor één quad core 8 GB machine, is dit aan de rand, of .....

Heeft iemand enige ervaring met dit soort nummers?


23
2018-05-07 11:54


oorsprong


antwoorden:


Veld PK moet zo klein mogelijk zijn en niet willekeurig zijn - GUID is hier niet genoeg. De belangrijkste problemen zijn:

  • De PK wordt gebruikt in alle externe sleutels om naar de rij te verwijzen, dus een grote PK gebruikt meer ruimte? = Meer IO.
  • Een willekeurige PK betekent dat invoegingen overal plaatsvinden = veel paginasplitsingen = inefficiënt indexgebruik.

Hoe erg is dat? Ik weet dat je in sommige scenario's 80% snelheid verliest.

Anders - geen probleem. Ik heb een tafel van meer dan 800 miljoen rijen, en dingen zijn daar supersnel;) Natuurlijk moet je fatsoenlijke vragen hebben, fatsoenlijke indices en natuurlijk draait dat niet op een enkele groene harde schijf van 5400 RPM om efficiënt te zijn - maar gezien de juiste IO en geen stomme zoekopdrachten en enkele behoorlijke indices, SQL telt niet op een paar miljard rijen.

Dus, terwijl "het er van afhangt", is het algemene antwoord dat grote tafels geen probleem zijn ... ... tenzij u MASS verwijdert. Het verwijderen van de helft van de tabel zal een ENORME transactie zijn, vandaar dat partitioneren leuk is voor zaken als boekhouding - één partitietabel per jaar betekent dat ik een jaargegevens kwijt kan zonder een DELETE-statement;)


27
2018-05-07 12:17



De software kan het aan, kan je server? Goed, het hangt er van af.

Ben je het alleen aan het archiveren? Natuurlijk krijg je honderd miljard rijen, het maakt niet uit, de prestatieproblemen komen binnen en je ondervraagt ​​de gegevens. Hoe groter het wordt, hoe meer ruimte u nodig hebt in termen van totale opslag en voor bewerkingen (verwijderingen, rollback-segmenten, enz.) Op die gegevens, bij voorkeur in het geheugen maar op een snelle tempdb-schijf indien niet.

Wat belangrijker is voor een SQL-server dan processor op grote gegevenssets (hoewel de processor zeker van invloed is op de tijd het duurt, niet de drempel van query / gegevens die het aankan) is geheugen en ruimte (zowel HD als RAM omdat het zal overlopen naar TempDB voor grote operaties), dit spreekt in termen van capaciteit. Voor prestatie je hebt schijf-IO nodig, geheugen en processorvermogen allemaal bij elkaar.

Het korte antwoord kan het aan Ja, op voorwaarde dat je voldoende ruimte hebt. Behandelt het het snel genoeg? Dat is afhankelijk van wat voor soort zoekopdrachten u uitvoert en hoeveel prestaties ertoe doen.

Nog een ding, vergeet niet om hier andere vragen te bekijken over het optimaliseren van grote tabellen.


10
2018-05-07 12:01



SQL Server heeft geen problemen met het opslaan van zoveel records.

Als u uw indexen correct hebt ontworpen en uw database correct is genormaliseerd, heeft u absoluut geen probleem om toegang te krijgen tot een willekeurig aantal records. Vaak maken mensen in een vroeg stadium slechte ontwerpbeslissingen wanneer hun database geen informatie bevat en u weet het nooit, omdat alles is snel voor kleine "n".

Dus hoewel ik zal zeggen dat SQL Server kan omgaan met wat je doet, zou ik dat ook zeggen nu zou het een goed moment zijn om achterover te leunen en te kijken hoe uw vragen presteren met SQL Server Profiler. Is alles nog steeds snel? Ziet u excessief scannen of hashen in uw veelgestelde vragen, wat leidt tot verminderde prestaties? Als dat het geval is, is dit het moment om die problemen te analyseren en op te lossen.


Terzijde, mensen willen graag denken aan groottebeperkingen op basis van het aantal rijen en kolommen. Probeer een stap verder te gaan en over te praten bytes, omdat bytes uiteindelijk worden gescand in een rapportquery en bytes worden opgeslagen op schijf.


8
2018-05-07 12:10



Te veel echt. Ik ben verantwoordelijk voor een website met 2 miljoen geregistreerde gebruikers.

Sommige van onze tabellen hebben meer dan 100 miljoen records en we kunnen geweldige prestaties behalen met 4 miljoen dagelijkse pageviews, maar ik moet toegeven dat caching met een goede architectuur de belangrijkste reden is dat dingen niet lelijk worden.


5
2018-05-07 12:02



Als je op zoek bent naar ultieme hoge prestaties, zou ik de PK zo ontwerpen dat hij geen unieke identificatie is. Als u gegevenssets wilt samenvoegen, zou ik een INT-IDENTITY + SMALLINT (of zelfs een piepklein) gebruiken om de oorspronkelijke locatie te bepalen. U zegt niet veel over uw ontwerp, maar er zijn problemen met het gebruik van uniqueidentifier als een geclusterde index.

Gezien de juiste serverhardware doen de meeste fatsoenlijke ontwerpen het prima. Plan niets anders dan het besturingssysteem en de SQL Server op de server. De grootste zorg is RAM, voor de beste prestaties heb je genoeg RAM nodig voor de hele database, indicaties, enz., En dat is meer dan wat het besturingssysteem zal gebruiken. Ik heb zelfs enorme servers zien helpen slechte ontwerpen erg goed te laten werken.


4
2018-05-07 12:05



SQL Server kan gegevens van terrabytes verwerken. De kicker is dat je een goed ontwerp hebt en de juiste apparatuurmix hebt. Mogelijk hebt u partitionering nodig bijvoorbeeld. Je moet absoluut nadenken over elke milliseconde van de prestaties bij elke vraag en vermijd slecht presterende ontwerpen en query-technieken zoals EAV-tabellen en gecorreleerde subquery's en cursors en "zoals '% sometext%'".

Als u verwacht dat uw database zo groot is, koop en lees dan om een ​​boek te coveren over het afstemmen van prestaties voordat u het ontwerp start. Slecht ontwerp doodt databaseprestaties en het is uiterst moeilijk om te corrigeren als je eenmaal 80.000.000 records hebt.

Ik stel ook voor dat je een dba vindt met ervaring met high-performance databases met een hoog volume. Dit is een geheel nieuwe game-ontwerpwijze en het moet vanaf het begin worden uitgezocht.

Goed voor u om dit soort testen nu te doen voordat het systeem dat aantal records heeft.


3
2018-05-07 17:45



Zelfs MS Access kan lachen om een ​​tafel van een half miljoen rijen (afhankelijk van de rijgrootte).

Als je geen vragen hebt om te profileren, denk dan aan de tabel als een bestand. De rijen zijn niet het belangrijke getal in vergelijking met de sp_spaceused.

Als u vragen heeft, beschouw de tabel dan als een gegevensstructuur. Hoe kan aan de vraag worden voldaan met de minimale hoeveelheid IO. Gebruik het queryplan en SET STATISTICS IO ON


2
2018-05-07 12:21