Rechercher : dans
Par :

SQL - Optimisation

Dernière réponse le 20 nov 2008 à 15:57:30 sebv33, le 20 nov 2008 à 11:20:28 
 Signaler ce message aux modérateurs

Bonjour,

je suis une brêle en SQL.

dans un trigger sous Oracle j'ai deux requêtes à la suite:

UPDATE magasin mag
SET mag.dernier_statut = :new.CDSTATUT ,
mag.lb_statut = :new.LBSTATUT
WHERE mag.CODE_COMPLET = (substr(:old.LBSTATUT, 27, 20) );

et

select mag.region_fk
INTO region_id
from magasin mag
where mag.CODE_COMPLET = (substr(:old.LBSTATUT, 27, 20) );


CODE_COMPLET est VARCHAR et il y a un index dessus.


Je dois l'optimiser et il y a quelques questions que je me (vous) pose.

- serait-il plus rapide d'effectuer les deux recherches sur la clé primaire de MAGASIN?
- y a-t-il un moyen de ne pas rechercher deux fois la même ligne (une fois pour un update et une fois pour un select)? Si oui, cela améliorerait les performances?

Merci pour votre aide

Meilleures réponses pour « SQL Optimisation » dans :
SQL - Création de table Voir Le SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
MySQL – Optimisation VoirL’optimisation au niveau de MySQL passe par trois composants, à savoir : Optimisation du serveur MySQL Optimisation de la base de données Optimisation des requêtes Optimisation de la configuration de serveur MySQL L’optimisation du serveur peut...
Gestion des paramètres SQL VoirSQL présente un certain nombre de paramètres au niveau d'Oracle qu'il est possible de visualiser à travers la commande : SHOW ALL Pour modifier la valeur d'un paramètre il suffit d'utiliser la commande : SET NOM_PARAM VALEUR
Le langage SQL VoirQu'appelle-t-on SQL? SQL (Structured Query Language, traduisez Langage de requêtes structuré) est un langage de définition de données (LDD, ou en anglais DDL Data Definition Language), un langage de manipulation de données (LMD, ou en anglais DML,...
SQL - Commande SELECT VoirLe langage de manipulation de données Le SQL est à la fois un langage de manipulation de données et un langage de définition de données. Toutefois, la définition de données est l'oeuvre de l'administrateur de la base de données, c'est pourquoi la...
SQL - Tri VoirTri des résultats Il est possible en SQL d'organiser les résultats grâce à la clause ORDER BY. La clause ORDER BY est suivie des mots clés ASC ou DESC, qui précisent respectivement si le tri se fait de manière croissante (par défaut) ou...

1

sandul, le 20 nov 2008 à 12:04:19

Salut Seb,

Moi non plus je ne suis pas très bon en optimisation Oracle, mais je crois que, même si tu as un index sur CODE_COMPLET, il peut y avoir un full table scan à cause de mag.CODE_COMPLET = (substr(:old.LBSTATUT, 27, 20) ); ==> le substr ne va pas utiliser l'index. A vérifier cet aspect, donc.

Maintenant, il est vrai que le substr fait référence à la valeur old et il importe de savoir le contexte. Il se peut que dans certains contextes Oracle puisse identifier la ligne sans faire le scan complet de la table...

Du coup, si ce que j'ai dit est vrai, tes requêtes sont pénalisantes en cas de grosse volumétrie de la table magasin. Dans ce cas, contourne (via la clef primaire, si tu peux) l'utilisation de substr sur une colonne de la table.

Si pas de full table scan: utiliser la clef primaire à la place de l'index sur CODE_COMPLET peut être plus performant à cause du fait que le nombre de clusters de lindes dépend du type de champ et de sa taille ==> une primary key sur une colonne INTEGER, par exemple, sera plus compacte en taille disque (et donc elle sera parcourue plus vite) qu'un index sur un varchar2 (300). Sinon, comme tu le sais bien, un rebuild de l'index et sa définition dans son propre tablespace (qui à son tour est définie sue un disque dur différent) peuvent bien améliorer les perfs en cas d'utilisation de l'index.

Pour répondre à ta 2ème question: oui, si tu peux éviter de rechercher 2 fois la même info c'est mieux. Une idée c'est d'utiliser un cursor dans ton trigger défini en tant que SELECT ... FOR UPDATE sur magasin ==> une fois que tu es sur la ligne tu fais UPDATE magasin WHERE CURRENT OF pour ta première requête et pour la deuxième tu as des valeurs en RAM dans le record associé au curseur ouvert (plus besoin de faire le SELECT INTO, donc).

++

Répondre à sandul

2

 sebv33, le 20 nov 2008 à 15:57:30

Merci sandul,

pour info j'ai trouvé comment effectuer une seule requête:

UPDATE magasin mag
SET mag.dernier_statut = :new.CDSTATUT ,
mag.lb_statut = :new.LBSTATUT
WHERE mag.CODE_COMPLET = (substr(:old.LBSTATUT, 27, 20) )
RETURNING mag.region_fk INTO region_id;

Répondre à sebv33
Collection CommentÇaMarche.net