Beste antwoord
Tafels voor bussen is een baan in een restaurant. Het betekent de tafel tussen klanten schoonmaken. Dit omvat het verwijderen van alle vuile of gebruikte items (borden, bestek, servetten) en het vervolgens afvegen van de tafel.
De traditionele functietitel hiervoor is hulpkelner, maar niet iedereen die dit werk doet, is een jongen . Er is nu misschien een meer sekseneutrale term voor.
Antwoord
In het scenario dat u beschrijft, stelt u dat de meest gebruikte velden in de tabel de primaire sleutel zijn (CompanyId ), een enkel gegevensveld (CompanyName) en een externe sleutel (IndustryId). Als er indexen zijn voor deze velden, wat gegarandeerd is voor de primaire sleutel, en zeer waarschijnlijk voor de externe sleutel, omdat anders uw databaseprestaties slecht zouden zijn, dan zal in veel gevallen worden voldaan aan vragen die alleen naar deze velden verwijzen volledig uit de indexen . De databasepaginas zelf worden niet gelezen. U kunt dit zelf controleren door een query-uitvoeringsplan op te vragen bij de queryanalysator. Als het uitvoeringsplan een index seek of index spool gebruikt, dan gebruikt het een index om de queryresultaten samen te stellen. Als de primaire sleutelindex geclusterd is, is de situatie enigszins anders, maar ik laat het aan u om te onderzoeken wat een geclusterde index is in SQL Server en hoe deze de manier verandert waarop de database wordt opgeslagen en geopend. Over het algemeen geldt dat als SQL Server een resultatenset kan samenstellen met behulp van gegevens uit een index, het dat zal doen in plaats van de databasetabelpaginas te gebruiken, omdat dat betekent dat er minder gegevens worden gelezen. Een index is identiek gestructureerd aan een tabel, behalve dat het alleen de kolommen bevat die in de index zijn gespecificeerd, plus een rijlocatorveld dat een verwijzing is naar waar de rij is opgeslagen; die aanwijzer (24 bytes) is doorgaans kleiner dan de rijgegevens zelf en dus passen er bijna altijd meer indexentabelrijen dan tabelrijen in een databasepagina.
De databasepagina-grootte in SQL Server is vastgesteld op 8192 bytes. 96 bytes van de pagina worden gebruikt voor een koptekst; dit plus andere overhead zorgt voor een maximale rijgrootte van 8060 bytes. SQL Server 2008 staat echter toe dat varchar-, nvarchar-, varbinary- en sql\_variant-kolommen deze limiet overschrijden, en zal deze velden naar overlooppaginas verplaatsen wanneer hun opname in een rij ertoe zou leiden dat een rij deze limiet voor de rijgrootte overschrijdt. Tekst, ntext, afbeelding, nvarchar (max), varchar (max), varbinary (max) en xml-kolommen worden ook altijd op afzonderlijke paginas opgeslagen, ongeacht hoeveel gegevens er daadwerkelijk in de kolom zijn opgeslagen. De tabeldefinitie die je hebt gepost, toont de totale kolombreedtes die de limiet van 8060 bytes ver overschrijden, maar het meeste hiervan bevindt zich in varchar (n) -velden, dus je zult eindigen met rijoverlooppaginas voor rijen waarvan de werkelijke grootte van de variabele breedte kolommen is voldoende groot. Het aantal paginas dat een rij in deze tabel gebruikt, zal daarom variëren, afhankelijk van hoe lang de feitelijk opgeslagen gegevens in de kolommen met variabele breedte voor elke rij zijn.
In termen van prestatieverbetering: als u maar een paar velden heeft die vaak worden gebruikt, kunt u waarschijnlijk net zoveel verbetering krijgen door ervoor te zorgen dat velden en combinaties van velden die u vaak gebruikt, beschikbaar zijn als indexen. Dit betekent dat de meeste rijensets kunnen worden gevuld met indexgegevens in plaats van tabelgegevens, waardoor problemen met het laden van grote rijen uit de database worden voorkomen. Het beste van alles is dat dit volledig op DBA-niveau kan worden gedaan; de toepassing hoeft niet te worden herschreven om de wijziging in het schema weer te geven die wordt veroorzaakt door het toevoegen (of verwijderen) van indexen. En uiteraard moet elke kolom die u als onderdeel van een join gaat gebruiken, worden geïndexeerd; anders doet u dat tabelscans voor die joins die inderdaad behoorlijk traag zijn.
Ik zou kunnen voorstellen dat je ntext in plaats van grote nvarchar-velden overweegt voor sommige van die grotere velden, hoewel dit mogelijk wijzigingen in de applicatiecode vereist omdat de semantiek van tekst / ntext zijn anders dan die van varchar / nvarchar. Tekst- / ntekstkolommen worden altijd opgeslagen in LOB-paginas, in plaats van voorwaardelijk opgeslagen in de rijgegevenspagina, en als deze kolommen vaak aanwezig zijn en van gemiddelde grootte (bijvoorbeeld , 1000-2000 bytes). Door ze op te slaan als tekst / ntext, blijft de rest van de rijgegevenspaginas kleiner en kunnen er meer rijen per pagina zijn, waardoor tabelscans worden versneld die niet echt naar deze kolommen hoeven te verwijzen.