さまざまな環境(dev、test、prod、predprod ...)のさまざまなデータベースを維持するプロジェクトデータベースがあるので、AUTO_CREATE_STATISTICS
およびAUTO_UPDATE_STATISTICSis
に設定 OFF/ON
各DBに対して、そしてそのOFF
-をON
に変更します。
ALTER DATABASE DB
SET AUTO_CREATE_STATISTICS ON
ALTER DATABASE DB
SET AUTO_UPDATE_STATISTICS ON
どうすればこれを達成できますか?
これは動的SQLクエリを使用します。システムデータベースは除外されます。 is_auto_create_stats_on
またはis_auto_update_stats_on
0 OFF
をチェックし、ON
に変更します
declare @sql nvarchar(max);
; with
db as
(
select name, is_auto_create_stats_on, is_auto_update_stats_on
from sys.databases
where name not in ('master', 'tempdb', 'model', 'msdb')
and (
is_auto_create_stats_on = 0
or is_auto_update_stats_on = 0
)
)
select @sql = isnull(@sql + char(13), '')
+ 'ALTER DATABASE ' + quotename(db.name) + ' '
+ 'SET ' + o.opt + ' ON;'
from db
cross apply
(
select opt = 'AUTO_CREATE_STATISTICS'
where is_auto_create_stats_on = 0
union all
select opt = 'AUTO_UPDATE_STATISTICS'
where is_auto_update_stats_on = 0
) o
-- print out for verification before execute
print @sql
exec sp_executesql @sql
実際の実行前に、sp_executesql
をマスクして結果を確認できます
DECLARE @SQL NVARCHAR(MAX) = ''
-- getting the commands list
SET @SQL = (
SELECT '' + x.cmd
FROM (
select 'ALTER DATABASE ' + QUOTENAME(name) + ' SET AUTO_CREATE_STATISTICS ON;' AS cmd
from sys.databases
WHERE database_id > 4
AND is_auto_create_stats_on = 0
UNION ALL
select 'ALTER DATABASE ' + QUOTENAME(name) + ' SET AUTO_UPDATE_STATISTICS ON;'
from sys.databases
WHERE database_id > 4
AND is_auto_update_stats_on = 0
) x
FOR XML PATH('')
);
IF @SQL IS NOT NULL BEGIN
SELECT @SQL;
--uncomment to execute
-- EXEC sp_executesql @SQL;
END