このT-SQLスクリプトは、SUSDBデータベース(Windows Server Update Services (WSUS) で使用されるデータベース)の
基本的なメンテナンス作業を実行します。具体的には、インデックスの最適化と統計情報の更新を行います。
以下に、コードの各部分を解説します。
1. インデックスの断片化解消と最適化
USE SUSDB;
GO
SET NOCOUNT ON;
-- 断片化レベルに基づいて再構築または再編成するインデックスを特定
DECLARE @work_to_do TABLE (
objectid int,
indexid int,
pagedensity float,
fragmentation float,
numrows int
)
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @numrows int
DECLARE @density float;
DECLARE @fragmentation float;
DECLARE @command nvarchar(4000);
DECLARE @fillfactorset bit
DECLARE @numpages int
-- 断片化を推定し、必要なインデックスを特定
PRINT 'Estimating fragmentation: Begin. ' + convert(nvarchar, getdate(), 121)
INSERT @work_to_do
SELECT
f.object_id,
index_id,
avg_page_space_used_in_percent,
avg_fragmentation_in_percent,
record_count
FROM
sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, 'SAMPLED') AS f
WHERE
(f.avg_page_space_used_in_percent < 85.0 and f.avg_page_space_used_in_percent/100.0 * page_count < page_count - 1)
or (f.page_count > 50 and f.avg_fragmentation_in_percent > 15.0)
or (f.page_count > 10 and f.avg_fragmentation_in_percent > 80.0)
PRINT 'Number of indexes to rebuild: ' + cast(@@ROWCOUNT as nvarchar(20))
PRINT 'Estimating fragmentation: End. ' + convert(nvarchar, getdate(), 121)
SELECT @numpages = sum(ps.used_page_count)
FROM
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id
-- 処理するインデックスのリストのカーソルを宣言
DECLARE curIndexes CURSOR FOR SELECT * FROM @work_to_do
-- カーソルを開く
OPEN curIndexes
-- インデックスをループ処理
WHILE (1=1)
BEGIN
FETCH NEXT FROM curIndexes
INTO @objectid, @indexid, @density, @fragmentation, @numrows;
IF @@FETCH_STATUS < 0 BREAK;
SELECT
@objectname = QUOTENAME(o.name),
@schemaname = QUOTENAME(s.name)
FROM
sys.objects AS o
INNER JOIN sys.schemas as s ON s.schema_id = o.schema_id
WHERE
o.object_id = @objectid;
SELECT
@indexname = QUOTENAME(name),
@fillfactorset = CASE fill_factor WHEN 0 THEN 0 ELSE 1 END
FROM
sys.indexes
WHERE
object_id = @objectid AND index_id = @indexid;
IF ((@density BETWEEN 75.0 AND 85.0) AND @fillfactorset = 1) OR (@fragmentation < 30.0)
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REORGANIZE';
ELSE IF @numrows >= 5000 AND @fillfactorset = 0
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD WITH (FILLFACTOR = 90)';
ELSE
SET @command = N'ALTER INDEX ' + @indexname + N' ON ' + @schemaname + N'.' + @objectname + N' REBUILD';
PRINT convert(nvarchar, getdate(), 121) + N' Executing: ' + @command;
EXEC (@command);
PRINT convert(nvarchar, getdate(), 121) + N' Done.';
END
-- カーソルを閉じて割り当てを解除
CLOSE curIndexes;
DEALLOCATE curIndexes;
IF EXISTS (SELECT * FROM @work_to_do)
BEGIN
PRINT 'Estimated number of pages in fragmented indexes: ' + cast(@numpages as nvarchar(20))
SELECT @numpages = @numpages - sum(ps.used_page_count)
FROM
@work_to_do AS fi
INNER JOIN sys.indexes AS i ON fi.objectid = i.object_id and fi.indexid = i.index_id
INNER JOIN sys.dm_db_partition_stats AS ps on i.object_id = ps.object_id and i.index_id = ps.index_id
PRINT 'Estimated number of pages freed: ' + cast(@numpages as nvarchar(20))
END
GO
§断片化の特定: sys.dm_db_index_physical_stats DMV (Dynamic Management View) を使用して、
インデックスの断片化レベル、ページ密度、レコード数などの情報を取得します。
§断片化の条件: 特定の条件に基づいて、断片化が深刻なインデックスを特定します。
ページ密度が低い(85%未満)場合
ページ数が50を超え、断片化率が15%を超える場合
ページ数が10を超え、断片化率が80%を超える場合
§インデックスの再構築/再編成: 特定されたインデックスに対して、
ALTER INDEX コマンドを使用して再構築(REBUILD)または再編成(REORGANIZE)を実行します。
ページ密度が75%~85%で、FILLFACTORが設定されている場合、または断片化率が30%未満の場合、REORGANIZE を実行します。
レコード数が5000以上でFILLFACTORが設定されていない場合、REBUILD WITH (FILLFACTOR = 90) を実行します。
上記以外の場合は、REBUILD を実行します。
FILLFACTOR: FILLFACTORは、インデックスページの空き領域の割合を指定するもので、挿入パフォーマンスに影響します。
ページ数の計算: 断片化されたインデックスのページ数と、最適化後に解放されたページ数を計算し、結果を出力します。
2. 統計情報の更新
--Update all statistics
PRINT 'Updating all statistics.' + convert(nvarchar, getdate(), 121)
EXEC sp_updatestats
PRINT 'Done updating statistics.' + convert(nvarchar, getdate(), 121)
GO
§統計情報の更新: sp_updatestats ストアドプロシージャを使用して、
データベース内のすべてのテーブルの統計情報を更新します。
統計情報は、クエリのパフォーマンスに影響するため、定期的な更新が重要です。
まとめ
このスクリプトは、SUSDBデータベースのパフォーマンスを維持するために、
インデックスの最適化と統計情報の更新という2つの重要なメンテナンス作業を自動化します。
これにより、データベースのパフォーマンスが向上し、WSUSの安定性が確保されます。
[0回]
cybereasonの23.1はwindows11の24H2に対応しているか知りたいです。
Cybereasonのバージョン23.1がWindows 11 24H2に対応しているかについて、直接的な情報は見つかりませんでした。
しかし、Cybereasonの製品情報から、以下の点が確認できます。
対応OS:
Cybereasonは、Windows 11を含む複数のWindows OSに対応しています。
Cybereasonの対応OSには、「Windows 11 (Windows 11 24H2まで)」と記載されています。
このことから、CybereasonはWindows 11 24H2に対応していると考えられます。
しかし、OSの要件は詳細について問い合わせるように記載されているため、
正確な情報については、Cybereasonの公式情報をご確認いただくか、
Cybereasonに直接お問い合わせいただくことを推奨します。
参考情報として、Cybereasonの製品情報ページを以下に示します。
Cybereason センサー | サイバーリーズン合同会社: https://www.cybereason.co.jp/products/sensor/
最新の情報や詳細な仕様については、Cybereasonの公式ウェブサイトをご覧いただくか、直接お問い合わせください。
[0回]
$servers = "server1", "server2", "server3", "server4", "server5", "server6", "server7", "server8", "server9", "server10"
Invoke-Command -ComputerName $servers -ScriptBlock {
Get-WmiObject -Class Win32_PageFileUsage | Select-Object PSComputerName, CurrentUsage, PeakUsage, AllocatedBaseSize
} | Format-Table
[0回]
手順が詳細にわかっているために、WBSの項目がその手順に
引きずられて細かくなってしまいがちですが、
これはよくあることですが、WBSの目的を見失いがちな点でもあります。
では、どのように修正すればいいのでしょうか。そのポイントを書き出してみます。
<WBSの目的とは?>
WBSの目的は、プロジェクト全体の作業を階層的に分解し、全体像を把握することです。
詳細な手順は、WBSの各項目に対して作成する作業計画書などに記述するのが一般的です。
WBSの粒度を調整するポイント
<作業の目的を見極める>
各作業の目的は何ですか?
その目的を達成するために、どのようなアウトプットが必要ですか?
アウトプットを達成するために必要な最小限の作業は何か?
<管理の視点で考える>
この作業を誰が担当しますか?
進捗をどのように確認しますか?
問題が発生した場合、どこで対応しますか?
<8/80ルールを参考に>
1つの作業にかかる時間が、8時間以上80時間以下になるように
調整すると、粒度が適切になることが多いです。
<詳細な手順は別途管理>
WBSでは、作業の目的とアウトプットを明確にし、
詳細な手順は作業計画書などに記述します。
具体的にどのように調整するか?
例えば、「資料作成」という作業が非常に細かく分かれているとします。
現状:
資料作成
→資料構成を考える
→資料の骨組みを作成
→資料のデザインを決める
→資料を書く
→図表を作成
→資料を修正する
調整後: 資料作成(資料構成、骨組み作成、デザイン決定、執筆、図表作成、修正を含む)
このように、目的が同じ作業はまとめることで、粒度を調整できます。
<まとめ>
WBSは、プロジェクト全体を俯瞰するためのツールです。
詳細な手順にこだわりすぎず、目的を達成するために必要な
最小限の作業に焦点を当てて、適切な粒度でWBSを作成することが重要です。
[0回]