当执行SELECT、UPDATE、DELETE语句时,可以计算出SELECT、UPDATE、DELETE 执行访问到的数据大小吗,如多少M?

ChinaITOldMan 2018-01-17 08:09:19
当我们执行SELECT、UPDATE、DELETE语句时,可以计算出SELECT、UPDATE、DELETE 执行访问到的数据大小吗,如多少M? 谢谢!

select * from vw_ERPProductionData
where itemgrp='FG'

UPDATE Inventory set f1=a.PurQty from Inventory a, purchRec b
where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo

DELETE FROM Inventory from Inventory a, purchRec b
where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo
...全文
528 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
许世凯-xushikai 2018-01-18
  • 打赏
  • 举报
回复
大牛就是厉害
ChinaITOldMan 2018-01-18
  • 打赏
  • 举报
回复
引用 18 楼 z10843087 的回复:
[quote=引用 16 楼 mcxhh2005的回复:][quote=引用 12 楼 z10843087 的回复:] [quote=引用 11 楼 mcxhh2005 的回复:] [quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 数据流量的定义是上面,怎么不用数据文件和日志文件的增量来衡量[/quote] 哦,谢谢,那个也不是会,若通过sp_spaceused计算好像不太准确吧[/quote] zabbix把,现在主流的而且功能比较齐全[/quote] 谢谢您!
weixin_40943909 2018-01-17
  • 打赏
  • 举报
回复
没弄过真的真的真的
OwenZeng_DBA 2018-01-17
  • 打赏
  • 举报
回复
引用 楼主 mcxhh2005 的回复:
当我们执行SELECT、UPDATE、DELETE语句时,可以计算出SELECT、UPDATE、DELETE 执行访问到的数据大小吗,如多少M? 谢谢! select * from vw_ERPProductionData where itemgrp='FG' UPDATE Inventory set f1=a.PurQty from Inventory a, purchRec b where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo DELETE FROM Inventory from Inventory a, purchRec b where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo
可以通过set statistics io on 查看逻辑读,和物理读的次数,,每次读取就是8K的页面,然后来算出访问的数据的大小
薛定谔的DBA 2018-01-17
  • 打赏
  • 举报
回复
SELECT 
(dense_rank() over (order by PARSENAME(REPLACE(%%lockres%%,':','.')+N'.0',3)) 
+dense_rank() over (order by PARSENAME(REPLACE(%%lockres%%,':','.')+N'.0',3) desc) -1)*8 AS Size_KB --大小
,* FROM PRED_RESULT3
吉普赛的歌 2018-01-17
  • 打赏
  • 举报
回复
SET STATISTICS IO ON
;with cte as(
	SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 200
)
SELECT * FROM cte a CROSS APPLY cte b
/*
(40000 行受影响)
表 'spt_values'。扫描计数 2,逻辑读取 32 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 1,逻辑读取 799 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/
--逻辑读取MB
--SELECT (CAST(32 AS BIGINT)*8060)/(1024*1024) 
二月十六 2018-01-17
  • 打赏
  • 举报
回复
update和delete前通过select 到临时表,查询临时表大小
--把要select、update、delete的数据放到临时表
SELECT  *
INTO    #Test
FROM    vw_ERPProductionData
WHERE   itemgrp = 'FG'
USE tempdb
--查询临时表大小
EXEC sp_spaceused #Test

DROP TABLE #Test
shoppo0505 2018-01-17
  • 打赏
  • 举报
回复
这个没弄过, 不过在数据库中可以查到表格大小,然后除以一下中数据量大概能够估算,但是读出来了,这个大小就没有意义了。
OwenZeng_DBA 2018-01-17
  • 打赏
  • 举报
回复
引用 16 楼 mcxhh2005的回复:
[quote=引用 12 楼 z10843087 的回复:] [quote=引用 11 楼 mcxhh2005 的回复:] [quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 数据流量的定义是上面,怎么不用数据文件和日志文件的增量来衡量[/quote] 哦,谢谢,那个也不是会,若通过sp_spaceused计算好像不太准确吧[/quote] zabbix把,现在主流的而且功能比较齐全
吉普赛的歌 2018-01-17
  • 打赏
  • 举报
回复
引用 15 楼 mcxhh2005 的回复:
好的,有没有好的监控软件推荐!谢谢您
https://www.cnblogs.com/haochuang/p/6560746.html
ChinaITOldMan 2018-01-17
  • 打赏
  • 举报
回复
引用 12 楼 z10843087 的回复:
[quote=引用 11 楼 mcxhh2005 的回复:] [quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 数据流量的定义是上面,怎么不用数据文件和日志文件的增量来衡量[/quote] 哦,谢谢,那个也不是会,若通过sp_spaceused计算好像不太准确吧
ChinaITOldMan 2018-01-17
  • 打赏
  • 举报
回复
好的,有没有好的监控软件推荐!
引用 14 楼 yenange 的回复:
[quote=引用 11 楼 mcxhh2005 的回复:] [quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 用监控软件, 统计一下服务器每天的网卡流量即可[/quote] 好的,有没有好的监控软件推荐!谢谢您
吉普赛的歌 2018-01-17
  • 打赏
  • 举报
回复
引用 11 楼 mcxhh2005 的回复:
[quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 用监控软件, 统计一下服务器每天的网卡流量即可
吉普赛的歌 2018-01-17
  • 打赏
  • 举报
回复
引用 7 楼 mcxhh2005 的回复:
[quote=引用 3 楼 yenange 的回复:]
SET STATISTICS IO ON
;with cte as(
	SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 200
)
SELECT * FROM cte a CROSS APPLY cte b
/*
(40000 行受影响)
表 'spt_values'。扫描计数 2,逻辑读取 32 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 1,逻辑读取 799 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/
--逻辑读取MB
--SELECT (CAST(32 AS BIGINT)*8060)/(1024*1024) 
1. 若是统计所访问数据的大小是把(所有表的逻辑读+所有表的物理读 AS BIGINT)*8060)/(1024*1024) 吧? 2. 若是update或Delete语句也是一样处理吗? 谢谢 [/quote]
引用 6 楼 mcxhh2005 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] update和delete前通过select 到临时表,查询临时表大小
--把要select、update、delete的数据放到临时表
SELECT  *
INTO    #Test
FROM    vw_ERPProductionData
WHERE   itemgrp = 'FG'
USE tempdb
--查询临时表大小
EXEC sp_spaceused #Test

DROP TABLE #Test
谢谢,这个有点不方便,那计算update与delete语句设计的大小是这样处理?[/quote] update 与 delete 基本类似 select 同条件的记录, 但还是有一定区别。 因为 update, delete 对比 select 多了一步更新索引。
OwenZeng_DBA 2018-01-17
  • 打赏
  • 举报
回复
引用 11 楼 mcxhh2005 的回复:
[quote=引用 10 楼 z10843087 的回复:] select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。[/quote] 数据流量的定义是上面,怎么不用数据文件和日志文件的增量来衡量
ChinaITOldMan 2018-01-17
  • 打赏
  • 举报
回复
引用 10 楼 z10843087 的回复:
select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
谢谢你,想统计下数据库服务器每天发生的数据流量。
OwenZeng_DBA 2018-01-17
  • 打赏
  • 举报
回复
select --top 5 (total_logical_reads/execution_count) as [平均逻辑读取次数], (total_logical_writes/execution_count) as [平均逻辑写入次数], (total_physical_reads/execution_count) as [平均对象读取次数], Execution_count 运行次数, substring(qt.text,r.statement_start_offset/2+1, (case when r.statement_end_offset = -1 then datalength(qt.text) else r.statement_end_offset end - r.statement_start_offset)/2+1) [运行语法],getdate() [查询时间] from sys.dm_exec_query_stats as r cross apply sys.dm_exec_sql_text(r.sql_handle) as qt order by (total_logical_reads + total_logical_writes) Desc 可以用类似的语句查询出,语句的逻辑读, 不过你为什么要这么做呢
ChinaITOldMan 2018-01-17
  • 打赏
  • 举报
回复
引用 5 楼 z10843087 的回复:
[quote=引用 楼主 mcxhh2005 的回复:] 当我们执行SELECT、UPDATE、DELETE语句时,可以计算出SELECT、UPDATE、DELETE 执行访问到的数据大小吗,如多少M? 谢谢! select * from vw_ERPProductionData where itemgrp='FG' UPDATE Inventory set f1=a.PurQty from Inventory a, purchRec b where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo DELETE FROM Inventory from Inventory a, purchRec b where a.PurchNO=b.PurchNo and a.ItemNo=b.ItemNo
可以通过set statistics io on 查看逻辑读,和物理读的次数,,每次读取就是8K的页面,然后来算出访问的数据的大小[/quote] 谢谢您,请问有没有好的方式统计SET STATISTICS IO ON中的值 ?
ChinaITOldMan 2018-01-17
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
SET STATISTICS IO ON
;with cte as(
	SELECT * FROM MASTER.dbo.spt_values AS sv WHERE sv.[type]='P' AND sv.number BETWEEN 1 AND 200
)
SELECT * FROM cte a CROSS APPLY cte b
/*
(40000 行受影响)
表 'spt_values'。扫描计数 2,逻辑读取 32 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'Worktable'。扫描计数 1,逻辑读取 799 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
*/
--逻辑读取MB
--SELECT (CAST(32 AS BIGINT)*8060)/(1024*1024) 
1. 若是统计所访问数据的大小是把(所有表的逻辑读+所有表的物理读 AS BIGINT)*8060)/(1024*1024) 吧? 2. 若是update或Delete语句也是一样处理吗? 谢谢
二月十六 2018-01-17
  • 打赏
  • 举报
回复
引用 6 楼 mcxhh2005 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:] update和delete前通过select 到临时表,查询临时表大小
--把要select、update、delete的数据放到临时表
SELECT  *
INTO    #Test
FROM    vw_ERPProductionData
WHERE   itemgrp = 'FG'
USE tempdb
--查询临时表大小
EXEC sp_spaceused #Test

DROP TABLE #Test
谢谢,这个有点不方便,那计算update与delete语句设计的大小是这样处理?[/quote] update和delete的数据先select算一下
加载更多回复(1)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧