Ich entwickle eine ASP.NET-Website in Visual Studio 2010 (mit Service Pack 1, vielen Dank!). Ich möchte die in .NET integrierten Membership- und Role-Provider für SQL Server 2008 nutzen.
Ich entwickle nun schon sehr lange Microsoft-Technologien und habe mit einigen der besten SQL Server-DBAs der Branche zusammengearbeitet. Jeder von ihnen hat mir gesagt, dass ich wegbleiben von GUIDS als Primärschlüssel beim Aufbau einer Datenbanktabelle, die:
- Sie haben eine sehr hohe Rekordzahl.
- Sie haben ein hohes Volumen an Einfügungen und Löschungen.
Grund: Weil der Primärschlüssel ein geclustert Index!
Dies bedeutet, dass jeder in die Tabelle eingefügte Datensatz muss gehorchen die Beschränkungen des Indexes. Wenn der Index also nach ASC sortiert ist, muss der Datensatz mit der neu generierten GUID physisch und in der richtigen Reihenfolge in die betreffende Datentabelle eingefügt werden.
Dies wäre für eine Tabelle mit nur ein paar tausend Datensätzen oder so in Ordnung. SQL Server müsste nur eine Handvoll davon neu positionieren. Wenn die Datentabelle jedoch mehrere Millionen Datensätze enthält und der neue Datensatz in Zeile 216 eingefügt werden muss, kann dies (nach Web-Standards) eine beträchtliche Zeit in Anspruch nehmen. Es muss nämlich all diese Zeilen physisch nach unten verschieben, um den neuen Datensatz einzufügen.
Meine Frage ist also einfach die folgende. Da Microsoft und alle DBS, die wir kennen und lieben, NEIN zu GUIDs als Primärschlüssel gesagt haben... warum erstellt das ASPNET_REGSQL-Tool Tabellen mit einer GUID als Primärschlüssel?
Oder übersehe ich etwas? Gibt es eine neue Funktion in der SQL Profiler-Engine in 2008, die GUIDS nicht mehr als Aufgabe sieht?