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 :
Le langage SQL Voir Qu'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 - éviter les doublons dans un SELECT VoirProblème Comment éviter les doublons dans les résultats d'une requête SQL ? Solution Il suffit d'utiliser la clause DISTINCT entre SELECT et les champs. Exemple : SELECT distinct id,nom,prenom FROM matable Plus d'informations ...
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...
Sauvegarde automatique d'une BDD sous SQL EXPRESS 2005 VoirSi vous vous voulez automatiser une sauvegarde d'une base de données sous SQL server express, il existe une solution simple grâce à un fichier .bat. Créez un nouveau fichier texte. Ce fichier doit contenir les informations suivantes: SET...
Télécharger MS SQL Migrate VoirPour des raisons pratique ou quasiment professionnel, il est nécessaire de convertir des bases de données entre différents formats. Le principal, c’est qu’il n’y ait aucune perte de donnée lors de la conversion. MS SQL Migrate est...
SQL - Création de table VoirLe 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...
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...
PL/SQL - Introduction au langage PL/SQL VoirIntroduction au langage PL/SQL Le langage PL/SQL est un langage L4G (entendez par ce terme un langage de quatrième génération), fournissant une interface procédurale au SGBD Oracle. Le langage PL/SQL intègre parfaitement le langage SQL en lui...

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