• 查询SQL Server存储过程的执行信息(转)


    create VIEW view_job_info as
    SELECT b.[name] [Job名称],CASE WHEN b.enabled=1 THEN '启用' ELSE '禁用' END [是否启用]
    , a.step_name 
    [步骤名称],a.command
    FROM msdb.dbo.sysjobsteps a INNER JOIN 
    msdb.dbo.sysjobs b 
    ON a.job_id=b.job_id

    SELECT b.*,
    OBJECT_NAME(object_id, database_id) 存储过程名, 
    d.cached_time 编译时间, d.last_execution_time 最近一次执行时间ms, 
    d.total_elapsed_time
    /1000 总花费时间ms, 
    d.total_elapsed_time
    /d.execution_count*1000 AS 平均执行时间ms,
    d.last_elapsed_time 最近一次执行花费时间ms, d.execution_count 执行次数
    FROM sys.dm_exec_procedure_stats AS d INNER JOIN view_job_info b ON b.command LIKE 

    '%'+OBJECT_NAME(object_id, database_id) +'%'
    where OBJECT_NAME(object_id, database_id) IN (SELECT name FROM sys.objects WHERE  
    TYPE
    ='p' 
    and modify_date>'2008-2-24 17:32:50')
    ORDER BY 6 DESC;

     想通过数据库层分析sql server系统性能,以下代码可以用来分析系统运行一段时间后,那些语句是系统忙的sql语句

    就是在测量功能时,先以下命令清除sql server的缓存: 

    dbcc freeProcCache 

     SELECT  creation_time  N'语句编译时间'

            ,last_execution_time  N'上次执行时间'
            ,total_physical_reads N'物理读取总次数'
            ,total_logical_reads/execution_count N'每次逻辑读次数'
            ,total_logical_reads  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'执行语句'
    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;

    执行计划重用次数

    select total_elapsed_time / execution_count 平均时间,total_logical_reads/execution_count 逻辑读,
    usecounts 重用次数,SUBSTRING(d.text, (statement_start_offset/2) + 1,
             ((CASE statement_end_offset 
              WHEN -1 THEN DATALENGTH(text)
              ELSE statement_end_offset END 
                - statement_start_offset)/2) + 1) 语句执行 from sys.dm_exec_cached_plans a
    cross apply sys.dm_exec_query_plan(a.plan_handle) c
    ,sys.dm_exec_query_stats b
    cross apply sys.dm_exec_sql_text(b.sql_handle) d
    where a.plan_handle=b.plan_handle and total_logical_reads/execution_count>4000

    ORDER BY total_elapsed_time / execution_count DESC; 

    索引使用效率评估

      user_seeks : 通过用户查询执行的搜索次数。 

     个人理解: 此统计索引seek的次数

    user_scans: 通过用户查询执行的扫描次数。 
     个人理解:此统计表扫描的次数,无索引配合
    user_lookups: 通过用户查询执行的查找次数。 
     个人理解:用户通过索引查找,在使用RID或聚集索引查找数据的次数,对于堆表或聚集表数据而言
    和索引配合使用次数

    user_updates:  通过用户查询执行的更新次数。 
     个人理解:索引或表的更新次数

    --- 使用很少的索引排在最先
    declare @dbid int
    select @dbid = db_id()
    select objectname=object_name(s.object_id), s.object_id, indexname=i.name, i.index_id
                , user_seeks, user_scans, user_lookups, user_updates
    from sys.dm_db_index_usage_stats s,
                sys.indexes i
    where database_id = @dbid and objectproperty(s.object_id,'IsUserTable'= 1
    and i.object_id = s.object_id
    and i.index_id = s.index_id

    order by (user_seeks + user_scans + user_lookups + user_updates) asc 

  • 相关阅读:
    5.14每日一题题解
    5.13 每日一题题解
    5.12 每日一题题解
    5.11 每日一题题解
    5.10每日一题题解
    【SPOJ -NSUBSTR】Substrings 【后缀自动机+dp】
    【POJ1509】Glass Beads 【后缀自动机】
    【codevs3160】 LCS 【后缀自动机】
    【HDU4734】F(x) 【数位dp】
    【hdu6148】Valley Numer【数位dp模板题】
  • 原文地址:https://www.cnblogs.com/Luouy/p/2501961.html
Copyright © 2020-2023  润新知