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 :

[ORA 9.2] Hint / query rewrite


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Par défaut [ORA 9.2] Hint / query rewrite
    Bonjour,

    Est-ce que quelqu'un sais comment utiliser le hint INDEX (par exemple) sur une requête utilisant le query rewrite.

    Dans un modéle en étoile, soit une table vente qui est agrégé au temps, article et client...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    id_semaine date
    id_client varchar2,
    id_article varchar2,
    id_region varchar2
    CA, Marge...
    Un index existe sur toutes les dimensions. Celui pour id_semaine s'appele vente_semaine.

    Si je fais une requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select /*+ NOREWRITE */ id_client, id_region, sum(ca), sum(marge)
    from ventes
    where id_semaine= 'xx/xx/xx'
    group by id_client, id_region
    Le plan d'exécution me montre que l'index sur id_semaine n'est pas utilisé (ma vrai requête est un peu plus complexe que l'exemple).
    Si j'ajoute le hint index(ventes vente_semaine), il prend bien l'index.

    En réalité, une vue matérialisée ventes_bis existe et fait l'agrégation des données sur semaine/client/region(donc sans l'article). La base est correctement configurée (query_rewrite_integrity=trusted, etc...).
    L'index sur id_semaine s'appele vente_bis_semaine.

    Si j'enleve le hint NOREWRITE, Oracle va bien utiliser la vue matérialisée ventes_bis.
    Par contre, le hint index(ventes vente_semaine) n'est pas pris en compte

    J'ai tenté de mettre index(ventes vente_bis_semaine) mais ce n'est pas mieux

    si je fais le requête directement sur vente_bis_semaine (je fais le query rewrite moi même), ça marche.

    Quelqu'un a une idée ?

    Cdlt

    Hugues

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    j'avoue que je ne saisis pas bien le problème... en quoi query rewrite empêche d'utiliser INDEX ?

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Par défaut
    Bonjour,

    Le problème est plus général, et je n'ai jamais trouvé de solution.
    Dès que tu fais une requête sur un objet que tu ne nommes pas (en passant par une vue matérialisé ou non ou bien par un sysonyme), tu ne peut le hinter.
    C'est put être possible, mais je n'ai jamias trouvé.
    Et c'est bien dommage!

  4. #4
    Membre Expert
    Avatar de bouyao
    Inscrit en
    Janvier 2005
    Messages
    1 778
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 778
    Par défaut
    Est est ce que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QUERY_REWRITE_ENABLED = TRUE

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Par défaut
    Je fais une réponse globale aux différents posts :

    - le query rewrite est OK (query_rewrite_enabled=true, query_rewrite_integrity=trusted, ...)
    - les requêtes se réécrivent donc correctement

    Si on met 5mn le query rewrite de coté (mon hint norewrite) : ma requête n'utilise pas l'index. (c'est normal vu ce que je veux faire... donc pas la peine d'aiguiller le début vers les histogrammes ou autre)
    ==> je peux palier simplement le problème en utilisant le hint INDEX pour indiquer à l'optimiseur qu'un index sera plus performant qu'un full table scan

    Sur le hint index, je lui précise le nom de la table et le nom de l'index (ici, ça va, je les connais)

    Quand j'active le query rewrite, comme l'indiquait à juste titre Aline, je ne connais pas le nom de la table sans regarder dans le plan d'exécution. Et la, je ne sais pas comment guider l'optimiseur.

    merci de vos efforts

Discussions similaires

  1. Materialized view, query rewrite
    Par pacmann dans le forum SQL
    Réponses: 7
    Dernier message: 03/02/2009, 14h47
  2. Query rewrite avec les vues matérialisées
    Par h_ismaili dans le forum SQL
    Réponses: 16
    Dernier message: 06/06/2008, 08h49
  3. [9i] ORA-00439 MV et rewrite fonction
    Par infsaf dans le forum Oracle
    Réponses: 4
    Dernier message: 11/07/2006, 15h54
  4. erreur ora-12801 : error signaled in parallel query server
    Par dngaya dans le forum Administration
    Réponses: 5
    Dernier message: 15/04/2004, 16h25

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