1

SQL Server プロファイラーで Writes と RowCounts を測定すると、Writes = 26035 を報告しているステートメント (削除) が 1 つ見つかりましたが、RowCounts は 0 です。明らかに、ステートメントは書き込み中に行を削除しているのに、行数列にこれらの行がまったくカウントされないのはなぜでしょうか?

4

1 に答える 1

2

rowcountは、クライアントに返される行の数を指しているためです。OUTPUTまた、句を使用しない限り、削除は行を返しません。

更新:==>私は修正されたままですテストは、削除が行を返さないときに行数も設定されることを示しています。

証拠:

SELECT * 
  FROM Accounts 
 WHERE Category= 'COA'  
   AND Code between 1500 and 2000 
-- 18 Reads, 0 Writes, 51 RowCount

DELETE FROM Accounts 
 WHERE Category = 'COA' 
   AND Code between 1500 and 2000
-- 22 Reads, 1 Writes, 51 RowCount

DELETE FROM Accounts
OUTPUT DELETED.* 
WHERE Category = 'COA' 
  AND Code between 2000 and 4000
-- 24 Reads, 3 Writes, 103 RowCount

レコードを削除しない500万レコードの2つのテーブルでdeleteステートメントを実行すると、次のクエリプランが得られます。

delete clust from clust, heap where clust.Key= heap.Key
-- 19854 Reads, 0 Writes, 0 RowCount
 |--Clustered Index Delete(OBJECT:([dbo].[clust].[idx_clust]), OBJECT:([dbo].[clust].[idx2_clust]))
      |--Top(ROWCOUNT est 0)
           |--Parallelism(Gather Streams)
                |--Hash Match(Right Semi Join, HASH:([dbo].[heap].[Key])=([dbo].[clust].[Key]))
                     |--Bitmap(HASH:([dbo].[heap].[Key]), DEFINE:([Bitmap1012]))
                     |    |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([dbo].[heap].[Key]))
                     |         |--Stream Aggregate(GROUP BY:([dbo].[heap].[Key]))
                     |              |--Index Scan(OBJECT:([dbo].[heap].[idx_heap]), ORDERED FORWARD)
                     |--Parallelism(Repartition Streams, Hash Partitioning, PARTITION COLUMNS:([dbo].[clust].[Key]))
                         |--Index Scan(OBJECT:([dbo].[clust].[idx2_clust]),  WHERE:(PROBE([Bitmap1012],[dbo].[clust].[Key],N'[IN ROW]')) ORDERED FORWARD)

それぞれ10行の2つの小さなテーブルで同じクエリを実行すると、次の結果が得られます。

delete smallclust from smallclust, smallheap where smallclust.srp_key = smallheap.common_key
-- 45 Reads, 0 Writes, 0 RowCount
 |--Table Delete(OBJECT:([dbo].[smallclust]))
      |--Top(ROWCOUNT est 0)
           |--Nested Loops(Left Semi Join, WHERE:([dbo].[smallheap].[Key]=[dbo].[smallclust].[Key]))
                |--Table Scan(OBJECT:([dbo].[smallclust]))
                |--Table Scan(OBJECT:([dbo].[smallheap]))

したがって、書き込みを引き起こすハッシュテーブルの仮定は決定的ではありません。

于 2011-03-31T12:11:25.767 に答える