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

Android Discussion :

[SQLite] Indexation - Optimisation


Sujet :

Android

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut [SQLite] Indexation - Optimisation
    Bonjour ,

    J'aurais un petit souci concernant l'optimisation de ma base Sqlite,
    pour un souci d'optimisation de réponse j'ai donc fait un index sur quelques champs. (nom/nom_marital/prenom)

    L'indexation ce fait bien mais le problème est que le temps de réponse est exactement le même ...

    Par exemple : Sans indexation pour Dupont : 33sec
    avec indexation : 33sec

    Je travail sur une base OFFline de 37.262 enregistrement sur plusieurs colonnes.

    Je ne comprend pas pourquoi cela ne marche pas .

    la recherche se fait via une AutoComplexetextview, ma query :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public Personne getPersonne(String nom){
    		Cursor c = myDataBase.query(TABLE_NAME, new String[]{COLONNE_NAME,COLONNE_FIRSTNAME,COLONNE_NAMEM}, null, null, null, COLONNE_NAME + " LIKE " + nom, "prenom ASC");
    		return cursorToPersonne(c);
    	}
    Mon SQL pour création de l'index :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE  INDEX "main"."idx_name" ON "alpha" ("nom" ASC, "nom_marital" ASC, "prenom" ASC)
    PS : Je recherche toujours une aide concernant ce Topics :
    http://www.developpez.net/forums/d11...che-dynamique/

    Cordialement ,
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par MisterS Voir le message
    L'indexation ce fait bien mais le problème est que le temps de réponse est exactement le même ...

    Par exemple : Sans indexation pour Dupont : 33sec
    avec indexation : 33sec [/code]
    Il peut y avoir plusieurs raisons.
    - Il n'est pas toujours rentable pour un SGBD d'utiliser un index, en particulier s'il estime que la colonne n'est pas restrictive (il est plus rapide de tout parcourir que de parcourir l'index puis d'aller voir l'objet).
    - En l'occurrence, ici, je pense que c'est le LIKE qui est en cause, car il effectue une opération (en SQLLite cela rend case insensitive). S'il y a une fonction appliquée, il devient compliqué d'utiliser un index, à moins qu'il ne se construit autour de la fonction !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Merci de ta réponse ,

    - Il n'est pas toujours rentable pour un SGBD d'utiliser un index, en particulier s'il estime que la colonne n'est pas restrictive (il est plus rapide de tout parcourir que de parcourir l'index puis d'aller voir l'objet).
    Concernant mon cas, je pensais que cela pourrais être plus correct de faire une indexation , Car dans mon cas j'ai l'impression qu'il ne respecte pas correctement ma recherche , a savoir pour : DUPONT , il recherche dans TOUTE la base alors que ma requête doit être dans : Nom/nom_marital/prenom , et il vérifie aussi dans les adresses. (sur l'émulateur c'est encore plus flagrant puisque je test sur un émulateur 256 de Ram et l'action est lente je vois la décrémentation du résultat.. ) chose que je ne comprend pas puisque ma requête est pour moi explicite.
    - En l'occurrence, ici, je pense que c'est le LIKE qui est en cause, car il effectue une opération (en SQLLite cela rend case insensitive). S'il y a une fonction appliquée, il devient compliqué d'utiliser un index, à moins qu'il ne se construit autour de la fonction !
    Je viens d'essayer avec : MATCH et le temps de réaction semble le même. Je ne comprend pas bien comment cela ce fait :S !


    Merci en tout cas de tes éclaircissements.
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2005
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2005
    Messages : 103
    Points : 203
    Points
    203
    Par défaut
    Bonjour,

    Un sujet intéressant, j'essaye moi même d'optimiser les requêtes de mon application et découvre des comportements qui par moment me semble étrange.

    Vous pouvez faire un EXPLAIN sur votre SELECT pour essayer de comprendre le plan d'exécution de la requête.
    Un truc sympa aussi c'est l'utilisation du "+" pour invalider l'utilisation d'un index sur une colonne, moi j'ai pu remarqué que certains index était plus efficace que d'autres dans certaines requête, pour l'utiliser c'est "+nomchamp" au niveau de la restriction.

    Dans la doc de SQLite ils préconisent l'utilisation d'opérateur "simple" plutôt que LIKE du genre ">=" et/ou "<=" en combinaison avec des AND. (ça peut-être une idée).

    L'ORDER BY à aussi un impact temps non négligeable (encore plus quand on le combine avec COLLATE).

    Ce sont juste des pistes de réflexion sur des tests que j'ai fais.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Je viens de faire des test avec : "=" a la place de "LIKE" je gagne à peu près 2seconde dans la recherche.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Personne getPersonne(String nom){
    		Cursor c = myDataBase.query(TABLE_NAME, new String[]{COLONNE_NAME,COLONNE_FIRSTNAME,COLONNE_NAMEM}, null, null, null, COLONNE_NAME + " = " + nom, "ASC");
    		return cursorToPersonne(c);
    	}
    Si ma réponse ou ma question vous semble pertinente un clique sur le pouce vert.
    La base des Expression Access à Connaitre : http://office.microsoft.com/fr-ca/ac...295.aspx?CTT=3
    Un livre de chevet parfait : "Développement Android": http://www.editions-eyrolles.com/Livre/9782212125870/

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/07/2014, 14h35
  2. [2008R2] Mise en place d'index - Optimisation
    Par Hiken dans le forum Développement
    Réponses: 20
    Dernier message: 11/07/2013, 16h16
  3. [2000] Index et optimisation
    Par Débéa dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 25/04/2006, 11h38
  4. [Access] Optimisation performance requête - Index
    Par fdraven dans le forum Access
    Réponses: 11
    Dernier message: 12/08/2005, 14h30
  5. Optimisations mysql sur les requêtes SELECT: index
    Par leo'z dans le forum Débuter
    Réponses: 2
    Dernier message: 29/11/2003, 13h23

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