2011-07-13 5 views
1

J'ai développé quelques petites applications de base de données dans Visual Studio C# depuis un moment. J'utilise actuellement VS 2010. Jusqu'à récemment, toutes les applications étaient exécutées sur le même ordinateur que la base de données et tout fonctionnait parfaitement. Récemment, j'ai dû commencer à développer des applications qui fonctionneront sur un ordinateur séparé qui se trouve sur le même réseau local. Assez facile, mais je rencontre un problème lors de l'exécution de requêtes pour remplir les contrôles, comme une grille ou même une zone de liste déroulante. Le problème est que cela peut prendre 15-30 secondes par contrôle si ma requête tire une grande quantité de données. Je sais que c'est parce que l'application envoie ma requête de sélection, en attente de tous les résultats à venir sur le réseau, puis l'affichage des informations. Le problème est que je ne sais pas quoi faire à ce sujet. Ci-dessous, j'ai un extrait de code (légèrement modifié pour donner plus de sens). Il utilise une base de données Firebird, bien que j'utilise MSSQL et Sybase Advantage avec les mêmes résultats.Requêtes très lentes à travers le réseau local dans les applications C#

  FbConnection fdbConnect = new FbConnection(); 
      fdbConnect.ConnectionString = Program.ConnectionString; 
      fdbConnect.Open(); 
      FbCommand fcmdQuery = new FbCommand(); 
      fcmdQuery.Connection = fdbConnect; 
      fcmdQuery.CommandText = "select dadda.name, yadda.address, yadda.phone1 from SOMETABLE left join yadda on dadda    where yadda.pk = dadda.yaddapk"; 
      FbDataAdapter fdaDataSet = new FbDataAdapter(fcmdQuery); 
      DataSet dsReturn = new DataSet(); 
      fdaDataSet.Fill(dsReturn); 
      fdbConnect.Close(); 
      DataGridView1.DataSource = dsReturn.Tables[0]; 

Est-ce que quelqu'un a des suggestions sur comment je peux accélérer cela?

+1

Combien coûte "grande quantité de données"? Avez-vous identifié le goulot d'étranglement (réseau, DB, autre chose)? – Oded

+0

Aussi, quelles sont les bases de données? Des choses comme les backends d'accès (.MDB) sont notoirement lents quand on accède à travers un réseau. – CodingGorilla

+0

@Coding Gorilla: Firebird ... C'est ce que j'ai mentionné. – Reniuz

Répondre

1

Vous pouvez renvoyer des données inutiles dans cette instruction SELECT *. Cela peut être un gaspillage dans le trafic réseau et réduire les performances de votre application. Il y a beaucoup d'articles à ce sujet et comment vous devriez spécifier vos colonnes explicitement. Voici one in particular.

+0

Bonne information, mais je cible en fait explicitement des colonnes spécifiques dans mon code réel, je viens d'écrire un faux SQL rapide et je n'ai pas pensé aux gens qui confondent select *. Merci! – thebuder

+0

@thebuder: N'oubliez pas de nous donner des informations précises lorsque vous posez votre question :) –

0

Vous pouvez réduire le volume de la réponse en limitant vos colonnes:

Au lieu de

select * from SOMETABLE 

Essayez

select a,b,c from SOMETABLE 

pour récupérer uniquement les données dont vous avez besoin.

Votre kilométrage varie en fonction de ce que contient la table. S'il y a des colonnes blob inutilisées, par exemple, vous ajoutez une surcharge considérable à votre réponse.

+0

J'ai édité mon post.Je ne récupère réellement que les colonnes et les données dont j'ai besoin. – thebuder

+0

Dans ce cas, comme d'autres l'ont suggéré, la pagination côté serveur pour limiter la taille de votre ensemble de données est probablement le fruit le plus bas –

0

Si vous affichez les données dans gridview, et si les données sont énorme, de son mieux pour faire radiomessagerie côté serveur de sorte qu'un certain nombre de lignes est retourné à la fois.

+0

Je vais vérifier cela et je vous le ferai savoir. Merci! – thebuder

+0

Je viens de me remettre au travail. J'ai regardé dans la pagination côté serveur et ai quelques problèmes avec ma recherche. Le premier problème est que j'utilise WinForms, et il semble que tous les résultats de recherche donnent des résultats ASP qui ne semblent pas bien se poursuivre. Le deuxième problème est que le goulot de la bouteille est en train de remplir la déclaration SQL, donc tout ce que je fais avec le gridview ne me semble pas aider. Une suggestion sur où chercher plus d'informations sur la pagination côté serveur avec winforms? J'admets volontiers que je ne sais même pas où activer la pagination côté serveur, sur la source de données ou quelque chose sur la base de données. – thebuder

Questions connexes