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

VB.NET Discussion :

DataTable & .Select()


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut DataTable & .Select()
    Bonjour,

    j'ai un fait un développement permettant de faire des synchronisations de bases de données.

    J'utilise en fait deux datatables et la fonction "select(maCondition)" pour déterminer les bons traitements à faire.

    J'ai été d'une part un peu gourmand sur les ressources car je ne faisais pas de "Dispose" ou "Clear" quand il le fallait. Du coup mon programme levait l'exception System.OutOfMemoryException

    Mais la réelle question est :
    Est ce que le fait d'utiliser la fonction "Select()" sur une datatable a une quelconque intéraction sur la base de donnée ou la table ?

    J'ai constaté que notre serveur SQL devenait extremement lent durant mes tests ... A vrai dire ça ralentissait tous les utilisateurs.

    Merci d'avance de vos réponses.

  2. #2
    Membre expérimenté
    Avatar de Rami
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 177
    Par défaut
    je ne pense pas que ca viennent du .Select()

    le dataset est un object deconnecté a priori.

    Par contre, pour remplir tes dataset, tu fais un select de combien de table/lignes/a quelle frequence...

    J'ai constaté que notre serveur SQL devenait extremement lent durant mes tests ... A vrai dire ça ralentissait tous les utilisateurs.
    Quels utilisateurs? de la même application/des meme bases de données/ du meme serveur SQL?

    tes tests ne couvrent que cette partie select? ou il y a des requetes insert/update/delete ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    En fait le process de comparaison se décline en 3*2 instructions

    - 1 partie Insert (Comparaison + Traitement )
    - 1 partie Update (idem)
    - 1 partie Delete (idem)

    Je commence par récupérer les tables à comparer, définies dans un fichier de config.

    Pour chaque table j'effectue le traitement décrit ci-dessus.

    Pour la comparaison : 1 select sur la table "source" / 1 select sur la table de destination qui me valorise mes deux datatables.

    Je garde les lignes "sources" qui me permettront par la suite de faire les traitements d'insertion/modification/suppression dans la base de destination.

    Une fois ma datatable "source" valorisée, comme tu dis, je n'utilise à priori plus de liens vers ce serveur.

    Par contre, pour remplir tes dataset, tu fais un select de combien de table/lignes/a quelle frequence...
    Donc : 1 select sur l'ensemble des lignes de la table. Fréquence : Je suis en phase de dev', donc pas de production. La fréquence correspond à celle où je lance mon prog' pour mes tests

    Quels utilisateurs? de la même application/des meme bases de données/ du meme serveur SQL?
    On utilise un serveur SQL 2005. Les utilisateurs utilisent cette base via deux applicatifs access. Ces applicatifs utilisent des tables liées sur ce serveur SQL.

    tes tests ne couvrent que cette partie select? ou il y a des requetes insert/update/delete ?
    J'ai déjà commencé par allégé la charge mémoire en vidant plus régulièrement des objets servant à stocker des informations.
    Les requêtes de modifications de données (Insert/Delete/update) ne vont qu'à destination d'une base située sur mon poste. A terme, sur une autre machine. Mais le principe reste le meme.

    Pour résumer, le serveur SQL ne subit que 3 requêtes "select" par tables traitées. Je ne sais plus combien de tables je traite, mais on va dire entre 10 et 15.

    Merci en tout cas.

  4. #4
    Membre expérimenté
    Avatar de Rami
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 177
    Par défaut
    Si j'ai bien compris ce que tu fais:
    Citation Envoyé par Luc1an0 Voir le message
    Pour résumer, le serveur SQL ne subit que 3 requêtes "select" par tables traitées.
    Je ne suis pas sur de comprendre pourquoi tu fais 3 select (au sens SQL).
    Une fois ton dataset rempli, tu peux faire plusieurs .Select() (au sens .Net) consecutifs dessus il me semble...

    Citation Envoyé par Luc1an0 Voir le message
    Je ne sais plus combien de tables je traite, mais on va dire entre 10 et 15.
    il n'y a pas de grosses tables (du type avec des champs binaires/images et beaucoup d'enregistrements)?


    Dernier point a regarder a priori :
    verifies tes fermetures de connections

  5. #5
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Citation Envoyé par Rami Voir le message
    tu peux faire plusieurs .Select() (au sens .Net) consecutifs dessus il me semble...
    Oui effectivement. Je fais un "Select" / ligne en fait : Pour vérifier la correspondance entre une entrée de la table source avec une entrée de la table de destination.

    Citation Envoyé par Rami Voir le message
    verifies tes fermetures de connections
    Le Connect() / Disconnect() à mes sources de données sont encapsulés dans mes fonctions d'exécution de insert / delete / update / select (SQL)


    Citation Envoyé par Rami Voir le message
    il n'y a pas de grosses tables (du type avec des champs binaires/images et beaucoup d'enregistrements)?
    Si ... la taille des tables varie, mais on peut atteindre 150 000 lignes sur une (voir plusieurs tables)

    Mais dans le sens où le DataTable marche en mode déconnecté... Cela fait juste une bonne charge mémoire & processeur. Chose à laquelle j'ai à peu près remédié le souci en faisant
    - des Dispose() de mémoire plus souvent,
    - des écritures de plusieurs fichiers logs temporaires (libérant ainsi l'espace mémoire qu'ils occupaient avant la fin du programme), avant d'être réécris dans un seul et même fichier

    Le souci principal c'est que je m'efforce de coder en utilisant le moins de mémoire possible, et en mettant des sleep de 1 voir 2 Ms dans mes boucles afin de ne pas alourdir le proc' : mais qu'au final je peux difficilement testé car je ne veux pas gêner tous les autres utilisateurs.

    Je pourrais faire cela sur une base de test ? : Oui.

    Mais je ne pourrai pas faire rapprocher ma base de test avec les mêmes réactions que la base de production.

  6. #6
    Membre expérimenté
    Avatar de Rami
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 177
    Par défaut
    Citation Envoyé par Luc1an0 Voir le message
    Le souci principal c'est que je m'efforce de coder en utilisant le moins de mémoire possible, et en mettant des sleep de 1 voir 2 Ms dans mes boucles afin de ne pas alourdir le proc' : mais qu'au final je peux difficilement testé car je ne veux pas gêner tous les autres utilisateurs.
    C'est pas clair toute cette histoire pour moi...
    en quoi la memoire sur ton poste et le proc sur ton poste ont une influence?
    a moins que tu comptes deployer sur le serveur hostant SQL Server?

    tes interaction avec le serveur doivent etre:
    - je rempli mon dataset (et ca peut etre effectivement lourd).
    - finito (puisque l'autre base est ailleurs si j'ai bien suivi)
    d'ou mon "doutage"..


    Pour ce qui est de la base de test, si ta base de prod est backuppé de maniere journalière, un admin SQL devrait pouvoir te mettre en place une base de test J-1 ou J-2 assez simplement.

  7. #7
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2007
    Messages : 467
    Par défaut
    Citation Envoyé par Rami Voir le message
    le dataset est un object deconnecté a priori.
    Juste pour précision : je confirme.

    Je viens de désactiver ma carte réseau après avoir récupérer mes données et avant d'effectuer mes traitements.

    Mon traitement de vérification fonctionne. Ce n'est donc pas l'instruction "Select()" qui pose souci.

    Mais du coup c'est encore plus flou pour comprendre d'où ce ralentissement réseau provient :s

Discussions similaires

  1. DataTable - Row Selection
    Par ITLEARNEAR dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 30/04/2014, 10h19
  2. [Plugin] Datatables + Jeditable + Select
    Par Kalas22 dans le forum jQuery
    Réponses: 0
    Dernier message: 19/08/2013, 16h52
  3. [VB.NET 2003] DataTable.Select Method
    Par Kropernic dans le forum Windows Forms
    Réponses: 11
    Dernier message: 08/02/2008, 16h16
  4. [C#] Datatable.Select( regex )
    Par mikyfpc dans le forum Windows Forms
    Réponses: 0
    Dernier message: 29/08/2007, 12h22
  5. [C#2] DataTable.Select, méthode (String)
    Par Leesox dans le forum Accès aux données
    Réponses: 2
    Dernier message: 15/08/2006, 19h40

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