Salut

Je cherche à optimiser le temps d'exécution d'une requette SQL sur SQL Server 2005 que voici

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
SELECT ENTITE_ID, TYPEENTITE_ID, TYPE_ID, OBJ_CMDS_MENS_NB
FROM FAC_DISTRIBUTION
WHERE (ENTITE_ID = 'xxxxxxxxxx')
      AND (TYPEENTITE_ID = 'xxxx')
      AND (PAYS_ID = 'BE')
      AND (CONSTRUCTEUR_ID = 1)
      AND (MARQUE_ID = 0)
      AND (TYPE_ID BETWEEN 1 AND 3)
      AND (PHASE_ID = 1)
      AND (PERIODE_ID = 7)
UNION ALL
SELECT ENTITE_ID, TYPEENTITE_ID, TYPE_ID, OBJ_CMDS_MENS_NB
FROM FAC_DISTRIBUTION
WHERE (ENTITE_ID = 'xxxxxxxxxx')
      AND (TYPEENTITE_ID = 'xxxx')
      AND (PAYS_ID = 'BE')
      AND (CONSTRUCTEUR_ID = 0)
      AND (MARQUE_ID = 0)
      AND (TYPE_ID BETWEEN 1 AND 3)
      AND (PHASE_ID = 1)
      AND (PERIODE_ID = 7)
UNION ALL
SELECT ENTITE_ID, TYPEENTITE_ID, TYPE_ID, OBJ_CMDS_MENS_NB
FROM FAC_DISTRIBUTION
WHERE (ENTITE_ID = 'xxxxxxxxxx')
      AND (TYPEENTITE_ID = 'xxxx')
      AND (PAYS_ID = 'BE')
      AND (CONSTRUCTEUR_ID = 0)
      AND (MARQUE_ID = 0)
      AND (TYPE_ID BETWEEN 1 AND 3)
      AND (PHASE_ID = 1)
      AND (PERIODE_ID = 7)
La table FAC_DISTRIBUTION est tirée d'un cube de données dont les... euh... "axes" (je sais plus si c'est le bon terme) sont :
ENTITE_ID
TYPEENTITE_ID
PAYS_ID
CONSTRUCTEUR_ID
MARQUE_ID
TYPE_ID
PHASE_ID
PERIODE_ID
en gros tout ce qu'il y a dans le where

Voilà le CREATE_TABLE
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
USE [xxxxxxxxxx]
GO
/****** Objet :  Table [dbo].[FAC_DISTRIBUTION]    Date de génération du script : 09/06/2007 15:01:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[FAC_DISTRIBUTION](
	[PAYS_ID] [char](2) NULL,
	[CONSTRUCTEUR_ID] [int] NULL,
	[PHASE_ID] [int] NULL,
	[TYPEENTITE_ID] [int] NULL,
	[PERIODE_ID] [int] NULL,
	[ENTITE_ID] [varchar](8) NULL,
	[TYPE_ID] [int] NULL,
	[MARQUE_ID] [int] NULL,
	[OBJ_LIV] [real] NULL,
	[REAL_CMDS_CUMUL_MOIS] [real] NULL,
	[CMDS_NET_MENS] [real] NULL,
	[OBJ_CMDS_MENS_NB] [real] NULL,
	[REAL_LIV_MOIS] [real] NULL,
	[LIV_CUM_MOIS] [real] NULL,
	[STK_VN_TOT] [real] NULL,
	[STK_VN_CM] [real] NULL,
	[STK_VN_NON_CM] [real] NULL,
	[PTF_CMDS] [real] NULL,
	[BTO] [real] NULL,
	[LANCE_FABRIC_CLIENT] [real] NULL,
	[LANCE_FABRIC] [real] NULL,
	[DEL_MADA_LIV] [real] NULL,
	[REAL_LIV_VVN] [real] NULL,
	[LIV_CUM_ANN] [real] NULL,
	[REAL_LEADS_ORDERS] [real] NULL,
	[LIV_CUM_ANN_PART] [real] NULL,
	[PRD_QTE_DEL_MADA_LIV] [real] NULL,
	[QTE_DEL_MADA_LIV] [real] NULL,
	[LIV_CUM_MOIS_PART] [real] NULL,
	[STK_VN_NON_CM_90_180] [real] NULL,
	[STK_VN_NON_CM_PLUS_180] [real] NULL
) ON [PRIMARY]
 
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION]  WITH CHECK ADD  CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_CONS] FOREIGN KEY([CONSTRUCTEUR_ID])
REFERENCES [dbo].[DIM_CONSTRUCTEUR] ([CONSTRUCTEUR_ID])
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION] CHECK CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_CONS]
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION]  WITH CHECK ADD  CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_ENTI] FOREIGN KEY([ENTITE_ID], [PAYS_ID], [TYPEENTITE_ID])
REFERENCES [dbo].[DIM_ENTITE] ([ENTITE_ID], [PAYS_ID], [TYPEENTITE_ID])
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION] CHECK CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_ENTI]
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION]  WITH CHECK ADD  CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_PERI] FOREIGN KEY([PERIODE_ID])
REFERENCES [dbo].[DIM_PERIODE] ([PERIODE_ID])
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION] CHECK CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_PERI]
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION]  WITH CHECK ADD  CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_PHAS] FOREIGN KEY([PHASE_ID])
REFERENCES [dbo].[DIM_PHASE] ([PHASE_ID])
GO
ALTER TABLE [dbo].[FAC_DISTRIBUTION] CHECK CONSTRAINT [FK_FAC_DIST_REFERENCE_DIM_PHAS]
Mon but est de tirer 3 lignes de données (une pour chaque type) pour chacune des 3 entités voulues (sachant qu'une entité est définie par son ENTITE_ID, son TYPEENTITE_ID et son PAYS_ID)

J'ai lu dans un vieux livre traitant de SQL ("SQL Avancé" de Joe Celko datant de 1999, donc un peu vieux mais toujours bon à lire) qu'il falait mettre en premier dans une clause where le filtre qui renverra potentiellement le moins de ligne... Est ce que c'est toujours vrai pour les SGDB actuels ? (de toute façon, c'est déjà le cas )

Il y avait aussi un passage indiquant qu'il falait éviter les "UNION" mais dans mon cas, remplacer par un "OR" ralentit le traitement (3x plus de temps à exécuter la requette)

Le UNION ALL me permet de réduire de 10ms le temps d'exécution (sur 680 actuellement c'est pas énorme, mais pour le moment, il n'y a qu'un pays d'intégré, et on risque de multiplier par 100 le nombre de lignes au final...)

Il faudrait presque que je diminue de moitié le temps d'exécution de cette requette, voire mieux

Est ce que vous n'auriez pas un lien qui explique comment réduire la consomation en temps d'exécution des requetes SQL ? (J'ai déjà lu 2 cours que j'ai trouvé dans la FAQ ici, mais je sais plus lesquels, c'est grâce à eux que j'ai réduit mes temps d'exécution de moitié )

J'ai beau parcourir google, je tombe quasiment toujours sur les même points à vérifier (ce qui est déjà fait) et à l'heure actuelle impossible d'utiliser les index (il faut qu'on regarde pourquoi la base de données a soudainement explosé au milieux du DD du serveur, il ne nous reste que 9Go de libre, pour une base de données de 359Go... les causes ne sont pas encore définies mais on s'y penche ). Bien sûr, une fois qu'on aura trouvé la "source" du problème, on pensera à indexer les tables (je penche pour les journaux de transaction au niveau du pb, mais ca c'est pas mon affaire ...). A ce moment là, que choisir comme index ? La liste des axes ? Cela me semble judicieux vu que le "WHERE" se fera toujours sur l'ensemble des axes... mais j'ai aussi peur que la base de données ne réexplose à cause de ces index (mais ca c'est un autre problème)

Sur ce, merci de m'avoir lu jusqu'au bout, et encore plus merci si vous êtes en train de répondre au message