Hoi allemaal,
ik zit met de volgende situatie. Ik heb een gridview van orders (met paging) die per pagina 15 orders laat zien.
Dit gridview wordt gevuld met data (via LINQ) uit een MSSQL database.
Omwille van functionele eisen moet er een bepaalde sortering aan orders hangen op basis van status, bezorgdatum en ID.
De orders worden nu als volgt opgehaald:
Het duurt nu echter +/- 33 seconden om 15 orders (=maximumRows) op te halen.
Haal ik de sortering op basis van status weg en laat ik de bezorgdatum en id sortering staan, duurt het nog 'maar' 6 seconden. (Nog te lang naar mijn mening, maar dat is van latere zorg).
De query die wordt opgebouwd ziet er als volgt uit:
Ik heb een index op ID staan (primary key) en op deliverydate. Een index op status lijkt de boel alleen maar te vertragen.
Iemand een idee hoe ik hier een flinke performance winst uit kan halen? Want 33 seconden is simpelweg niet acceptabel.
En moet ik de DBML elke keer vernieuwen op het moment dat ik een index toevoeg?
ik zit met de volgende situatie. Ik heb een gridview van orders (met paging) die per pagina 15 orders laat zien.
Dit gridview wordt gevuld met data (via LINQ) uit een MSSQL database.
Omwille van functionele eisen moet er een bepaalde sortering aan orders hangen op basis van status, bezorgdatum en ID.
De orders worden nu als volgt opgehaald:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| IQueryable<OrderHead> orders = from oh in dc.orders where (oh.Receiver == memberID || oh.Sender == memberID) orderby (oh.Status == 1 && oh.Receiver == memberID ? 1 : oh.Status == 3 && oh.Receiver == memberID ? 1 : oh.Status == 5 && oh.Sender == memberID ? 0 : oh.Status == 6 && oh.Sender == memberID ? 0 : oh.Status == 7 && oh.Sender == memberID ? 0 : oh.Status == 8 && oh.Sender == memberID ? 0 : oh.Status == 20 ? 99 : 90), oh.DeliveryDate ascending, oh.ID ascending select oh; return orders.Skip(startRowIndex).Take(maximumRows) |
Het duurt nu echter +/- 33 seconden om 15 orders (=maximumRows) op te halen.
Haal ik de sortering op basis van status weg en laat ik de bezorgdatum en id sortering staan, duurt het nog 'maar' 6 seconden. (Nog te lang naar mijn mening, maar dat is van latere zorg).
De query die wordt opgebouwd ziet er als volgt uit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| SELECT ...kolommen... FROM ( SELECT ROW_NUMBER() OVER (ORDER BY (CASE WHEN ([t1].[Status] = 1) AND ([t1].[Receiver] = 8888) THEN 1 WHEN ([t1].[Status] = 3) AND ([t1].[Receiver] = 8888) THEN 1 WHEN ([t1].[Status] = 5) AND ([t1].[Sender] = 8888) THEN 0 WHEN ([t1].[Status] = 6) AND ([t1].[Sender] = 8888) THEN 0 WHEN ([t1].[Status] = 7) AND ([t1].[Sender] = 8888) THEN 0 WHEN ([t1].[Status] = 8) AND ([t1].[Sender] = 8888) THEN 0 WHEN [t1].[Status] = 20 THEN 99 ELSE 90 END), [t1].DeliveryDate, [t1].ID, [t1.ID]) AS [ROW_NUMBER], ...kolommen... FROM ( SELECT DISTINCT ...kolommen... FROM [dbo].[Orders] AS [t0] WHERE (([t0].[Receiver] = 8888) OR ([t0].[Sender] = 8888)) ) AS [t1] ) AS [t2] WHERE [t2].[ROW_NUMBER] BETWEEN 1 AND 15 ORDER BY [t2].[ROW_NUMBER] |
Ik heb een index op ID staan (primary key) en op deliverydate. Een index op status lijkt de boel alleen maar te vertragen.
Iemand een idee hoe ik hier een flinke performance winst uit kan halen? Want 33 seconden is simpelweg niet acceptabel.
En moet ik de DBML elke keer vernieuwen op het moment dat ik een index toevoeg?