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

Adaptive Server Enterprise Sybase Discussion :

ASE15-Index non-utilisé qd utilise variables dans WHERE clause


Sujet :

Adaptive Server Enterprise Sybase

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut ASE15-Index non-utilisé qd utilise variables dans WHERE clause
    Bonjour,

    Sur plusieurs serveurs ASE 15.5, nous avons une table T de 5 Millions de rows avec le DDL suivant:
    create table T (
    UID int not null ,
    logOnDtm datetime not null ,
    logOffDtm datetime null ,
    termID varchar(20) not null ,
    autoSignOff varchar(1) null ,
    sessionID varchar(255) null
    )
    lock allpages
    le showplan montre que la requete ci-dessous utilise l'index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from T where  T.logOnDtm >= '20120309' and T.logOnDtm < '20120310'
    Mais que la requete ci-dessous n'utilise pas l'index:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare @startDtm datetime
    declare @endDtm datetime
     
    select @startDtm = '20120309'
    select @endDtm = '20120310'
     
    select * from T where  T.logOnDtm >= @startDtm and T.logOnDtm < @endDtm
    Pourquoi l'index n'est pas utilisé par l'optimizer dans le 2ieme cas?

    Note1: forcer l'index fonctionne = l'index est utilisé
    Note2: j'ai essaye plusieurs formats de dates et même de char() sans succes.

    Merci
    Vincent

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Lorsqu'on n'est pas dans une proc stockée ASE ne fait pas d'interpolation des variables, et donc va utiliser une heuristique assez basique pour déterminer si les indexes sont intéressants.

    En général la seule solution est de forcer l'index.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci Michael.

    Je viens de tester ce code dans une stored procedure et l'index n'est malheureusement pas utilisé.

    En forcant l'index ca fonctionne mais je n'arrive pas a comprendre pourquoi l'optimizer n'essaie pas d'abord d'evaluer un plan avec l'index d'autant que les variables sont definis comme variables statiques au debut du code. Ce n'est pas comme si les variables changeaient tout le temps comme dans un curseur.
    Est-ce que le parser Sybase ne commence-t-il par remplacer les valeurs statiques dans le code avant d'evaluer le query plan d'execution?

    Merci,
    Vincent

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    J'ai supprimé les deux index suivants que j'avais sur la table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    index_name            index_keys     index_description 
     --------------------- -------------- -----------------
     TIndex1  UID, logOnDtm clustered                      
     TIndex2  logOnDtm      nonclustered
    Puis j'ai re-créé un index clusterisé sur le champ date "logOnDtm"
    => cela fonctionne desormais = la query utilise index

    La question est donc:
    - est-ce un probleme de design d'index de la part du developeur?
    - est-ce que mon index clusterise etait trop defragmenté alors que j'utilisais l'index non-clusterisé?

    Le cluster ratio des 2 index etaient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select derived_stat("T", "TIndex1", "dpcr");
     --------------------
                 0.216365
     
    select derived_stat("T", "TIndex2", "dpcr");
     --------------------
                 0.006302

Discussions similaires

  1. Index non utilisé dans une jointure
    Par lasyan3 dans le forum SQL
    Réponses: 15
    Dernier message: 12/04/2011, 09h06
  2. Index non utilisé dans une requête
    Par tibal dans le forum Administration
    Réponses: 9
    Dernier message: 10/05/2010, 15h29
  3. Utilisation variable dans fonction
    Par Jiraiya42 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/01/2008, 17h22
  4. Utilisation variable dans script expect
    Par fdesarmes dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 27/07/2007, 11h53
  5. [XSL] impossible d'utiliser variable dans expression XPATH
    Par pierre.zelb dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 18/01/2006, 07h41

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