Dans le cadre de tests de performances, j’ai cherché une solution pour remettre à zéro les statistiques présentées sur l’écran Query Performance du portail de management SQL AZURE.

SQLAzure_QueryPerformance

J’ai rapidement découvert l’instruction DBCC FREEPROCACHE. Cette instruction permet en effet de supprimer les plans d’exécution mis en cache par SQL SERVER. Celle- ci n’est malheureusement pas supportée par SQL AZURE.

En cherchant un petit peu, j’ai découvert une solution simple et efficace pour contourner ce problème sur le blog de Christian Rodriguez. La solution consiste à modifier temporairement les tables de la base de données pour provoquer la suppression automatique des plans d’exécution en cache.

Voici le script :

</p>
<p>SET NOCOUNT ON<br />
DECLARE @lcl_name VARCHAR(100)<br />
DECLARE @addcolumnSql nVARCHAR(MAX)<br />
DECLARE @dropcolumnSql nVARCHAR(MAX)<br />
DECLARE cur_name CURSOR FOR</p>
<p>SELECT name<br />
FROM sysobjects<br />
WHERE type = 'U'</p>
<p>OPEN cur_name<br />
FETCH NEXT FROM cur_name INTO @lcl_name<br />
WHILE @@Fetch_status = 0<br />
BEGIN<br />
  SET @addcolumnSql = 'alter table [' + @lcl_name + '] add temp_col_to_clear_exec_plan bit'<br />
  EXECUTE sp_executesql @addcolumnSql<br />
  PRINT @addcolumnSql<br />
  SET @dropcolumnSql = 'alter table [' + @lcl_name + '] drop column temp_col_to_clear_exec_plan'<br />
  EXECUTE sp_executesql @dropcolumnSql<br />
  PRINT @dropcolumnSql<br />
  FETCH NEXT FROM cur_name INTO @lcl_name<br />
END<br />
CLOSE cur_name</p>
<p>DEALLOCATE cur_name<br />
SET NOCOUNT OFF<br />

Ce script m’a été très utile pour mes tests, j’espère que cette astuce vous servira également.