Salut,
Ceci ne sont que mes propres conclusions, suite à quelques recherches sur le net (sans réel succès) de pratiques d'optimisation.Tout d'abord je tiens à préciser que ce que je vais expliquer n'est pas (ou dangereusement) appliquable à des supression d'enregistrements auxquels fonrt référence (par une clé étrangère) d'autres enregistrements.
Je précise aussi qu'une (trop) grande complexité peut apparaître lorsque l'on manipule des tables avec des colonnes autoincrémentées (identity).
Ce que je vais donc raconter ne concerne que pour les cas (pas forcément moins fréquents) de tables d'autres natures.
Suprimer des enregistrements selon des critères particuliers (par exemple : est-ce que ma clé primaire apparient à telle sous liste) peut s'avérer hélas étonnament lent.
Et j'ai finit par me rendre compte qu'il pouvait être préférable de réduire les conditions de suppression un maximum et de réintroduire (insert) les enregistrements qui n'aurait pas du être supprimés.
Ce procédé est soumis à la lourde restriction qu'il soit possible de copier/retrouver les enregistrements à ne pas perdre lors de la supression grossière.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 // raw_result sont des éléments présents dans la table que je ne souhaite pas supprimer DECLARE @raw_result AS TABLE [...] INSERT @raw_result [...] /* Je souhaite supprimer tous les enregistrement de GroupID 5 qui ne sont pas dans @raw_result Mais je procède plutôt à une suppression grossière suivie d'une réinsertion plutôt que de faire un supression ciblée */ DELETE FROM MaTable WHERE GroupID = 5 INSERT MaTable ( GroupID [...] ) SELECT 5 , [...] FROM @raw_result AS RAW WHERE RAW.GroupID = 5
Ma conclusion est qu'une série de supressions et insertions aux conditions simples peuvent être bien moins coûteuses en terme de temps d'excécution qu'une seule opération dont la conditions est un tant soit peu complexe.
Et j'ai pu observer des diminution de temps d'excécution de l'ordre de 3-10 fois.
Partager