SQL Server のパフォーマンスを最適化するために知っておきたい!UPDATE 影響行数の分析手法
SQL Server で UPDATE ステートメントの影響を受ける行数を取得する方法
@@ROWCOUNT 変数を使用する
最も簡単な方法は、@@ROWCOUNT
システム変数を使用することです。この変数は、直前に実行された INSERT
、UPDATE
、または DELETE
ステートメントによって変更された行数を示します。
UPDATE Customers
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
SELECT @@ROWCOUNT;
上記の例では、Customers
テーブルの CustomerID
が 12345 である行の ContactName
列が '山田太郎' に更新されます。SELECT @@ROWCOUNT;
ステートメントは 1 を返します。これは、1 行が更新されたことを意味します。
OUTPUT
句を使用すると、UPDATE
ステートメントによって更新された行の情報を取得できます。この情報には、影響を受けた行数も含まれます。
UPDATE Customers
OUTPUT $action, CustomerID
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
上記の例では、$action
変数には更新された行数が格納されます。
トリガーを使用して、UPDATE
ステートメントが実行されるたびにカスタム ロジックを実行できます。このロジックを使用して、影響を受けた行数を追跡することができます。
CREATE TRIGGER trg_Update_Customers
ON Customers
AFTER UPDATE
AS
BEGIN
INSERT INTO AuditLog
(
TableName,
Operation,
RowCount
)
VALUES
(
'Customers',
'UPDATE',
@@ROWCOUNT
);
END;
上記の例では、Customers
テーブルが更新されるたびに、AuditLog
テーブルにレコードが挿入されます。このレコードには、影響を受けた行数が含まれます。
- 簡潔で簡単な方法が必要な場合は、@@ROWCOUNT 変数を使用します。
- 更新された行に関する詳細情報が必要な場合は、OUTPUT 句を使用します。
- 更新された行を追跡する監査証跡が必要な場合は、トリガーを使用します。
@@ROWCOUNT 変数を使用する
-- Customers テーブルに新しいレコードを挿入します。
INSERT INTO Customers
(
CustomerID,
ContactName,
City
)
VALUES
(
12345,
'田中一郎',
'東京'
);
-- ContactName 列を '山田太郎' に更新します。
UPDATE Customers
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
-- 影響を受けた行数を表示します。
SELECT @@ROWCOUNT;
このコードを実行すると、次の出力が得られます。
1
これは、1 行が更新されたことを意味します。
OUTPUT 句を使用する
-- Customers テーブルに新しいレコードを挿入します。
INSERT INTO Customers
(
CustomerID,
ContactName,
City
)
VALUES
(
12345,
'田中一郎',
'東京'
);
-- ContactName 列を '山田太郎' に更新し、更新された行の情報を表示します。
UPDATE Customers
OUTPUT $action, CustomerID
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
1 12345
最初の数字は影響を受けた行数、2 番目の数字は CustomerID
です。
トリガーを使用する
-- Customers テーブルを作成します。
CREATE TABLE Customers
(
CustomerID INT PRIMARY KEY,
ContactName NVARCHAR(50),
City NVARCHAR(50)
);
-- AuditLog テーブルを作成します。
CREATE TABLE AuditLog
(
TableName NVARCHAR(50),
Operation NVARCHAR(50),
RowCount INT,
Timestamp DATETIME DEFAULT GETDATE()
);
-- Customers テーブルに新しいレコードを挿入します。
INSERT INTO Customers
(
CustomerID,
ContactName,
City
)
VALUES
(
12345,
'田中一郎',
'東京'
);
-- Customers テーブルが更新されるたびに AuditLog テーブルにレコードを挿入するトリガーを作成します。
CREATE TRIGGER trg_Update_Customers
ON Customers
AFTER UPDATE
AS
BEGIN
INSERT INTO AuditLog
(
TableName,
Operation,
RowCount
)
VALUES
(
'Customers',
'UPDATE',
@@ROWCOUNT
);
END;
-- ContactName 列を '山田太郎' に更新します。
UPDATE Customers
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
-- AuditLog テーブルの内容を表示します。
SELECT * FROM AuditLog;
このコードを実行すると、AuditLog
テーブルに次のレコードが挿入されます。
TableName Operation RowCount Timestamp
----------- ------------ ----------- ----------------------
Customers UPDATE 1 2024-05-21 02:51:23.000
これは、Customers
テーブルが更新され、1 行が影響を受けたことを意味します。
SQL Server で UPDATE ステートメントの影響を受ける行数を取得するその他の方法
ROWCOUNT_BIG システム変数を使用する
@@ROWCOUNT
変数は、32 ビット整数値のみを格納できます。影響を受けた行数が 32 ビットを超える場合は、ROWCOUNT_BIG
システム変数を使用する必要があります。
UPDATE Customers
SET ContactName = '山田太郎'
WHERE CustomerID = 12345;
SELECT ROWCOUNT_BIG;
INFORMATION_SCHEMA
ビューを使用して、影響を受けた行数の情報を取得することもできます。
SELECT UPDATE_ROWS
FROM INFORMATION_SCHEMA.OPERATION_STATISTICS
WHERE SCHEMA_NAME = 'dbo'
AND TABLE_NAME = 'Customers';
このクエリは、dbo
スキーマの Customers
テーブルに対して実行された最後の UPDATE
ステートメントによって更新された行数を返します。
動的パフォーマンス ビューを使用する
SQL Server 2016 以降では、動的パフォーマンス ビュー (DMV) を使用して、影響を受けた行数の情報を取得することもできます。
SELECT total_write_rows
FROM sys.dm_exec_query_statistics
WHERE schema_name = 'dbo'
AND object_name = 'Customers';
- 影響を受けた行数が 32 ビットを超える可能性がある場合は、ROWCOUNT_BIG 変数を使用します。
- 影響を受けた行数に関する詳細情報を取得する必要がある場合は、INFORMATION_SCHEMA ビューまたは DMV を使用します。
sql sql-server