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

C# Discussion :

Requete SELECT OleDb un peu longue


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Par défaut Requete SELECT OleDb un peu longue
    Bonsoir,

    j'ai une base où pour l'instant j'ai 120 000 enregistrements (avec 12 int, 1 varchar par ligne)

    lorsque je fais une requête du style "SELECT * from matable" ça met 6 secondes pour l’exécuter et 8 si j'affiche tous les résultats dans un datagridview

    est-ce normal ? est-ce que le temps de la requête dépend du PC ?

    j'utilise le code suivant :

    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
    38
            private int SelectMDB(String file, String table, String request, DataGridView datagridview)
            {
                int result = 0;
     
                Stopwatch stopWatch = new Stopwatch();
                stopWatch.Start();
     
                try
                {
                    string connetionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + file + ";";
                    OleDbConnection connection = new OleDbConnection(connetionString);
                    OleDbDataAdapter dataadapter = new OleDbDataAdapter(request, connection);
                    DataSet ds = new DataSet();
                    connection.Open();
                    dataadapter.Fill(ds, table);
                    connection.Close();
     
                    result = ds.Tables[0].Rows.Count;
     
                    datagridview.DataSource = ds;
                    datagridview.DataMember = table;
     
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
     
                stopWatch.Stop();
                // Get the elapsed time as a TimeSpan value.
                TimeSpan ts = stopWatch.Elapsed;
     
                // Format and display the TimeSpan value.
                string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);
                Console.WriteLine("Select execute en : " + elapsedTime);
     
                return result;
            }
    merci

    @++

    KaloOopS

  2. #2
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Billets dans le blog
    3
    Par défaut
    Bonjour,

    Peux-tu nous donner la structure de ta table (sous forme de clause SQL CREATE de préférence) ?

    En général, il vaut mieux proscrire le SELECT * dans les requêtes SQL. Il est recommandé de spécifier explicitement le nom des colonnes, même si on sélectionne l'ensemble des colonnes de la table.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Par défaut
    Bonjour

    Citation Envoyé par Matt07 Voir le message
    Peux-tu nous donner la structure de ta table (sous forme de clause SQL CREATE de préférence) ?
    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
    38
    39
    40
    41
    42
            private void CreateTable(String file, String table)
            {
                String sCreate = "CREATE TABLE " + table + " ( ";
                sCreate += "[ID] counter, ";
                sCreate += "[Nom] varchar, ";
                sCreate += "[Serie] integer, ";
                sCreate += "[NoSoudage] integer, ";
                sCreate += "[NoProg] integer, ";
                sCreate += "[Effort] integer, ";
                sCreate += "[PresencePiece] integer, ";
                sCreate += "[Forgeage] integer, ";
                sCreate += "[Empilage] integer, ";
                sCreate += "[Intensite] integer, ";
                sCreate += "[Temps] integer, ";
                sCreate += "[Defaut] integer )";
     
                RequestMDB(file, sCreate);
            }
     
            private int RequestMDB(String file, String request)
            {
                int result = 0;
     
                try
                {
                    OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + file);
                    myConnection.Open();
                    OleDbCommand myCommand = new OleDbCommand();
                    myCommand.Connection = myConnection;
                    myCommand.CommandText = request;
     
                    result = Convert.ToInt32(myCommand.ExecuteScalar());
     
                    myCommand.Connection.Close();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
     
                return result;
            }
    Il est recommandé de spécifier explicitement le nom des colonnes, même si on sélectionne l'ensemble des colonnes de la table.
    comment dois-je faire ? quelle forme doit avoir ma requête SELECT

    sinon j'ai fait l'essai sur un netbook avec mes 120 000 enregistrements, la même requête a été effectuée en 15 secondes !!!

    @++

    KaloOopS

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    120k lignes c'est beaucoup de lignes à rammener! Pourquoi autant d'un coup? Surtout qu'OleDb+Access ca ne fait pas un couple de foudres de guerre...
    Rajouter une clausse WHERE ainsi que poser des index sur ta table pourrait être pas mal. Personne ne veut voir 120k lignes sur son écran

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Par défaut
    Citation Envoyé par Nathanael Marchand Voir le message
    120k lignes c'est beaucoup de lignes à ramener! Pourquoi autant d'un coup?
    c'est une base pour un suivi de production

    120k lignes c'est rien car si je me base à certains de nos clients, il faudrait 30k lignes par jour !!! (c'est un cas un peu extrême mais faut pouvoir gérer au moins 20k lignes / jour)

    donc 120, ça ne fait que 4 jours de production ...

    Surtout qu'OleDb+Access ça ne fait pas un couple de foudres de guerre...
    Quelle serait alors la "meilleure" base pour gérer ces volumes ?

    poser des index sur ta table
    qu'entends-tu par "index" ?

    merci

    @++

    KaloOopS

  6. #6
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il est clair que le mieux serait un SQLServer normal (SQLServer Express par exemple ou tout autre SGBD).
    Si tu veux garder du compact, tu peux prendre SQLServer Compact Edition. Meme principe qu'Access: ca tient dans un fichier.
    Personellement je m'en sers pour faire du monitoring sur l'appli de prod (insertion de 60k/lignes par jour) et ca tiens la charge.

    Pour ce qui est des index, c'est comme l'index d'un livre: pour ne pas avoir à lire tout le livre pour trouver ton info, tu cherches dans l'index.
    http://sqlpro.developpez.com/cours/quoi-indexer/

Discussions similaires

  1. Requete select LIKE un peu complexe
    Par dembroski dans le forum Requêtes
    Réponses: 1
    Dernier message: 21/05/2010, 11h13
  2. [MySQL] Requete Select longue chaine de caractère
    Par -Raphaël- dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/05/2010, 14h54
  3. Requete SELECT Longue
    Par tleboukaka dans le forum Bases de données
    Réponses: 5
    Dernier message: 07/09/2007, 15h04
  4. [SQL] Requete SELECT un peu confuse
    Par benoitinfrance dans le forum PHP & Base de données
    Réponses: 46
    Dernier message: 02/08/2006, 22h04
  5. Requete DELETE un peu longue...
    Par Thierry8 dans le forum Requêtes
    Réponses: 3
    Dernier message: 21/02/2006, 15h37

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