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
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))
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
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)
Le fait d'utiliser des CTE peut-il poser problème ?

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)