• 【经验分享】SQLServer找出执行慢的SQL文


    执行以下SQL,可以知道SQLServer运行了哪些SQL文,运行了多少次,以及执行的情况,能很直观的找出速度慢的SQL文,从而进行优化。

    SELECT
    (total_elapsed_time / execution_count)/1000 N'平均时间ms'
    ,total_elapsed_time/1000 N'总花费时间ms'
    ,total_worker_time/1000 N'所用的CPU总时间ms'
    ,total_physical_reads N'物理读取总次数'
    ,total_logical_reads/execution_count N'每次逻辑读次数'
    ,total_logical_reads N'逻辑读取总次数'
    ,total_logical_writes N'逻辑写入总次数'
    ,execution_count N'执行次数'
    ,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'执行语句'
    ,creation_time N'语句编译时间'
    ,last_execution_time 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; 

    SQLServer
    SELECT top 50 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; 

    oracle
    select * 
    from
    (select 
    LAST_ACTIVE_TIME AS "上次执行时间",
    DISK_READS AS "读磁盘次数",
    SQL_TEXT AS "执行语句",
    PARSE_CALLS AS "编译次数",
    EXECUTIONS AS "执行次数",
    CPU_TIME/1000 AS "所用的CPU总时间ms",
    ELAPSED_TIME/1000 AS "总花费时间ms",
    ROUND(ELAPSED_TIME/EXECUTIONS/1000, 2) AS "平均时间ms",
    USER_IO_WAIT_TIME
    from    sys.v_$sqlarea
    where EXECUTIONS > 0
    and MODULE = 'SFCMN03003S.exe'
    order by ELAPSED_TIME/EXECUTIONS desc)
    where rownum < 51;



  • 相关阅读:
    关于C语言字符串
    进程间通信方式总结
    数据结构(3)-----链表
    Oracle查看用户所在表空间
    oracle linux了解基本命令行
    关于分区技术的索引 index
    oracle闪回表详解
    转:深入学习Oracle分区表及分区索引
    第一章 基本的SQL语句 (SQL基础)
    linux根分区扩容
  • 原文地址:https://www.cnblogs.com/zhuzhu_/p/1661797.html
Copyright © 2020-2023  润新知