Définir la key primaire dans une très grande database

J'ai une très grande table (environ 13 millions de lignes) et je veux définir la key primaire pour les tables. Le problème est que count tenu de la grande taille de la database, mon ordinateur se bloque lorsque j'essaie de définir la key primaire pour une table.

Je suppose que SQL Server essaie de définir cette key dans chaque ligne qu'il trouve, donc la consommation de memory atteint la limite de mon ordinateur (6 Go de memory). Existe-t-il un moyen efficace et alternatif de définir la key primaire sans avoir ces problèmes?

Voici quelques options qui pourraient fonctionner:

  1. Créez une nouvelle table avec les mêmes colonnes et une key primaire et select-la dans l'autre table.
  2. Créez un script de modification et désactivez le timeout d'exécution dans SSMS

Voici un script de changement pour vous orienter dans la bonne direction:

 ALTER TABLE tableName WITH NOCHECK ADD CONSTRAINT PK_tableName PRIMARY KEY CLUSTERED (columnName) WITH (FILLFACTOR = 75, ONLINE = ON, PAD_INDEX = ON) 

Une autre option consiste à créer une nouvelle table avec la key primaire appropriée. Scindez toutes les relations autres que la structure de base de la table intial. Définissez la database en mode mono-user (afin que personne ne puisse modifier les loggings pendant que vous êtes en train de les transférer) après vous être assuré que vous disposez d'une sauvegarde en cours.

Ensuite, insérez les loggings de l'ancienne table dans bathces de dire 10000 à la fois. Il faudra plus d'une insertion basée sur un set, mais sera beaucoup less susceptible d'expirer. Vous devrez peut-être expérimenter pour find la taille de lot optimale. Lorsque vous avez terminé, supprimez l'ancienne table, renommez la nouvelle table et configurez à nouveau les relations pk / fk. Ensuite, sortez du mode mono-user.

Il s'agit d'une tâche qui ne devrait être effectuée que lors de la production pendant les heures non occupées et en tant que tâche de maintenance de la database, personne d'autre ne devrait être autorisé à accéder à la database.

Notez que vous ne pouvez pas avoir d'informations uniques sur la key naturelle de la table. Dans ce cas, vous pourriez avoir un problème si vous l'utilisez en tant que pk et devrez peut-être déplacer des loggings vers une table d'exceptions pour les corriger. Même si vous utilisez une key de surogate comme nouveau PK, je recommand fortement un indice unique sur la key naturelle de la table si possible.

Une des raisons que j'ai vu pour cela est la quantité de memory que SQL Server peut allouer est beaucoup plus grande que ce que votre machine est prête à donner et donc vous finissez par le plantage. Essayez de modifier la memory allouée à SQL Server à une empreinte de memory plus petite et voir si cela est la cause. SQL Server devrait être capable de gérer autant d'loggings, mais s'il essaye de les charger tous en même time dans la memory pour faire le travail qui pourrait causer votre problème.