Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/06/2011, 10h48   #1
Modérateur
 
Homme
Chef de projet NTIC
Inscription : avril 2007
Messages : 1 782
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 1 782
Points : 2 764
Points : 2 764
Par défaut Suppression de masse sans curseur

Bonjour à tous,

je me frotte à un problème que je ne parviens pas à résoudre seul. Je fais donc appel à vous.
Je dispose d'une procédure stockée de suppression d'objets dans plusieurs tables liées.
Cette procédure stockée prend un paramètre en entrée.
Je veux procéder à une suppression de masse en utilisant cette procédure stockée mais si possible sans curseur car les performances sont vraiment mauvaises (je suis sur plusieurs centaines de milliers d'itérations).

Voilà comment je procède par curseur :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
DECLARE @ID uniqueidentifier
DECLARE BadCursor CURSOR FOR 
SELECT t.[ID] FROM [dbo].[MATABLE] t WHERE t.[CONDITION] = 1
FETCH NEXT FROM BadCursor INTO @ID
WHILE (@@fetch_status <> -1)
	BEGIN  
		EXEC MaProcedureStockee @ID
	END
	FETCH NEXT FROM BadCursor INTO @ID
END
CLOSE BadCursor  
DEALLOCATE BadCursor
Je souhaite si possible conserver l'appel à la procédure stockée utilisée dans le curseur car c'est elle qui s'occupe de la suppression et elle a été validée.

Existe-t-il un moyen de procéder autrement ? Si oui, pourriez-vous me guider ?

D'avance merci et bonne journée
calagan99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 10h58   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 774
Points : 17 774
L'utilisation des curseurs à quelque niveau que ce soit est totalement contre performant. En effet une requête est optimisable. Pas un code itératif...
En gros avec le curseur vous faite devenir le temps de traitement exponentiel alors qu'avec un e requête et les index qui vont bien vous êtes logarithmique...
Lisez l'étude de elsuket sur le sujet : http://blog.developpez.com/elsuket/p...ecution-entre/

Donc, il suffit de faire des requêtes DELETE avec sous requête. Exemple
Tables : T_CLIENT_CLI, T_FACTURE_FAC, T_LIGNE_FACTURE_LIF

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TRIGGER E_D_CLI
ON T_CLIENT_CLI
FOR DELETE
AS
-- suppressions dans lignes de facture
DELETE FROM T_LIGNE_FACTURE_LIF
WHERE  FAC_ID IN (SELECT FAC_ID
                  FROM   T_FACTURE_FAC
                  WHERE  CLI_ID IN (SELECT CLI_ID
                                    FROM   deleted));
IF @@ERROR <> 0 
   GOTO LBL_ERROR;
-- suppressions dans factures
DELETE FROM T_FACTURE_FAC
WHERE  CLI_ID IN (SELECT CLI_ID
                  FROM   deleted));
IF @@ERROR <> 0 
   GOTO LBL_ERROR;
 
RETURN;
 
LBL_ERROR:
ROLLBACK TRANSACTION;

Une autre façon est de mettre des FOREIGN KEY en mode delete cascade, ce qui ira encore plus vite que la solution par trigger (à des très rares exceptions près, les contraintes sont toujours plus rapide que des triggers).

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/06/2011, 11h59   #3
Modérateur
 
Homme
Chef de projet NTIC
Inscription : avril 2007
Messages : 1 782
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Chef de projet NTIC
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 1 782
Points : 2 764
Points : 2 764
Frédéric,

merci pour votre réponse.
J'ai procédé comme vous me le conseillez et ai donc abandonné ma procédure stockée.
Je fais en fait les suppressions dans les mêmes tables que cette dernière, mais le tout par requête directe.

Merci pour votre aide.
calagan99 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h07.


 
 
 
 
Partenaires

Hébergement Web