Je parcourt toutes mes bases de données et agrège les résultats dans une base de données d'agrégats.tsql Boucle avec requête externe
Dans ma boucle j'appelle
master.dbo.xp_cmdshell osql C:\whatever.SQL
Comme la boucle progresse, le cmdshell prend plus de temps et plus de temps à exécuter. Si j'arrête la boucle et exécute un agrégat unique pour une base de données, il s'exécute rapidement.
Y a-t-il quelque chose que je puisse ajouter à mon script SQL externe pour le faire fonctionner plus rapidement? Peut-être quelque chose à commettre et libérer les disques avant la prochaine boucle? Ou devrais-je ajouter une sorte de pause après chaque boucle?
Je souhaite utiliser un fichier SQL externe car il contient de nombreuses instructions de mise à jour, ce qui me permet de le gérer plus facilement.
Voici comment je boucle:
Update dbFoo.dbo.tblBar set Processed = 0 Go WHILE EXISTS (SELECT ID FROM dbFoo.dbo.tblBar WHERE Processed = 0) BEGIN SELECT @aRow = MIN(tblBar.ID) FROM dbFoo.dbo.tblBar SELECT @aFoo1 = Foo1 FROM dbFoo.dbo.tblBar WHERE ID = @aRow SELECT @aFoo2 = Foo2 FROM dbFoo.dbo.tblBar WHERE ID = @aRow SELECT @aFoo3 = Foo3 FROM dbFoo.dbo.tblWhatever WHERE Foo = @aFoo EXEC RunPreAgg @Foo1 = @aFoo1, @Foo2 = @aFoo2, @Foo3 = @aFoo3, @RetVal = @aRetVal OUTPUT SELECT returning = @aRetVal UPDATE dbFoo.dbo.tblBar SET Processed = 1 WHERE ID = @aRow END
Ensuite, la procédure stockée RunPreAgg fait essentiellement ceci:
if db_id('db' + @Foo1 + '_' + @Foo2) is not null
BEGIN
--This bat file creates the SQL File
select @sql = 'master.dbo.xp_cmdshell '''[email protected]+'wwwRunPreAgg.bat ' + @Foo1 + ' ' + @Foo2 + ' ' + @Foo3 + ''''
exec(@sql)
--execute
select @sql = 'master.dbo.xp_cmdshell ''osql -E -o '[email protected]+'output\tmp'[email protected]+'_'[email protected]+'.txt -i '[email protected]+'tmp' + @Foo1 + '.SQL'''
exec(@sql)
--This erases the SQL File
select @sql = 'master.dbo.xp_cmdshell '''[email protected]+'wwwCleanup.bat ' + @Foo1 + ' ' + @Foo2 + ''''
exec(@sql)
Set @retval = 'Done!'
END
ELSE
BEGIN
Set @retval = 'Err: No DataBase'
END
Les noms de variables sont changés pour protéger les innocents. Le code fonctionne bien, j'ai juste besoin d'optimiser.
peut-être vous devriez poster comment votre boucle à travers les bases de données? – DForck42
ok j'ai ajouté mon code en boucle – shitburg