IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Oracle Discussion :

Ordre d'exécution des requêtes


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut Ordre d'exécution des requêtes
    Bonjour à tous,

    Je réalise un select sur une table pour collecter des enregistrements basé sur un marqueur de temps qui est stocké dans un champ de chaque enregistrement. Mon problème est comment être certain que pendant mon select il n'y va pas une écriture dans cette table avec ce marqueur de temps ?

    Est-ce qu'Oracle exécute les requêtes une à une ou bien en parallèle ? Si c'est en parallèle est-ce qu'il y a moyen de mettre un lock pendant mon select pour que les insertion soient faites en décalées ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Pas besoin, Oracle ira lire la donnée existante au début du lancement de la requête sans bloquer l'éciture de nouvelles données.
    Data Concurrency and Consistency

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Une fois que ta requête est exécutée elle ne sélectionnera pas toute nouvelle ligne insérée. Par contre si tu exécutes une 2è fois cette requête et que les lignes insérées ont été commitées entre temps alors oui une 2è exécution les sélectionnera.
    Si tu veux être sûr de travailler avec le même nombre de lignes, au cas où tu dois mettre à jour par la suite ces données sélectionnées, insère leurs ids (rowid ou pk) dans une table temporaire.

  4. #4
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Une fois que ta requête est exécutée elle ne sélectionnera pas toute nouvelle ligne insérée. Par contre si tu exécutes une 2è fois cette requête et que les lignes insérées ont été commitées entre temps alors oui une 2è exécution les sélectionnera.
    Pas d'accord!
    Tout dépend du niveau d'isolation de ta base : de la lecture ici http://www.dba-oracle.com/t_oracle_isolation_level.htm .
    Idem si tu exécutes ton deuxième SELECT dans la même transaction ou non : s'il est dans une deuxième transaction, alors oui tu verras le nouveau INSERT mais si tu es dans la même transaction que le premier SELECT, normalement tu ne dois pas le voir (et encore, cela dépend de ton fameux niveau d'isolation).

    Petite question : ton deuxième SELECT a lieu dans un programme PL/SQL ou non?

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Tu bidouilles souvent le niveau d'isolation d'une base Oracle? Perso j'ai jamais vu une base Oracle où le niveau d'isolation défaut avait été changé.

    1ère session, je fais mon SELECT. J'ai mis un dbms_lock.sleep pour pouvoir faire un insert et commit dans une autre session:

    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
    declare
    v_cnt number;
     
    begin
    select count(*) into v_cnt from gva_table;
    dbms_output.put_line('v_cnt :' || v_cnt);
     
    dbms_lock.sleep(30);
     
    select count(*) into v_cnt from gva_table;
    dbms_output.put_line('v_cnt :' || v_cnt);
     
    end;
    /
     
    v_cnt :4
    v_cnt :5

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Petite question : ton deuxième SELECT a lieu dans un programme PL/SQL ou non?
    C'est un script python qui est lancé par cron toutes les 5mn.

    L'idée du rowid est parfait pour mon cas, je suis certain de ne pas passer à côté d'un enregistrement. Au lieu d'enregistrer les rowid dans une table temporaire j'enregistre le dernier de la requête dans un fichier et la prochaine fois que mon script se lance, il récupère cet id et prend tout ceux qui sont supérieur.

    Edit : A priori le rowid n'ira pas. Dans ma question initial je n'ai pas précisé que les tables sources audith et auditl sont vidées toutes les nuits, donc le "compteur" rowid repart à 0 : https://www.developpez.net/forums/d4...id/#post328026

    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
    SELECT a1.rowid, a.tbl_0, a.evt_0, TO_CHAR(a.dat_0, 'dd-mm-yyyy'), a.hou_0, a.id1_0, a.id2_0, a1.col_0, a1.nval_0, a.SEQ_0 
    FROM audith a
    INNER JOIN auditl a1 ON a1.seq_0 = a.seq_0
    WHERE
            (a.tbl_0 = 'SDELIVERY' OR
            a.tbl_0 = 'SDELIVERYD' OR
            a.tbl_0 = 'SORDER' OR
            a.tbl_0 = 'SORDERP' OR
            a.tbl_0 = 'SORDERQ' OR
            a.tbl_0 = 'SINVOICE' OR
            a.tbl_0 = 'SINVOICEV' OR
            a.tbl_0 = 'OPPOR' OR
            a.tbl_0 = 'SALESREP') AND
            a1.rowid_0 > 'DERNIERROWID'
    ORDER BY a1.rowid DESC;
    Exemple de résultat de ma sans la notion de rowid

    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
    SELECT a.tbl_0, a.evt_0, TO_CHAR(a.dat_0, 'dd-mm-yyyy'), a.hou_0, a.id1_0, a.id2_0, a1.col_0, a1.nval_0, a.SEQ_0 
    FROM audith a
    INNER JOIN auditl a1 ON a1.seq_0 = a.seq_0
    WHERE
            (a.tbl_0 = 'SDELIVERY' OR
            a.tbl_0 = 'SDELIVERYD' OR
            a.tbl_0 = 'SORDER' OR
            a.tbl_0 = 'SORDERP' OR
            a.tbl_0 = 'SORDERQ' OR
            a.tbl_0 = 'SINVOICE' OR
            a.tbl_0 = 'SINVOICEV' OR
            a.tbl_0 = 'OPPOR' OR
            a.tbl_0 = 'SALESREP') AND
            TO_CHAR(a.dat_0, 'dd-mm-yyyy') = TO_CHAR(sysdate, 'dd-mm-yyyy') AND
            a.hou_0 > '102000'
    ORDER BY a1.SEQ_0  DESC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TBL_0    |EVT_0 |TO_CHAR(A.DAT_0,'DD-MM-YYYY')|HOU_0 |ID1_0         |ID2_0    |COL_0    |NVAL_0        |SEQ_0 |
    ---------+------+-----------------------------+------+--------------+---------+---------+--------------+------+
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|SOHNUM   |NORHIL22022276|378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|ITMREF   |98109-1       |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|SOPLIN   |1000          |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|SOQSTA   |1             |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|QTY      |1             |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|ODLQTY   |0             |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|DLVQTY   |0             |378946|
    SORDERQ  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|SOQSEQ   |1000          |378946|
    SORDERP  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|TSICOD(3)|              |378945|
    SORDERP  |INSERT|18-02-2022                   |102703|NORHIL22022276|1000~1000|TSICOD(4)|              |378945|
    ...
    Dans cette exemple je récupère tout les enregistrements supérieur 10h20:00, ici on voit apparaitre ceux de 10h27:03. Dans mon script j'enregistre que le dernier enregistrement a été horodaté à 10h27:03. Je relance ma requête en changeant le supérieur sur a.hou qui devient :
    Rappel : cron lance le script toutes les 5mn.

    Si j'ai bien compris il est possible que pendant mon 1ere select d'autres enregistrements ai été écrit avec le même horodatage : 102703 puisque étant réalisé à cette heure. Du coups mon second select passe totalement à côté. Il faudrait que la colonne a.hou_0 descende à la microseconde ?

  7. #7
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Tu bidouilles souvent le niveau d'isolation d'une base Oracle? Perso j'ai jamais vu une base Oracle où le niveau d'isolation défaut avait été changé.
    Non mais c'est bien que flipflip sache comment fonctionne une base de données et comment est géré l'isolation des données.

    Ah, dernière chose, pas la peine de modifier le niveau d'isolation de la base, tu peux le faire dans une session et même dans une transaction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER SESSION SET ISOLATION_LEVEL=SERIALIZABLE;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE NAME 'TRAN1';

Discussions similaires

  1. [Power BI] Ordre d'exécution des requêtes
    Par italia57 dans le forum Power BI
    Réponses: 0
    Dernier message: 10/11/2014, 11h53
  2. [EG] Ordre d'exécution des requêtes d'un projet
    Par Pierre-Henri ROBLOT dans le forum Outils BI
    Réponses: 7
    Dernier message: 12/09/2014, 13h16
  3. Ordre d'exécution des requêtes
    Par magicbisous-nours dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/10/2012, 16h02
  4. [JMeter] Ordre aléatoire d'exécution des requêtes
    Par aya02 dans le forum Tests et Performance
    Réponses: 0
    Dernier message: 27/10/2010, 11h42
  5. ordre d'exécution des événements onblur et onfocus
    Par letycaf dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/05/2006, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo