当我在SQL Server Profiler中测量Writes和RowCounts时,发现报告Writes = 26035但RowCounts为0的语句(删除)。这怎么可能?很显然,该语句是在行正在写入之后删除行,为什么这些行都不在rowcount列中?SQL Server Profiler写入vs RowCounts
1
A
回答
2
因为rowcount指向返回给客户端的行数。除非您使用
OUTPUT
子句,否则删除操作不会返回任何行。
更新:==>我站得更正测试显示,当删除没有返回行时,也会设置rowcount。
证明:
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
运行在2个表DELETE语句,用5万条记录,其中删除任何记录给我下面的查询计划::
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行的小表上运行相同的查询,得到以下结果:
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]))
所以哈希表导致写入的前提仍无定论。
+0
是的,我的sproc有一堆其他删除,都显示返回适当的rowcount,所以它肯定应该返回一个rowcount。 – tuseau 2011-03-31 12:32:41
相关问题
- 1. SQL Server Profiler
- 2. SQL Server 2008 Profiler
- 3. SQL Server Profiler?
- 4. SQL Server Profiler - 查看Dynamic Sql
- 5. 什么是SQL Server Profiler除了SQL Server Profiler?
- 6. 是否有SQL Server Express的SQL Server Profiler?
- 7. SQL Server Profiler - 列含义
- 8. SQL Server Profiler中的BinaryData列
- 9. SQL Server 2012 Express中的Profiler
- 10. SQL Server Profiler中的filetable_updates表
- 11. SQL Server Profiler如何检查创建SQL Server Profiler跟踪的用户ID?
- 12. 什么是SQL Server中的SQL Server Profiler NtUsername变量?
- 13. 如何使用SQL Server Profiler跟踪
- 14. 导致CPU高峰的SQL Server Profiler
- 15. 安装后SQL Server Profiler丢失
- 16. SQL Server:捕获视图使用Profiler
- 17. 使用SQL Server Profiler访问日志表
- 18. SQL Server Profiler突然说加密文本
- 19. SQL Server Profiler需要太多内存
- 20. 使用C#/ VB.NET实现SQL Server Profiler
- 21. sql server profiler中的死锁图
- 22. SQL Server Profiler登录时出错
- 23. SQL Server将行写入列
- 24. 延迟写入SQL Server
- 25. 从sql server表写入行
- 26. MSDE vs SQL Server
- 27. DB2 vs PostgreSQL vs SQL Server
- 28. 批量插入(BCP)到SQL Server VS Sqoop导出到SQL Server
- 29. SQL Server 2000 T-SQL:写入MSMQ?
- 30. sql server vs .net encryption
我想重现这一点,但只是不能得到它的工作。你可以发布删除语句的代码吗? – 2011-03-31 12:31:56
对不起,我没有权限发布确切的代码,但这里有一个通用版本: DELETE table1 FROM table1,table2 WHERE table1.account = table2.account – tuseau 2011-03-31 12:36:36
好吧,我想我已经想通了 - delete语句没有任何删除,但Profiler正在显示写入,因为SQL Server在后台创建临时表,因为它正在处理的数据集的大小。 – tuseau 2011-03-31 12:41:12