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 :

Mot Cle "N" dans ma requete SQL


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 214
    Points : 132
    Points
    132
    Par défaut Mot Cle "N" dans ma requete SQL
    Bonjour,

    J'utilise un logiciel qui me génère automatiquement la requete SQL (Crystal Report en l'occurrence).

    Le pb est qu'il me génère des requetes avec des N dans les clauses where, ce qui d'après ce que j'ai pur trouver qu'il ne doit pas utiliser les indexs (en tout cas, le temps d'execution de la requete est /50 car pas de full scan).

    Exemple :
    SELECT NOM FROM CLIENTS WHERE VILLE = N'LONDRES'
    Plusieurs questions : ou trouver de la donc sur ce mot clé ? peut-on passer outre ?
    Bref, comment virer ça .....

    D'avance merci.

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Il s'agit d'un marqueur "jeu de caractères National": http://download.oracle.com/docs/cd/B...003.htm#i42617

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 214
    Points : 132
    Points
    132
    Par défaut
    Ok, merci de l'info. Je vais essayer de voir comment m'en passer .....

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu définis tes colonnes en nvarchar2...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> create table clients(nom nvarchar2(40), ville nvarchar2(40))
    Table created.
    SQL> create index lsc_i on clients(ville)
    Index created.
    SQL> exec dbms_stats.gather_table_stats(user,'CLIENTS',cascade=>true)
    PL/SQL procedure successfully completed.
    SQL> SELECT NOM FROM CLIENTS WHERE VILLE = N'LONDRES'
    Execution Plan
    ----------------------------------------------------------
       0       SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=1 Card=1 
       1    0    TABLE ACCESS BY INDEX ROWID SCOTT.CLIENTS (Cost=1 
       2    1      INDEX RANGE SCAN SCOTT.LSC_I (Cost=1 Card=1)

  5. #5
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 214
    Points : 132
    Points
    132
    Par défaut
    Merci pour ta solution, mais mon pb est double :
    - je ne suis pas maitre de la construction de la requete (donc, l'ajout du N est obligatoire)
    - je ne suis pas maitre de la structure de la bd (VARCHAR et pas NVARCHAR)

    n'y aurait-il pas moyen de mettre un paramètre qui dirait de ne pas s'occuper du N ???? (Car le full scan sur mes table de milliers d'enreg pénalise énormément le serveur ...)

    Merci de votre aide.

  6. #6
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par rgarnier Voir le message
    ...n'y aurait-il pas moyen de mettre un paramètre qui dirait de ne pas s'occuper du N ???? ...
    Ce paramètre devrait exister plutôt du coté de Crystal Report vu que c’est lui qui génère les requêtes.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    bon, tu peux créer un FBI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SQL> create table clients(nom varchar2(40), ville varchar2(40))
    Table created.
    SQL> create index lsc_i on clients(to_nchar(ville))
    Index created.
    SQL> exec dbms_stats.gather_table_stats(user,'CLIENTS',cascade=>true)
    PL/SQL procedure successfully completed.
    SQL> SELECT NOM FROM CLIENTS WHERE VILLE = N'LONDRES'
    Execution Plan
    ----------------------------------------------------------
       0       SELECT STATEMENT Optimizer Mode=ALL_ROWS (Cost=1 Card=1 
       1    0    TABLE ACCESS BY INDEX ROWID SCOTT.CLIENTS (Cost=1 
       2    1      INDEX RANGE SCAN SCOTT.LSC_I (Cost=1 Card=1)

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Ce paramètre devrait exister plutôt du coté de Crystal Report vu que c’est lui qui génère les requêtes.
    oui, ça semble logique ça

  9. #9
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 214
    Points : 132
    Points
    132
    Par défaut
    OK, merci pour les tuyaux.

    P.S. : concernant C Report, il est bien évident qu'il pourrait mieux faire. A titre personnel et pour comprendre le phénomène, pouvez-vous me dire l'intéret d'une telle focntion, sachant que cela a pour effet de bord (énooorme en perte de perf) de ne pas utiliser les index ?

  10. #10
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par rgarnier Voir le message
    ...A titre personnel et pour comprendre le phénomène, pouvez-vous me dire l'intéret d'une telle focntion, sachant que cela a pour effet de bord (énooorme en perte de perf) de ne pas utiliser les index ?
    C’est n’est pas la fonction mais, la coercition qui fait sauter l’index. Regardez les section FILTER/ACCES.
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    SQL> select * from dept where loc = N'BOSTON';
     
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 3383998547
     
    --------------------------------------------------------------------------
    | Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    --------------------------------------------------------------------------
    |   0 | SELECT STATEMENT  |      |     1 |    20 |     3   (0)| 00:00:01 |
    |*  1 |  TABLE ACCESS FULL| DEPT |     1 |    20 |     3   (0)| 00:00:01 |
    --------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter(SYS_OP_C2C("LOC")=U'BOSTON')
     
    SQL> select * from dept where loc = translate(N'BOSTON' using CHAR_CS);
     
    Plan d'exÚcution
    ----------------------------------------------------------
    Plan hash value: 1731615412
     
    ---------------------------------------------------------------------------------------
    | Id  | Operation                   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ---------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT            |         |     1 |    20 |     2   (0)| 00:00:01 |
    |   1 |  TABLE ACCESS BY INDEX ROWID| DEPT    |     1 |    20 |     2   (0)| 00:00:01 |
    |*  2 |   INDEX RANGE SCAN          | IX_DEPT |     1 |       |     1   (0)| 00:00:01 |
    ---------------------------------------------------------------------------------------
     
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       2 - access("LOC"='BOSTON')

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par rgarnier Voir le message
    l'intéret d'une telle focntion
    Unicode?

  12. #12
    Membre habitué
    Inscrit en
    Janvier 2003
    Messages
    214
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 214
    Points : 132
    Points
    132
    Par défaut
    Non, pas d'unicode (utf16).

    Merci pour vos infos.

  13. #13
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    je dis, l'intérêt de cette fonction c'est d'avoir UNICODE...

    Je te conseille de contacter le support de CR pour pouvoir générer du code sans N'

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

Discussions similaires

  1. [MySQL] Problème de quote dans une requete sql
    Par berew dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 05/04/2012, 21h33
  2. [JDBC]Caractères spéciaux dans une requete SQL
    Par frizby dans le forum JDBC
    Réponses: 2
    Dernier message: 28/11/2005, 18h01
  3. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

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