Flux rss
Communiquer en entreprise avec les outils Google
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

SQL - Optimisation

sebv33, le jeudi 20 novembre 2008 à 11:20:28
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
Répondre à sebv33  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sandul, le jeudi 20 novembre 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


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 sebv33, le jeudi 20 novembre 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

Résultats pour SQL Optimisation

PL/SQL - Introduction au langage PL/SQL Introduction 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... www.commentcamarche.net/contents/plsql/plsqlintro.php3
Le langage SQL 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,... www.commentcamarche.net/contents/sql/sqlintro.php3
SQL - Création de table 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... www.commentcamarche.net/contents/sql/sqlcreate.php3

Résultats pour SQL Optimisation

Compacter les bases SQLite de Firefox 3SQLite ? Firefox 3 utilise des bases de données SQLite pour stocker l'historique, les marque-pages, le système anti-phishing, etc. SQLite est une base de données très performante. Cela permet d'offrir d'excellentes performances, des recherches... www.commentcamarche.net/faq/sujet-11807-compacter-les-bases-sqlite-de-firefox-3
Interfaces graphiques pour SQLiteSQLite est un formidable moteur de base de données, ne nécessitant pratiquement aucune administration, portable (tous systèmes) et accessible de pratiquement tous les langages (C, C++, Java, Python...). Contrairement à mySQL, il ne nécessite pas... www.commentcamarche.net/faq/sujet-11003-interfaces-graphiques-pour-sqlite

Résultats pour SQL Optimisation

[VB .NET 2005] Lire les données de SQL Server (Résolu)Bonjour, Je développe une me permettant d'ajouter, de supprimer et de rechercher des éléments dans une base de données SQL Server. L'ajout des données est réalisé. Par contre la recherche de données et leur affichage m'échappe. Dans une... www.commentcamarche.net/forum/affich-2280156-vb-net-2005-lire-les-donnees-de-sql-server
[SQL] INSERT ou UPDATE suivant le cas... (Résolu)Bonjour à tous, Comment faire dans une requete SQL (sous Oracle9i), pour insérer un enregistrement si celui-ci n'est pas dans la Table, ou le modifier si celui-ci est présent. Sans bien sûr faire de SELECT avant, je crois qu'il existe une... www.commentcamarche.net/forum/affich-2154488-sql-insert-ou-update-suivant-le-cas
Excel et base de données SQL server (Résolu)Bonjour, Je souhaiterai apprendre à programmer en VBA depuis Excel pour aller en lecture/écriture dans une base de donnée SQL Serveur. Existe-t-il un tutorial, un site ou un livre qui me permettrait de me former. Je suis autodidacte en informatique...... www.commentcamarche.net/forum/affich-4444773-excel-et-base-de-donnees-sql-server

Résultats pour SQL Optimisation

SQL - Commande SELECTLe 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... www.commentcamarche.net/contents/sql/sqlsel.php3
SQL - TriTri 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... www.commentcamarche.net/contents/sql/sqltri.php3
SQL - JointuresExpression des jointures Une jointure (ou θ-jointure) est un produit cartésien de deux tables. On appelle équijointure une θ-jointure dont la qualification est une égalité entre deux colonnes. En SQL, l'expression d'une jointure se... www.commentcamarche.net/contents/sql/sqljoint.php3