Précédent   Forum du club des développeurs et IT Pro > Bases de données > Sybase > Adaptive Server Enterprise
Adaptive Server Enterprise Forum d'entraide concernant Sybase Adaptive Server Enterprise, le dataserver phare de Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 22/03/2012, 17h15   #1
vinceroi
Invité de passage
 
Vincent
Inscription : mai 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Vincent

Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
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:
Citation:
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 :
SELECT * FROM T WHERE  T.logOnDtm >= '20120309' AND T.logOnDtm < '20120310'
Mais que la requete ci-dessous n'utilise pas l'index:
Code :
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
vinceroi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 17h24   #2
mpeppler
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 307
Détails du profil
Informations personnelles :
Âge : 53

Informations forums :
Inscription : janvier 2006
Messages : 1 307
Points : 1 643
Points : 1 643
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 18h33   #3
vinceroi
Invité de passage
 
Vincent
Inscription : mai 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Vincent

Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
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
vinceroi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2012, 23h05   #4
vinceroi
Invité de passage
 
Vincent
Inscription : mai 2010
Messages : 8
Détails du profil
Informations personnelles :
Nom : Vincent

Informations forums :
Inscription : mai 2010
Messages : 8
Points : 2
Points : 2
J'ai supprimé les deux index suivants que j'avais sur la table:

Code :
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 :
1
2
3
4
5
6
7
8
 
SELECT derived_stat("T", "TIndex1", "dpcr");
 --------------------
             0.216365
 
SELECT derived_stat("T", "TIndex2", "dpcr");
 --------------------
             0.006302
vinceroi est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h45.


 
 
 
 
Partenaires

Hébergement Web