Précédent   Forum des professionnels en informatique > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
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 16/06/2006, 14h01   #1
Invité de passage
 
Inscription : janvier 2006
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 7
Points : 2
Points : 2
Par défaut [ASE 12.5.1] Performances sur SELECT et DELETE

Bonjour,

J'ai une proc.stockée qui traite une table sur laquelle je souhaite supprimer des enregistrements si ils existent. Les index sont OK.

J'ai donc tenté un :

Code :
DELETE FROM tb WHERE Champ1=X AND Champ2=Y
Le problème, c'est si les lignes concernées n'existent pas dans la table, autrement dit un :

Code :
SELECT COUNT(*) FROM tb WHERE Champ1=X AND Champ2=Y
renvoie 0.

Dans ce cas là, le DELETE prend 3 fois plus de temps à s'executer que de tester si les lignes existent dans un IF.

Autrement dit, dans le cas ou des lignes existent, il sera plus rapide de faire un DELETE FROM direct . Dans le cas où les lignes n'existent pas, il sera plus rapide de faire un IF pour tester si les lignes existent, et comme ce n'est pas le cas, le temps passé sera juste celui du SELECT.

Voyez-vous une explication technique ? Et que me conseillez-vous sachant que les 2 cas ont environ autant de chances de se produire (lignes déjà présentes / lignes absentes).

Merci pour vos avis
zayro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2006, 11h07   #2
Membre à l'essai
 
Inscription : février 2006
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 28
Points : 20
Points : 20
Hello,
Cela me parait tout a fait normale que le DELETE sois plus long étant donné que tu supprimes des valeurs (suppression dans la table + mise à jour de l'index)
Donc je pense que le meilleur compromis reste:


IF EXISTS (SELECT COUNT(1) FROM tb WHERE Champ1=X AND Champ2=Y)
DELETE FROM tb WHERE Champ1=X AND Champ2=Y
go
SQL972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/06/2006, 11h17   #3
Membre à l'essai
 
Inscription : février 2006
Messages : 28
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 28
Points : 20
Points : 20
Tu peux aussi t'aider de la commande:
set showplan on -- Affiche le plan d'exécution de la requête
set showplan , noexec on -- n'exécute pas la requête

SQL972 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 22h53   #4
Membre du Club
 
Inscription : octobre 2005
Messages : 79
Détails du profil
Informations personnelles :
Âge : 32

Informations forums :
Inscription : octobre 2005
Messages : 79
Points : 46
Points : 46
Vous pouvez en plus du plan d'exécution regarder la consommation en i/o.

Avec l'option :

set statistic io on
-- Requêtes
set statistic io off
go

Le but étant de réduire également la consommation en io.
lsone est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h15.


 
 
 
 
Partenaires

Hébergement Web