Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/07/2011, 15h14   #1
Invité de passage
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Bâtiment

Informations forums :
Inscription : juillet 2011
Messages : 2
Points : 0
Points : 0
Par défaut Partitionnement-Jointure-Procédures stockées-temps d'execution

Bonjour,

J'ai partitionné toutes mes tables de fait par mois.
Après partitionnement, l'alimentation de mes tables est beaucoup plus lent !! Augmentation de 75% !!!
L'alimentation de ces tables de faits se fait via des procédures stockées. Une
de ces procédures stockées contient un nombre important de jointures.
Je voulais savoir si les jointures augmente le temps de traitement par rapport à avant partitionnement.

En vous remerciant par avance pour vos réponses,

Cordialement,

Boul55
Boul55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 15h21   #2
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Attention, le partitionnement SQL ne se fait pas à la légère (comme le partitionnement SSAS d'ailleurs).
Qu'elle est le volume de chacune de vos partition ? Le nombre de lignes ?
Vos alimentation concerne-t-elle uniquement les données de la veille ou un rattrapage ?
Où s'effectue vos jointures ? entre vos sources et les tables de dimensions pour remplir les tables de faits ?
Entre les sources et vos tables de faits ?
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 15h44   #3
Invité de passage
 
Homme
Conseil - Consultant en systèmes d'information
Inscription : juillet 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Bâtiment

Informations forums :
Inscription : juillet 2011
Messages : 2
Points : 0
Points : 0
Mes tables de faits ont un volume très important. Après analyse par un expert, il a été décidé que 24 filegroups soient crées pour les 24 derniers mois. Un dernier filegroup est crée pour contenir le reste.
Une erreur s'est glissée dans mon post ! Ce ne sont pas mes tables de faits qui sont alimentes via les procédures stockées mais les tables d'agrégats qui sont recalculés depuis la nuit des temps !!!

Pour répondre à vos autres questions, je vous met ci dessous la procédure stockée :

Code :
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
USE [SextantODS]
GO
/****** Object:  StoredProcedure [dbo].[AlimAgrRisqueProArretNiv7]    Script Date: 07/29/2011 15:29:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE PROCEDURE [dbo].[AlimAgrRisqueProArretNiv7]
 
AS
 
/* Purge de la table */
TRUNCATE TABLE SextantDWH.dbo.AgrRisqueProArretNiv7
 
/* Alimentation a partir des tables de faits */
INSERT INTO [SextantDWH].[dbo].[AgrRisqueProArretNiv7]
           ([IdDate]
           ,[IdOrganisationNiv1]
           ,[IdOrganisationNiv2]
           ,[IdOrganisationNiv3]
           ,[IdOrganisationNiv4]
           ,[IdOrganisationNiv5]
           ,[IdOrganisationNiv6]
           ,[IdOrganisationNiv7]
           ,[IdSexe]
           ,[IdCategorieSocioPro]
           ,[IdNatureContratTravail]
           ,[IdTypeContratTravail]
           ,[IdTrancheAge]
           ,[IdTrancheAncienneteGroupe]
           ,[NbJoursArretSuiteAccTravailMois]
           ,[NbJoursArretSuiteAccTravailTrimestre]
           ,[NbJoursArretSuiteAccTravailAnnee]
           ,[NbJourArretSuiteAccTravail3Annee]
           ,[NbJourArretSuiteAccTravailPremierJanvier]
		   ,[NbJourArretTauxReg])
SELECT 
		  drv3Annee.IdDate
		, MAX(drv3Annee.IdOrganisationNiv1) AS IdOrganisationNiv1
		, MAX(drv3Annee.IdOrganisationNiv2) AS IdOrganisationNiv2
		, MAX(drv3Annee.IdOrganisationNiv3) AS IdOrganisationNiv3
		, MAX(drv3Annee.IdOrganisationNiv4) AS IdOrganisationNiv4
		, MAX(drv3Annee.IdOrganisationNiv5) AS IdOrganisationNiv5
		, MAX(drv3Annee.IdOrganisationNiv6) AS IdOrganisationNiv6
		, drv3Annee.IdOrganisationNiv7
		, drv3Annee.[IdSexe]
		, drv3Annee.[IdCategorieSocioPro]
		, drv3Annee.[IdNatureContratTravail]
		, drv3Annee.[IdTypeContratTravail]
		, drv3Annee.[IdTrancheAge]
		, drv3Annee.[IdTrancheAncienneteGroupe]
		, SUM(isnull(drvMois.NbJourMois,0)) AS NbJoursArretSuiteAccTravailMois
		, SUM(isnull(drvTrim.NbJourTrim,0)) AS NbJoursArretSuiteAccTravailTrimestre
		, SUM(isnull(drvAnnee.NbJourAnnee,0)) AS NbJoursArretSuiteAccTravailAnnee
		, SUM(isnull(drv3Annee.NbJour3Annee,0)) AS NbJourArretSuiteAccTravail3Annee
		, SUM(isnull(drv1erjanv.NbJour1erjanv,0)) AS NbJourArretSuiteAccTravailPremierJanvier
		, SUM(isnull(drvTxReg.NbJourAnnee,0)) AS NbJourArretTauxReg
FROM
-- Nb de jours d'arret dans les 36 mois glissants dus à un accident survenu dans les 36 mois glissants
	(SELECT dd4.IdDate, fta4.IdOrganisationNiv1, fta4.IdOrganisationNiv2, fta4.IdOrganisationNiv3
			, fta4.IdOrganisationNiv4, fta4.IdOrganisationNiv5
			, fta4.IdOrganisationNiv6, fta4.IdOrganisationNiv7
			, isnull(fta4.IdSexe,1) AS IdSexe
			, isnull(fta4.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta4.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta4.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta4.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta4.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta4.NbJourArretCalendaire) NbJour3Annee
	FROM
		SextantDWH.dbo.RefDateAlimentation ref4
	JOIN SextantDWH.dbo.DimDate dd4
		ON dd4.DateDernierJour = dd4.Jour
		AND dd4.IdDate >= 20080101
		AND dd4.IdDate <= ref4.IdDateDonnee
	JOIN SextantDWH.dbo.DimDate DebPer4
		ON DebPer4.DateDernierJour = DebPer4.Jour
		AND datediff(m, DebPer4.Jour, dd4.Jour)=35
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd4
			ON ftd4.IdDateAccidentTravail BETWEEN DebPer4.IdDate/100*100 + 1 AND dd4.IdDate
	JOIN SextantDWH.dbo.DimContestation dc4
			ON dc4.IdContestation = ftd4.IdContestation
			AND dc4.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd4.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta4
			ON fta4.IdAccidentTravail = ftd4.IdAccidentTravail
			AND fta4.IdDate BETWEEN DebPer4.IdDate/100*100 + 1 AND dd4.IdDate
	INNER JOIN SextantDWH.dbo.DimOrganisationNiv4 do4
			ON do4.IdOrganisationNiv4 = ftd4.IdOrganisationNiv4
			AND do4.EstSocieteEtrangere = 0
	GROUP BY dd4.IdDate, fta4.IdOrganisationNiv1, fta4.IdOrganisationNiv2, fta4.IdOrganisationNiv3
			, fta4.IdOrganisationNiv4, fta4.IdOrganisationNiv5
			, fta4.IdOrganisationNiv6, fta4.IdOrganisationNiv7
			, isnull(fta4.IdSexe,1), isnull(fta4.IdCategorieSocioPro,1)
			, isnull(fta4.IdNatureContratTravail,1), isnull(fta4.IdTypeContratTravail,1)
			, isnull(fta4.IdTrancheAge,1), isnull(fta4.IdTrancheAncienneteGroupe,1)
	) drv3Annee
 
-- Nb de jours d'arret dans les 12 mois glissants dus à un accident survenu dans les 12 mois glissants
LEFT OUTER JOIN
	(SELECT dd3.IdDate, fta3.IdOrganisationNiv1, fta3.IdOrganisationNiv2, fta3.IdOrganisationNiv3
			, fta3.IdOrganisationNiv4, fta3.IdOrganisationNiv5
			, fta3.IdOrganisationNiv6, fta3.IdOrganisationNiv7
			, isnull(fta3.IdSexe,1) AS IdSexe
			, isnull(fta3.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta3.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta3.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta3.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta3.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta3.NbJourArretCalendaire) NbJourAnnee
	FROM
		SextantDWH.dbo.RefDateAlimentation ref3
	JOIN SextantDWH.dbo.DimDate dd3
		ON dd3.DateDernierJour = dd3.Jour
		AND dd3.IdDate >= 20080101
		AND dd3.IdDate <= ref3.IdDateDonnee
	JOIN SextantDWH.dbo.DimDate DebPer3
		ON DebPer3.DateDernierJour = DebPer3.Jour
		AND datediff(m, DebPer3.Jour, dd3.Jour)=11
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd3
			ON ftd3.IdDateAccidentTravail BETWEEN DebPer3.IdDate/100*100 + 1 AND dd3.IdDate
	JOIN SextantDWH.dbo.DimContestation dc3
			ON dc3.IdContestation = ftd3.IdContestation
			AND dc3.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd3.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta3
			ON fta3.IdAccidentTravail = ftd3.IdAccidentTravail
			AND fta3.IdDate BETWEEN DebPer3.IdDate/100*100 + 1 AND dd3.IdDate
	GROUP BY dd3.IdDate, fta3.IdOrganisationNiv1, fta3.IdOrganisationNiv2, fta3.IdOrganisationNiv3
			, fta3.IdOrganisationNiv4, fta3.IdOrganisationNiv5
			, fta3.IdOrganisationNiv6, fta3.IdOrganisationNiv7
			, isnull(fta3.IdSexe,1), isnull(fta3.IdCategorieSocioPro,1)
			, isnull(fta3.IdNatureContratTravail,1), isnull(fta3.IdTypeContratTravail,1)
			, isnull(fta3.IdTrancheAge,1), isnull(fta3.IdTrancheAncienneteGroupe,1)
	) drvAnnee
ON
		drvAnnee.IdDate = drv3Annee.IdDate
	AND drvAnnee.IdOrganisationNiv1 = drv3Annee.IdOrganisationNiv1
	AND drvAnnee.IdOrganisationNiv2 = drv3Annee.IdOrganisationNiv2
	AND drvAnnee.IdOrganisationNiv3 = drv3Annee.IdOrganisationNiv3
	AND drvAnnee.IdOrganisationNiv4 = drv3Annee.IdOrganisationNiv4
	AND drvAnnee.IdOrganisationNiv5 = drv3Annee.IdOrganisationNiv5
	AND drvAnnee.IdOrganisationNiv6 = drv3Annee.IdOrganisationNiv6
	AND drvAnnee.IdOrganisationNiv7 = drv3Annee.IdOrganisationNiv7
	AND drvAnnee.IdSexe = drv3Annee.IdSexe
	AND drvAnnee.IdCategorieSocioPro = drv3Annee.IdCategorieSocioPro
	AND drvAnnee.IdNatureContratTravail = drv3Annee.IdNatureContratTravail
	AND drvAnnee.IdTypeContratTravail = drv3Annee.IdTypeContratTravail
	AND drvAnnee.IdTrancheAge = drv3Annee.IdTrancheAge
	AND drvAnnee.IdTrancheAncienneteGroupe = drv3Annee.IdTrancheAncienneteGroupe
 
-- Nb de jours d'arret depuis le 1er janvier dus à un accident survenu depuis le 1er janvier
LEFT OUTER JOIN
	(SELECT dd3.IdDate, fta3.IdOrganisationNiv1, fta3.IdOrganisationNiv2, fta3.IdOrganisationNiv3
			, fta3.IdOrganisationNiv4, fta3.IdOrganisationNiv5
			, fta3.IdOrganisationNiv6, fta3.IdOrganisationNiv7
			, isnull(fta3.IdSexe,1) AS IdSexe
			, isnull(fta3.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta3.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta3.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta3.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta3.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta3.NbJourArretCalendaire) NbJour1erjanv
	FROM
		SextantDWH.dbo.RefDateAlimentation ref3
	JOIN SextantDWH.dbo.DimDate dd3
		ON dd3.DateDernierJour = dd3.Jour
		AND dd3.IdDate >= 20080101
		AND dd3.IdDate <= ref3.IdDateDonnee
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd3
			ON ftd3.IdDateAccidentTravail BETWEEN (dd3.IdDate/10000 * 10000)+101 AND dd3.IdDate
	JOIN SextantDWH.dbo.DimContestation dc3
			ON dc3.IdContestation = ftd3.IdContestation
			AND dc3.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd3.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta3
			ON fta3.IdAccidentTravail = ftd3.IdAccidentTravail
			AND fta3.IdDate BETWEEN (dd3.IdDate/10000 * 10000)+101 AND dd3.IdDate
	GROUP BY dd3.IdDate, fta3.IdOrganisationNiv1, fta3.IdOrganisationNiv2, fta3.IdOrganisationNiv3
			, fta3.IdOrganisationNiv4, fta3.IdOrganisationNiv5
			, fta3.IdOrganisationNiv6, fta3.IdOrganisationNiv7
			, isnull(fta3.IdSexe,1), isnull(fta3.IdCategorieSocioPro,1)
			, isnull(fta3.IdNatureContratTravail,1), isnull(fta3.IdTypeContratTravail,1)
			, isnull(fta3.IdTrancheAge,1), isnull(fta3.IdTrancheAncienneteGroupe,1)
	) drv1erjanv
ON
		drv1erjanv.IdDate = drv3Annee.IdDate
	AND drv1erjanv.IdOrganisationNiv1 = drv3Annee.IdOrganisationNiv1
	AND drv1erjanv.IdOrganisationNiv2 = drv3Annee.IdOrganisationNiv2
	AND drv1erjanv.IdOrganisationNiv3 = drv3Annee.IdOrganisationNiv3
	AND drv1erjanv.IdOrganisationNiv4 = drv3Annee.IdOrganisationNiv4
	AND drv1erjanv.IdOrganisationNiv5 = drv3Annee.IdOrganisationNiv5
	AND drv1erjanv.IdOrganisationNiv6 = drv3Annee.IdOrganisationNiv6
	AND drv1erjanv.IdOrganisationNiv7 = drv3Annee.IdOrganisationNiv7
	AND drv1erjanv.IdSexe = drv3Annee.IdSexe
	AND drv1erjanv.IdCategorieSocioPro = drv3Annee.IdCategorieSocioPro
	AND drv1erjanv.IdNatureContratTravail = drv3Annee.IdNatureContratTravail
	AND drv1erjanv.IdTypeContratTravail = drv3Annee.IdTypeContratTravail
	AND drv1erjanv.IdTrancheAge = drv3Annee.IdTrancheAge
	AND drv1erjanv.IdTrancheAncienneteGroupe = drv3Annee.IdTrancheAncienneteGroupe
 
-- Nb de jours d'arret dus à un accident survenu depuis le debut du trimestre
LEFT OUTER JOIN
	(SELECT dd2.IdDate, fta2.IdOrganisationNiv1, fta2.IdOrganisationNiv2, fta2.IdOrganisationNiv3
			, fta2.IdOrganisationNiv4, fta2.IdOrganisationNiv5
			, fta2.IdOrganisationNiv6, fta2.IdOrganisationNiv7
			, isnull(fta2.IdSexe,1) AS IdSexe
			, isnull(fta2.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta2.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta2.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta2.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta2.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta2.NbJourArretCalendaire) NbJourTrim
	 FROM
		SextantDWH.dbo.RefDateAlimentation ref2
		JOIN SextantDWH.dbo.DimDate dd2
		ON DateDernierJour = Jour
		AND IdDate >= 20080101
		AND IdDate <= ref2.IdDateDonnee
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd2
			ON ftd2.IdDateAccidentTravail BETWEEN dd2.IdDate/10000*10000 + ((dd2.IdDate/100-dd2.IdDate/10000*100-1)/3*3+1)*100 + 1 AND dd2.IdDate
	JOIN SextantDWH.dbo.DimContestation dc2
			ON dc2.IdContestation = ftd2.IdContestation
			AND dc2.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd2.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta2
			ON fta2.IdAccidentTravail = ftd2.IdAccidentTravail
			AND fta2.IdDate BETWEEN dd2.IdDate/10000*10000 + ((dd2.IdDate/100-dd2.IdDate/10000*100-1)/3*3+1)*100 + 1 AND dd2.IdDate
	GROUP BY dd2.IdDate, fta2.IdOrganisationNiv1, fta2.IdOrganisationNiv2, fta2.IdOrganisationNiv3
			, fta2.IdOrganisationNiv4, fta2.IdOrganisationNiv5
			, fta2.IdOrganisationNiv6, fta2.IdOrganisationNiv7
			, isnull(fta2.IdSexe,1), isnull(fta2.IdCategorieSocioPro,1)
			, isnull(fta2.IdNatureContratTravail,1), isnull(fta2.IdTypeContratTravail,1)
			, isnull(fta2.IdTrancheAge,1), isnull(fta2.IdTrancheAncienneteGroupe,1)
	) drvTrim
ON
		drvTrim.IdDate = drv3Annee.IdDate
	AND drvTrim.IdOrganisationNiv1 = drv3Annee.IdOrganisationNiv1
	AND drvTrim.IdOrganisationNiv2 = drv3Annee.IdOrganisationNiv2
	AND drvTrim.IdOrganisationNiv3 = drv3Annee.IdOrganisationNiv3
	AND drvTrim.IdOrganisationNiv4 = drv3Annee.IdOrganisationNiv4
	AND drvTrim.IdOrganisationNiv5 = drv3Annee.IdOrganisationNiv5
	AND drvTrim.IdOrganisationNiv6 = drv3Annee.IdOrganisationNiv6
	AND drvTrim.IdOrganisationNiv7 = drv3Annee.IdOrganisationNiv7
	AND drvTrim.IdSexe = drv3Annee.IdSexe
	AND drvTrim.IdCategorieSocioPro = drv3Annee.IdCategorieSocioPro
	AND drvTrim.IdNatureContratTravail = drv3Annee.IdNatureContratTravail
	AND drvTrim.IdTypeContratTravail = drv3Annee.IdTypeContratTravail
	AND drvTrim.IdTrancheAge = drv3Annee.IdTrancheAge
	AND drvTrim.IdTrancheAncienneteGroupe = drv3Annee.IdTrancheAncienneteGroupe
 
-- Nb de jours d'arret dus à un accident survenu dans le mois
LEFT OUTER JOIN
	(SELECT dd.IdDate, fta1.IdOrganisationNiv1, fta1.IdOrganisationNiv2, fta1.IdOrganisationNiv3
			, fta1.IdOrganisationNiv4, fta1.IdOrganisationNiv5
			, fta1.IdOrganisationNiv6, fta1.IdOrganisationNiv7
			, isnull(fta1.IdSexe,1) AS IdSexe
			, isnull(fta1.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta1.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta1.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta1.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta1.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta1.NbJourArretCalendaire) NbJourMois
	 FROM
		SextantDWH.dbo.RefDateAlimentation ref
		JOIN SextantDWH.dbo.DimDate dd
		ON DateDernierJour = Jour
		AND IdDate >= 20080101
		AND IdDate <= ref.IdDateDonnee
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd1
		ON ftd1.IdDateAccidentTravail BETWEEN dd.IdDate/100*100+1 AND dd.IdDate
	JOIN SextantDWH.dbo.DimContestation dc1
		ON dc1.IdContestation = ftd1.IdContestation
		AND dc1.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd1.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta1
		ON fta1.IdAccidentTravail = ftd1.IdAccidentTravail
		AND fta1.IdDate BETWEEN dd.IdDate/100*100+1 AND dd.IdDate
	GROUP BY dd.IdDate, fta1.IdOrganisationNiv1, fta1.IdOrganisationNiv2, fta1.IdOrganisationNiv3
			, fta1.IdOrganisationNiv4, fta1.IdOrganisationNiv5
			, fta1.IdOrganisationNiv6, fta1.IdOrganisationNiv7
			, isnull(fta1.IdSexe,1), isnull(fta1.IdCategorieSocioPro,1)
			, isnull(fta1.IdNatureContratTravail,1), isnull(fta1.IdTypeContratTravail,1)
			, isnull(fta1.IdTrancheAge,1), isnull(fta1.IdTrancheAncienneteGroupe,1)
	) drvMois
ON
		drvMois.IdDate = drv3Annee.IdDate
	AND drvMois.IdOrganisationNiv1 = drv3Annee.IdOrganisationNiv1
	AND drvMois.IdOrganisationNiv2 = drv3Annee.IdOrganisationNiv2
	AND drvMois.IdOrganisationNiv3 = drv3Annee.IdOrganisationNiv3
	AND drvMois.IdOrganisationNiv4 = drv3Annee.IdOrganisationNiv4
	AND drvMois.IdOrganisationNiv5 = drv3Annee.IdOrganisationNiv5
	AND drvMois.IdOrganisationNiv6 = drv3Annee.IdOrganisationNiv6
	AND drvMois.IdOrganisationNiv7 = drv3Annee.IdOrganisationNiv7
	AND drvMois.IdSexe = drv3Annee.IdSexe
	AND drvMois.IdCategorieSocioPro = drv3Annee.IdCategorieSocioPro
	AND drvMois.IdNatureContratTravail = drv3Annee.IdNatureContratTravail
	AND drvMois.IdTypeContratTravail = drv3Annee.IdTypeContratTravail
	AND drvMois.IdTrancheAge = drv3Annee.IdTrancheAge
	AND drvMois.IdTrancheAncienneteGroupe = drv3Annee.IdTrancheAncienneteGroupe
 
-- Nb de jours d'arret des 12 derniers mois dus à un accident survenu au cours des 36 derniers mois
LEFT OUTER JOIN
	(SELECT dd5.IdDate, fta5.IdOrganisationNiv1, fta5.IdOrganisationNiv2, fta5.IdOrganisationNiv3
			, fta5.IdOrganisationNiv4, fta5.IdOrganisationNiv5
			, fta5.IdOrganisationNiv6, fta5.IdOrganisationNiv7
			, isnull(fta5.IdSexe,1) AS IdSexe
			, isnull(fta5.IdCategorieSocioPro,1) AS IdCategorieSocioPro
			, isnull(fta5.IdNatureContratTravail,1) AS IdNatureContratTravail
			, isnull(fta5.IdTypeContratTravail,1) AS IdTypeContratTravail
			, isnull(fta5.IdTrancheAge,1) AS IdTrancheAge
			, isnull(fta5.IdTrancheAncienneteGroupe,1) AS IdTrancheAncienneteGroupe
			, sum(fta5.NbJourArretCalendaire) NbJourAnnee
	FROM
		SextantDWH.dbo.RefDateAlimentation ref5
	JOIN SextantDWH.dbo.DimDate dd5
		ON dd5.DateDernierJour = dd5.Jour
		AND dd5.IdDate >= 20080101
		AND dd5.IdDate <= ref5.IdDateDonnee
	JOIN SextantDWH.dbo.DimDate DebPerAcc5
		ON DebPerAcc5.DateDernierJour = DebPerAcc5.Jour
		AND datediff(m, DebPerAcc5.Jour, dd5.Jour)=35
	JOIN SextantDWH.dbo.DimDate DebPerArr5
		ON DebPerArr5.DateDernierJour = DebPerArr5.Jour
		AND datediff(m, DebPerArr5.Jour, dd5.Jour)=11
	JOIN SextantDWH.dbo.FtDeclarationAccidentTravail ftd5
			ON ftd5.IdDateAccidentTravail BETWEEN DebPerAcc5.IdDate/100*100 + 1 AND dd5.IdDate
	JOIN SextantDWH.dbo.DimContestation dc5
			ON dc5.IdContestation = ftd5.IdContestation
			AND dc5.LibResultatContestation != 'REJETTE'
	JOIN SextantDWH.dbo.DimTypeAccident dta
			ON  dta.IdTypeAccident = ftd5.IdTypeAccident
			AND LEFT(LibTypeAccident,2) = 'AT'
	JOIN SextantDWH.dbo.FtRisqueProDetailArretMens fta5
			ON fta5.IdAccidentTravail = ftd5.IdAccidentTravail
			AND fta5.IdDate BETWEEN DebPerArr5.IdDate/100*100 + 1 AND dd5.IdDate
	GROUP BY dd5.IdDate, fta5.IdOrganisationNiv1, fta5.IdOrganisationNiv2, fta5.IdOrganisationNiv3
			, fta5.IdOrganisationNiv4, fta5.IdOrganisationNiv5
			, fta5.IdOrganisationNiv6, fta5.IdOrganisationNiv7
			, isnull(fta5.IdSexe,1), isnull(fta5.IdCategorieSocioPro,1)
			, isnull(fta5.IdNatureContratTravail,1), isnull(fta5.IdTypeContratTravail,1)
			, isnull(fta5.IdTrancheAge,1), isnull(fta5.IdTrancheAncienneteGroupe,1)
	) drvTxReg
ON
		drvTxReg.IdDate = drv3Annee.IdDate
	AND drvTxReg.IdOrganisationNiv1 = drv3Annee.IdOrganisationNiv1
	AND drvTxReg.IdOrganisationNiv2 = drv3Annee.IdOrganisationNiv2
	AND drvTxReg.IdOrganisationNiv3 = drv3Annee.IdOrganisationNiv3
	AND drvTxReg.IdOrganisationNiv4 = drv3Annee.IdOrganisationNiv4
	AND drvTxReg.IdOrganisationNiv5 = drv3Annee.IdOrganisationNiv5
	AND drvTxReg.IdOrganisationNiv6 = drv3Annee.IdOrganisationNiv6
	AND drvTxReg.IdOrganisationNiv7 = drv3Annee.IdOrganisationNiv7
	AND drvTxReg.IdSexe = drv3Annee.IdSexe
	AND drvTxReg.IdCategorieSocioPro = drv3Annee.IdCategorieSocioPro
	AND drvTxReg.IdNatureContratTravail = drv3Annee.IdNatureContratTravail
	AND drvTxReg.IdTypeContratTravail = drv3Annee.IdTypeContratTravail
	AND drvTxReg.IdTrancheAge = drv3Annee.IdTrancheAge
	AND drvTxReg.IdTrancheAncienneteGroupe = drv3Annee.IdTrancheAncienneteGroupe
 
 
GROUP BY 
		  drv3Annee.IdDate
		, drv3Annee.IdOrganisationNiv7
		, drv3Annee.[IdSexe]
		, drv3Annee.[IdCategorieSocioPro]
		, drv3Annee.[IdNatureContratTravail]
		, drv3Annee.[IdTypeContratTravail]
		, drv3Annee.[IdTrancheAge]
		, drv3Annee.[IdTrancheAncienneteGroupe]
Merci de votre aide.
Cordialement,
Boul55 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 23h39   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 777
Points : 17 777
Si cette base est un datawarehouse et quelle est utilisée directement en décisionnel de type ROLAP, le partitionnement n'est certainement pas la meilleures chose.
Le but d'un partitionnement est de n'utiliser si possible qu'une seule partition pour manipuler les données. Le fait de multiplier les partitions sans avoir prévu:
1) que toutes les requêtes incorporent le critrère de partitionnement
2) que chaque requête ne tape jamais que dans une seule partition à la fois
3) que le matériel de votre serveur soit en adéquation avec le partitionnement
est généralement contre performant.
Lisez l'article que j'ai écrit à ce sujet : http://blog.developpez.com/sqlpro/p9...r-ameliorer-l/
Sachez que l'on ne partitionne jamais à la légère et qu'il faut avant tout auditer les requêtes qui vont être lancées sur la table et maquetter la solution avant de la mettre en production.
De plus je pense que dans le cas d'un DW décisionnel, avoir plus de partition que de CPU et d'agrégat disque physiques différents sur votre machine est une hérésie !
Sans vouloir être méchant, il est probable que votre soit disant expert a profité de votre crédulité pour vous vendre un service inutile ou mal conçu !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 08h16   #5
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Si
- le partitionnement concerne uniquement les tables de faits, non celles d'agrégats
- l'alimentation des tables d'agrégats se fait en incrémentiel, uniquement sur le dernier mois
- les cubes sont également paritionnés de la même manière et que ceux-ci s'alimentent partition par partition
- les requêtes SQL des rapports interrogent quasiment uniquement les tables d'agrégats
- les considérations de "configuration machine" citées par SQLPro sont prises en compte
alors ça serait utile il me semble.
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 09h34   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 954
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 954
Points : 17 777
Points : 17 777
Oui, tu as raison, mais à la lecture des requêtes je doute que ce soit le cas ! Puisqu'il commence par vider intégralement la table... (TRUNCATE).

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 20h32   #7
Responsable SQL Server

 
Avatar de mikedavem
 
Homme David BARBARIN
Expert SQL Server
Inscription : août 2005
Messages : 3 724
Détails du profil
Informations personnelles :
Nom : Homme David BARBARIN
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Expert SQL Server
Secteur : Conseil

Informations forums :
Inscription : août 2005
Messages : 3 724
Points : 6 848
Points : 6 848
Effectivement la table est vidée entièrement via le TRUNCATE. On perd vraiment l'intérêt du partitionnement ici où un chargement incrémentiel serait plus adapté.

Quel est votre schéma de partitionnement d'ailleurs ? Vous créez des partitions par mois mais que faites vous lorsque le 12ème mois est dépassé ? Adoptez vous une stratégie de fenêtre glissante (ou sliding Windows)

++
mikedavem est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h24.


 
 
 
 
Partenaires

Hébergement Web