Bonjour,
Je m'interroge.
Avant, j'avais une DB composée de plusieurs table non-indexée, avec des dates en char(8) et sans clef primaire.
J'ai refactorisé toute la DB comme expliqué ici et des requêtes qui prenaient 2 minutes avant en prennent plus de 30 maintenant.
Le fait d'avoir des types de données correct et des indexes n'est-il pas sensé améliorer le temps d'exécution des requêtes ?
Voici un exemple de requête incriminée
ancienne requête
nouvelle requête
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 with retours(siege, date, caisse, ticket, qt, ca, rab, eanart, carteclient) as ( select siege, date, caisse, ticket, qt, ca, rab, eanart, carteclient from tb2012_old where qt < 0 group by siege, date, caisse, ticket, qt, ca, rab, eanart, carteclient ), oublis(siege, date, caisse, ticket, qt, ca, rab, eanart, carteclient) as ( select a.siege, a.date, a.caisse, a.ticket, a.qt, a.ca, a.rab, a.eanart, a.carteclient from retours as a where exists(select * from tb2012_old as b where a.siege = b.siege and a.date = b.date and a.caisse = b.caisse and cast(a.ticket as int)+1 = cast(b.ticket as int) and a.ca = -b.ca and a.rab = -b.rab and a.qt = -b.qt and a.eanart = b.eanart and a.carteclient = '' and b.carteclient <> '') ) select siege, datepart(mm,cast(date as datetime)) as 'mois', sum(ca-rab) as 'valeur', 'R' as 'type' from retours where qt < 0 group by siege, datepart(mm,cast(date as datetime)) union select siege, datepart(mm,cast(date as datetime)) as 'mois', sum(ca-rab) as 'valeur', 'O' as 'type' from oublis where qt < 0 group by siege, datepart(mm,cast(date as datetime)) order by siege, datepart(mm,cast(date as datetime))
Le fait d'utiliser des CTE peut-il poser problème ?
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 with retours(siege, date_dt, caisse, ticket, qt, ca, rab, eanart, carteclient) as ( select siege, date_dt, caisse, ticket, qt, ca, rab, eanart, carteclient from tblTransactions where qt < 0 and year = 2012 group by siege, date_dt, caisse, ticket, qt, ca, rab, eanart, carteclient ), oublis(siege, date_dt, caisse, ticket, qt, ca, rab, eanart, carteclient) as ( select a.siege, a.date_dt, a.caisse, a.ticket, a.qt, a.ca, a.rab, a.eanart, a.carteclient from retours as a where exists(select * from tbltransactions as b where a.siege = b.siege and year = 2012 and a.date_dt = b.date_dt and a.caisse = b.caisse and cast(a.ticket as int)+1 = cast(b.ticket as int) and a.ca = -b.ca and a.rab = -b.rab and a.qt = -b.qt and a.eanart = b.eanart and a.carteclient = '' and b.carteclient <> '') ) select siege, datepart(mm,date_dt) as 'mois', sum(ca-rab) as 'valeur', 'R' as 'type' from retours where qt < 0 group by siege, datepart(mm,date_dt) union select siege, datepart(mm,date_dt) as 'mois', sum(ca-rab) as 'valeur', 'O' as 'type' from oublis where qt < 0 group by siege, datepart(mm,date_dt) order by siege, datepart(mm,date_dt)
Bref, je suis un peu perdu... (je précise que je ne suis pas du tout DBA mais que je dois bien m'y coller)
Partager