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

SQL Oracle Discussion :

function based index - bogue


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut function based index - bogue
    Salut, j'ai quelque chose à vous montrez. Je ne sais pas si c'est un bogue dans ma version d'oracle, mais bon.

    Voici un select :

    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 D_RENVL,
             C_TYPE_ASSR,
             COUNT (C_TYPE_ASSR) TOTAL,
             (SELECT COUNT (*)
                FROM GENXXEF01.V_REMA002_POLICE P1
               WHERE P1.C_TYPE_ASSR = P.C_TYPE_ASSR AND S_AGEN = 'C' AND (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) = P.D_RENVL)
                TERMINE
        FROM (SELECT (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) D_RENVL,
                     C_TYPE_ASSR,
                     N_TERM
                FROM GENXXEF01.V_REMA002_POLICE
               WHERE C_TYPE_ASSR IN ('HA', 'AU')) P
    GROUP BY D_RENVL, C_TYPE_ASSR
    ORDER BY D_RENVL DESC, C_TYPE_ASSR DESC
    ça fonctionne numéro 1. Pour améliorer la performance, j'ai décidé d'ajouter une function based index sur : (D_RENVL + (INTERVAL '1' YEAR) * N_TERM).

    ça fonctionne encore numéro 1 mais encore plus rapide (< 1 seconde au lieu de plus de 30 secondes).

    Maintenant j'ai un besoin de pagination, mais quand je fais ceci :

    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 * from (
      SELECT D_RENVL,
             C_TYPE_ASSR,
             COUNT (C_TYPE_ASSR) TOTAL,
             (SELECT COUNT (*)
                FROM GENXXEF01.V_REMA002_POLICE P1
               WHERE P1.C_TYPE_ASSR = P.C_TYPE_ASSR AND S_AGEN = 'C' AND (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) = P.D_RENVL)
                TERMINE
        FROM (SELECT (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) D_RENVL,
                     C_TYPE_ASSR,
                     N_TERM
                FROM GENXXEF01.V_REMA002_POLICE
               WHERE C_TYPE_ASSR IN ('HA', 'AU')) P
    GROUP BY D_RENVL, C_TYPE_ASSR
    ORDER BY D_RENVL DESC, C_TYPE_ASSR DESC)
    Ma colonne D_RENVL est maintenant blanche. Elle ne l'était pas sans le niveau supérieur de select. Je retire mon index et tout re-fonctionne à nouveau.

    Je remet mon index et je fais quelques tests. Sans le ORDER by il n'y a pas de problème. Si je garde le order by mais que je fais TO_CHAR(D_RENVL,'YYYY-MM-DD') comme ci-dessous, là ça fonctionne!

    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 * from (
      SELECT TO_CHAR(D_RENVL, 'YYYY-MM-DD'),
             C_TYPE_ASSR,
             COUNT (C_TYPE_ASSR) TOTAL,
             (SELECT COUNT (*)
                FROM GENXXEF01.V_REMA002_POLICE P1
               WHERE P1.C_TYPE_ASSR = P.C_TYPE_ASSR AND S_AGEN = 'C' AND (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) = P.D_RENVL)
                TERMINE
        FROM (SELECT (D_RENVL + (INTERVAL '1' YEAR) * N_TERM) D_RENVL,
                     C_TYPE_ASSR,
                     N_TERM
                FROM GENXXEF01.V_REMA002_POLICE
               WHERE C_TYPE_ASSR IN ('HA', 'AU')) P
    GROUP BY D_RENVL, C_TYPE_ASSR
    ORDER BY D_RENVL DESC, C_TYPE_ASSR DESC)
    ça peut faire le travail le to_char, mais le dba en moi ne veut pas monter cet index en production sans comprendre le problème.

    J'ai retiré le to_char et fais un autre test. Créer une table à partir du select qui est en problème. Oh my god...Ma session a plantée et j'ai eu un message :

    ORA-7445 [evaopn3] generally occurs during the execution of a query.

    The error typically only occurs with a specific stream of data being
    fetched from the objects in the execution plan.

    The problem is caused often by an optimization but it is not until a
    row is fetched and evaluated that the error happens

    Je ne comprends pas ce qui se passe. Pourtant la requête du millieu fonctionne super bien.

    Ma version d'Oracle est 11.2.0.2.0.

    Merci

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Essaie de fournir un petit jeu d’essaie (création tables, index, insertion des données, etc.) si vous voulez plus d’information.

  3. #3
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Je vous conseille de lire le document MOS ID 13369579.8 que vous trouverez sur My Oracle Support

    Bug 13369579 - dump on evaopn3 with function base index and ORDER BY [ID 13369579.8]


    A select statement with functional index defined on the expression used in the order by clause and any operand(only operator) of the order by operator is part of the select clause then the query might dump on evaopn3.

    Workaround --> disable FBI

  4. #4
    Membre confirmé
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2006
    Messages : 98
    Par défaut
    Justement je ne veux pas disabled le FBI car c'est la mon gain.

    MAis bon au moins en sachant que c'est répertorié et que c'est sur un order by, ça me stress moins.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Function animate + index
    Par egcrea dans le forum jQuery
    Réponses: 5
    Dernier message: 22/04/2015, 10h40
  2. [10g] 10G : imp oracle sur les function-based indexes
    Par abcrabcr dans le forum Import/Export
    Réponses: 0
    Dernier message: 09/09/2014, 19h25
  3. Function-based index : ORA-00001
    Par AurelGTS dans le forum Oracle
    Réponses: 8
    Dernier message: 30/10/2006, 11h08
  4. [Dll] Chargement dynamique a base d'index
    Par Clorish dans le forum Langage
    Réponses: 20
    Dernier message: 25/03/2005, 14h19
  5. Créer un index pour une Base de données
    Par john7 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/01/2005, 21h43

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