2010-01-04 9 views
0

Mon problème est que j'ai besoin de supprimer environ 60M enregistrements d'une table sans causer d'interblocages avec d'autres processus qui utilisent cette table. À ce stade, j'ai presque terminé de supprimer les enregistrements en utilisant une boucle while qui ne traite que des enregistrements de 1M à la fois, mais il est pris toute la journée. Q1: Quelle est la meilleure façon de supprimer de grandes quantités de données d'une table, en gardant la table en ligne et un impact minimal sur les autres ressources qui ont besoin d'utiliser cette table dans MS SQL Server 2005? Q2: Existe-t-il un moyen d'implémenter le verrouillage de ligne individuel (plutôt que le verrouillage de table) dans SQL Server comme dans Oracle? (Notez que répondre à cela peut répondre à Q1). A2: Alors que @Remus Rusanu m'a informé il ya un moyen de faire row level locking avec une suppression.SQL Server 2005 efficace supprimer

Répondre

2

Voir ce thread, l'affiche originale a fait quelques tests et a affiché la méthode la plus efficace. À l'origine, un MVP était doté d'une option permettant d'insérer les données que vous souhaitez conserver dans une table temporaire, puis de tronquer la table d'origine et de les réinsérer.

+0

J'aime ça. La prochaine fois que je dois faire quelque chose comme ça, je dois essayer. –

+0

Nous prévoyions initialement déplacer les enregistrements à conserver dans une nouvelle table. Cependant, les tests ont montré que le temps de reconstruire les index à partir de zéro serait trop élevé. –

+0

Je le fais régulièrement et ça fonctionne comme un charme. Bien mieux que de supprimer un grand nombre de lignes. –

1

Je viens de faire quelque chose comme ça récemment. J'ai simplement créé un travail SQL Server qui s'exécutait toutes les 10 minutes en supprimant un million de lignes. Le code suit

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 
DELETE TOP 1000000 FROM BIG_TABLE WHERE CreatedDate <= '20080630' 

Cette table en question avait environ 900 rangées de mil pour commencer. N'a pas remarqué de problèmes de performance significatifs.

+0

Donc le script que j'ai écrit supprime des données de beaucoup de tables (la plupart d'entre elles n'ont qu'un seul enregistrement) dois-je le déclarer une fois après le BEGIN TRAN ou dois-je le mettre par chaque instruction delete dans mon script ? –

+0

Avant la BEGIN TRANSACTION. PAR exemple REGLER LE NIVEAU D'ISOLATION DE TRANSACTION LECTURE NON ADMISE; SUPPRIMER TABLEAU A TABLEAU B SUPPRIMER COMMIT TRAN SET TRANSACTION NIVEAU ISOLEMENT YOUR_ORIGINAL_LEVEL –

1

Le moyen le plus efficace consiste à utiliser la commutation de partition, voir Transferring Data Efficiently by Using Partition Switching. L'inconvénient est qu'il nécessite une planification à l'avance dans la façon dont les partitions sont déployées.

Si la commutation de partition n'est pas disponible, la réponse dépend du schéma de table réel. Il vaut mieux poster le schéma actuel (y compris tous les index et surtout la définition de la clé en grappe) et les critères qui qualifient les candidats supprimés.

Comme pour Q2, SQL Server avait le verrouillage de niveau de ligne depuis le milieu des années 90, je ne sais pas ce que vous demandez réellement.

+0

Si u downvote, expliquer pourquoi –

+0

SQL Server a niveau de la page de verrouillage non verrouillage de ligne de niveau. http://download.oracle.com/docs/cd/E12151_01/doc.150/e12156/ss_oracle_compared.htm –

+2

Je vous recommande de vous en tenir à la documentation MSDN pour les fonctionnalités de SQL Server, pas à celles d'Oracle.Voir http://msdn.microsoft.com/en-us/library/ms189849.aspx et http://msdn.microsoft.com/en-us/library/ms189286.aspx pour connaître les modes de verrouillage disponibles dans SQL Server. Même le document marketing Oracle que vous liez indique que 'SQL 7.0 possède un verrouillage au niveau des lignes' et fait référence à SQL 7 depuis 1997. La version actuelle est 10.5 (2008 R2) et le mode de verrouillage par ligne est le mode par défaut de SQL Server depuis SQL 2000 (c'est-à-dire SQL 8.0). Prendre une décision basée sur de telles informations périmées ne peut pas conduire à de bonnes solutions. Le partitionnement –