最近要回到公司,暫時離開客戶的生產資料庫,不能及時得到下列資料庫資訊:
1,系統運行sql語句的執行情況 2,統計每天全部表的資料變化(資料每天的增量)。
特意寫了3個job線程,在晚上業務不繁忙的時候執行,來收集系統運行情況資訊,等我回來再來分析sql,同時為系統最佳化提供參考。
create table tbSql(
[語句編譯時間] datetime,
[物理讀取總次數] int,
[每次邏輯讀次數] int,
[邏輯寫入總次數] int,
[執行次數] int,
[所用的CPU總時間ms] numeric(30,3),
[總花費時間ms] numeric(30,3),
[平均時間ms] numeric(30,3),
[執行語句] text,
[收集時間] datetime,
)
insert into tbSql
SELECT creation_time N'語句編譯時間'
,total_physical_reads N'物理讀取總次數'
,total_logical_reads/execution_count N'每次邏輯讀次數'
,total_logical_writes N'邏輯寫入總次數'
, execution_count N'執行次數'
, total_worker_time/1000 N'所用的CPU總時間ms'
, total_elapsed_time/1000 N'總花費時間ms'
, (total_elapsed_time / execution_count)/1000 N'平均時間ms'
,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) N'執行語句',
getdate()
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
((CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset)/2) + 1) not like '%fetch%'
ORDER BY total_elapsed_time / execution_count DESC;
dbcc freeProcCache; --清理執行計畫緩衝
job每天收集表行數:
select object_name(id),max(rows) from sysindexes
group by object_name(id)
order by 2 desc