2010-09-15 4 views
0

On m'a demandé de faire un rapport qui combine 3 différents rapports de cristal que nous utilisons. Déjà ces rapports sont très lents et lourds et il était hors de question d'en faire un gros. Donc, j'ai créé un peu d'applications dans VS 2010.Combiner 3 datatables différentes en 1 et performance avec SQL

Mon problème principal est ceci, j'ai 3 Datatable (même schéma) qui ont été créés avec le concepteur Dataset que j'ai besoin de combiner. J'ai créé une table vide pour stocker la valeur combinée. Les requêtes sont déjà assez volumineuses, donc les combiner dans une requête SQL est vraiment hors de question.

Je n'ai pas non plus d'accès en écriture au serveur SQL (2005), car le serveur est géré par la société qui a créé notre programme MRP. Bien que je puisse toujours demander de l'aide pour ajouter une vue sur le serveur.

Donc mes 3 datables sont constitués du coût de main-d'œuvre, du coût du matériel et du coût de sous-traitance. J'ai besoin de créer un tableau de coût total qui ajoute toute la colonne Coût de chaque table par ID. Toutes les tables ont des clés pour les trouver et les sélectionner. Le problème est que quand je récupère tout le travail en cours c'est ok (500ms pour 400 enregistrements), parce que j'ai une requête qui va chercher seulement le travail de travail. Le problème est avec Inventory, puisque je ne sais pas depuis quand ces Job ont été terminés, je dois aller chercher toute la base de données (environ 10000 emplois avec des sous-requêtes qui ont chacune 100 enregistrements) et ceci pour mes 3 tables. Cela prend environ 5000 à 8000ms, bien qu'il soit très rapide par rapport au rapport de cristal, il y a un problème.

J'ai besoin de créer un tableau récapitulatif qui va combiner toutes ces différentes tables que j'ai créées, mais j'ai aussi besoin de les faire 2 fois, 1 fois pour chaque date qui est sortie. Donc, mes données changent toujours, car elles sont basées sur un paramètre Date. En ce moment, il faudra environ 12-20sec pour les chercher tous.

J'ai besoin d'un moyen de réduire le temps de chargement, voici ce que j'ai essayé.

  • Essayé une boucle de combiner les 3 tables
  • ensuite essayé avec la classe DataReader pour lire chaque ligne et utilisé les findBy clés méthodes que le concepteur de jeux de données créé pour trouver la valeur dans l'autre table, et je dois le faire 2 fois. (il semble aller un peu plus vite que la boucle for)
  • Essayé avec Linq, ne pense pas que ce soit possible, et donnera-t-il plus de performance?
  • essayé de faire une requête dynamique qui utilisent « OÙ Comma Separated Liste » (qui doublait le temps d'exécution, par rapport à aller chercher tous la base de données)
  • tenté de joindre ma requête d'inventaire à mon coût requêtes (qui a également augmenté le temps qu'il a pris)

1 - Donc, y at-il un moyen de combiner mes tables plus efficacement? Quel est le moyen le plus rapide de fusionner et de cumuler mes enregistrements de mes 3 tables?

2 - Existe-t-il un moyen d'augmenter les performances de mes requêtes sans avoir accès en écriture au serveur?

Ci-dessous est une partie du code je pour référence:

public static void Fill() 
    { 

     DateTime Date = Data.Date; 

     AllieesDBTableAdapters.CoutMatTableAdapter mat = new AllieesDBTableAdapters.CoutMatTableAdapter(); 
     AllieesDBTableAdapters.CoutLaborTableAdapter lab = new AllieesDBTableAdapters.CoutLaborTableAdapter(); 
     AllieesDBTableAdapters.CoutSTTableAdapter st = new AllieesDBTableAdapters.CoutSTTableAdapter(); 

     Data.allieesDB.CoutTOT.Clear(); 

     //Around 2 sec each Fill 
     mat.FillUni(Data.allieesDB.CoutMat, Date); 
     Data.allieesDB.CoutMat.CopyToDataTable(Data.allieesDB.CoutTOT, LoadOption.OverwriteChanges); 

     lab.FillUni(Data.allieesDB.CoutLabor, Date); 
     MergeTable(Data.allieesDB.CoutLabor); 

     st.FillUni(Data.allieesDB.CoutST, Date); 
     MergeTable(Data.allieesDB.CoutST); 

    } 

Voici les méthodes MergeTable (La boucle For I essayé est en Commentaire)

private static void MergeTable(DataTable Table) 
    { 

     AllieesDB.CoutTOTDataTable dtTOT = Data.allieesDB.CoutTOT; 

     DataTableReader r = new DataTableReader(Table); 


     while (r.Read()) 
     { 
      DataRow drToT = dtTOT.FindByWO(r.GetValue(2).ToString()); 

      if (drToT != null) 
      { 
       drToT["Cout"] = (decimal)drToT["Cout"] + (decimal)r.GetValue(3); 
      } else 
      { 

       EA_CoutsDesVentes.AllieesDB.CoutTOTRow row = dtTOT.NewCoutTOTRow(); 

       for (int j = 0; j < r.FieldCount; j++) 
       { 
        if (r.GetValue(j) != null) 
        { 
         row[j] = r.GetValue(j); 
        } else 
        { 
         row[j] = null; 
        } 
       } 

       dtTOT.AddCoutTOTRow(row); 
      } 
      Application.DoEvents(); 
     } 

     //try 
     //{ 
     // for (int i = 0; i < Table.Rows.Count; i++) 
     // { 
     //  DataRow drSource = Table.Rows[i]; 
     //  DataRow drToT = dtTOT.FindByWO(drSource["WO"].ToString()); 

     //if (drToT != null) 
     //{ 
     // drToT["Cout"] = (decimal)drToT["Cout"] + (decimal)drSource["Cout"]; 
     //} else 
     //{ 
     //  
     // EA_CoutsDesVentes.AllieesDB.CoutTOTRow row = dtTOT.NewCoutTOTRow(); 

     // for (int j = 0; j < drSource.Table.Columns.Count; j++) 
     // { 
     //  if (drSource[j] != null) 
     //  { 
     //   row[j] = drSource[j]; 
     //  } else 
     //  { 
     //   row[j] = null; 
     //  } 
     // } 

     // dtTOT.AddCoutTOTRow(row); 
     //} 
     //Application.DoEvents(); 
     // } 
     //} catch (Exception) 
     //{ 
     //} 

Répondre

0

Sur Sql Server 2005 et jusqu'à , vous pouvez créer une vue matérialisée des valeurs agrégées et accélérer considérablement la performance.

regard sur Improving Performance with SQL Server 2005 Indexed Views

+0

Je n'ai accès en lecture seule au serveur – Nigol

+0

'Aussi je n'ai pas accès en écriture au serveur SQL (2005), parce que le serveur est maintenu par la société qui a créé notre programme MRP . Bien que je puisse toujours demander de l'aide pour ajouter une vue au serveur. » –

+0

Merci, je suis juste en train de vérifier mes options – Nigol