Bonjour @ tous,
Je fait une requête sur une grosse table SQL SERVER (320 000 enregistrements) avec pas mal de relations.
Certes, la requête prend un peu de temps à exécuter, mais ce qui me chagrine, c'est que le le temps de chargement de mes objets est plus longue encore...
J'aimerais savoir si vous voyez une faille dans ma façon de faire.
En gros, j'ai une collection par type d'objet et pour chaque dépendances, je cherche dans la collection ad hoc s'il existe déjà. Si non, il l'ajoute.
Exemple pour charger des articles :
J'ai un objet tblArticle et un objet tblArticles qui contient principalement une collection (BindingList) de tblArticle.
J'ai simplifié le code, il y a plus de GetById que ça (7 en tout), mais le principe est là.
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
43
44 Public Class tblArticles <DataMember> Public items As BindingList(Of tblArticle) Public Sub GetAll() Dim sb As StringBuilder = New StringBuilder($"Debut({DateTime.Now:mm:ss}) ") Dim dr As IDataReader Dim Fabs As tblFabricants = New tblFabricants(_Env) dr = _Env.OpenDr("SELECT * FROM ...") items.Clear() sb.Append($"SqlExec({DateTime.Now:mm:ss}) ") While dr.Read items.Add(New tblArticle(_Env) With { .Id = dr("ID").ToString().Trim(), .Desc = dr("DES").ToString().Trim, .Fab = Fabs.GetById(New tblFabricant(_Env) With {.Id = dr("FABID").ToString()}) ...etc... }) End While dr.Close() : dr.Dispose() : dr = Nothing sb.Append($"Fin({DateTime.Now:mm:ss}, {items.Count} elmts).") msgErr = sb.ToString() End Sub End Class Dans ma classe tblFabricants : ''' <summary>Retourne l'élément correspondant de la collection. S'il ne le trouve pas, il l'ajoute à la collection.</summary> Public Function GetById(o As tblFabricant) As tblFabricant If (String.IsNullOrEmpty(o.Id)) Then Return Nothing Dim elmt As tblFabricant= items.Where(Function(s) s.Equals(o)).SingleOrDefault() If (elmt Is Nothing) Then elmt = o items.Add(elmt) End If End If Return elmt End Function Dans ma classe tblFabricant: Public Overrides Function Equals(obj As Object) As Boolean Return ((Not obj Is Nothing) AndAlso (TypeOf (obj) Is tblFabricant) AndAlso (CType(obj, tblFabricant).Id = Id)) End Function
Pour info, le log: Debut(15:49) SqlExec(15:53) Fin(16:18, 362113 elmts).
Est ce que faire du LINQ sur des listes annexes dans chaque boucle est optimisé (sinon, comment faire ?) ?
Est ce que le fait d'utiliser une BindingList pour faire une collection est optimisé (je l'ai fait pour éviter des casts) ?
[EDIT]
J'ai ôté tous mes GetById pour faire directement du New... et en gros, ça ne change pas grand chose: Debut(20:33) SqlExec(20:37) Fin(20:55, 362113 elmts).
18 secondes au lieu de 25, c'est toujours ça de prit, mais 18 c'est toujours énorme et ça me casse pas mal d'automatismes...
[/EDIT]
Merci d'avance.
Partager