Bonjour,

aujourd'hui, notre stratégie de gestion des indexes consiste à exécuter la procédure suivante tous les dimanches soir:

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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
 
        declare @cmd 		varchar(1000)
	declare @nomBase 	varchar(255)
	declare @mStatus	int
 
	declare tmpO cursor for select name from master..sysdatabases
				where name not in ('master', 'model', 'msdb', 'tempdb', 'redirection','ReportServerTempDB', 'ReportServer')
	open tmpO
	while 1 = 1 
		begin
			fetch next from tmpO into @nomBase
			if @@fetch_status <> 0 break
			begin
				select @mStatus = status  from master..sysdatabases
							where name = @nomBase
				print @nomBase + '  '+ cast(@mStatus as varchar(10))
 
				print '------------------------------ '+ @nomBase + ' - start ---------------------------'
				select @cmd = 'exec '+ @nomBase +'.dbo.admin_UpdateStatistics '
				exec(@cmd)
				print '------------------------------ '+ @nomBase + ' - ok ---------------------------'
				print '  '
			end
		end
	close tmpO
	deallocate tmpO
 
 
 
	create procedure [dbo].[admin_UpdateStatistics]
	as
 
	begin transaction ReCreationIndexes
 
	-- regÚnÚration des indexes 
	declare @tableName varchar(500)
	declare @cmd varchar(300)
	declare tmpC cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
 
	open tmpC
	while 1 = 1 
		begin
			fetch next from tmpC into @tableName
			if @@fetch_status <> 0 break
			begin
				set @cmd = 'DBCC DBREINDEX ('''+ @tableName + ''')'
				execute (@cmd)
			end
		end
	close tmpC
	deallocate tmpC
 
	commit transaction ReCreationIndexes
 
 
	-- update statistics
	declare tmpD cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'
 
	open tmpD
	while 1 = 1 
		begin
			fetch next from tmpD into @tableName
			if @@fetch_status <> 0 break
			begin
				set @cmd =  'update statistics ' + @tableName	
				execute (@cmd)
			end
		end
	close tmpD
	deallocate tmpD
 
	-- recompilation des proc. stockÚs.
	declare tmpE cursor for select TABLE_NAME from INFORMATION_SCHEMA.TABLES
 
	open tmpE
	while 1 = 1 
		begin
			fetch next from tmpE into @tableName
			if @@fetch_status <> 0 break
			begin
				set @cmd =  'sp_recompile ' + @tableName	
				execute (@cmd)
			end
		end
	close tmpE
	deallocate tmpE

Celle ci a été développé sur sqlserver2000 et n'est pas maintenu.

je pense qu'elle doit être revu mais j'aimerais pouvoir argumenter ce point.
Voici divers points/interrogations :
  • Pas d’exécution OnLine, du coup nous ne rafraichissons les indexes qu'une fois par semaine le dimanche soir (période creuse) car en semaine cela perturbe les batchs de nuit.

  • tous les indexes sont reconstruits que ce soit nécessaire ou non.

  • DBCC DBREINDEX est obsolète. Mais si dans l’immédiat nous restons sur sqlserver2008, y a-t-il des inconvénients à garder cette instruction?

  • on recompile toutes les procédures stockés systématiquement alors que la doc mssql indique:
    SQL Server recompile automatiquement les procédures stockées et les déclencheurs quand il est avantageux de le faire.
    Je pense donc que ce n'est pas nécessaire.


Pourriez vous confirmer ou corriger les points relevés et compléter la liste?


Pour remplacer notre procédure, j'ai recherché sur le net, j'ai trouvé 2 procédures :



Pourriez vous me faire un retour d’expérience sur ces 2 procédures?

Merci d'avance.

Cdt.