SQL Server查詢最近執行的SQL

一、查詢最近執行的SQL語句

查詢最近執行的SQL語句可以通過系統視圖sys.dm_exec_query_stats來實現,該視圖存儲了SQL Server最近執行的查詢信息,包括SQL語句、執行次數、消耗的CPU時間和I/O等。以下是一個查詢最近執行的SQL語句的代碼示例:

SELECT TOP 10 
    SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
    ((CASE qs.statement_end_offset
        WHEN -1 THEN DATALENGTH(qt.TEXT)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS query,
    qs.execution_count,
    qs.total_worker_time/1000000 AS total_cpu_time_sec,
    qs.total_elapsed_time/1000000 AS total_elapsed_time_sec,
    qs.total_logical_reads,
    qs.total_physical_reads,
    qs.creation_time,
    ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname,
    qt.objectid,
    qt.dbid
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;

執行以上代碼可以獲取到最近執行的10條SQL語句,包含SQL語句文本、執行次數、CPU時間、耗時、邏輯讀取次數、物理讀取次數、創建時間、數據庫名稱、對象ID和數據庫ID等信息。

二、查詢最耗費CPU時間的SQL語句

查詢最耗費CPU時間的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_worker_time來實現。以下是一個查詢最耗費CPU時間的SQL語句的代碼示例:

SELECT TOP 10 
    SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
    ((CASE qs.statement_end_offset
        WHEN -1 THEN DATALENGTH(qt.TEXT)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS query,
    qs.execution_count,
    qs.total_worker_time/1000000 AS total_cpu_time_sec,
    ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;

執行以上代碼可以獲取最耗費CPU時間的10條SQL語句。以上代碼中的total_worker_time/1000000是因為sys.dm_exec_query_stats視圖中的total_worker_time是以微秒為單位的。查詢結果包含SQL語句、執行次數、CPU時間和數據庫名稱。

三、查詢最慢的SQL語句

查詢最慢的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_elapsed_time來實現。以下是一個查詢最慢的SQL語句的代碼示例:

SELECT TOP 10 
    SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
    ((CASE qs.statement_end_offset
        WHEN -1 THEN DATALENGTH(qt.TEXT)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS query,
    qs.execution_count,
    qs.total_elapsed_time/1000000 AS total_elapsed_time_sec,
    ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_elapsed_time DESC;

執行以上代碼可以獲取最慢的10條SQL語句。以上代碼中的total_elapsed_time/1000000是因為sys.dm_exec_query_stats視圖中的total_elapsed_time是以微秒為單位的。查詢結果包含SQL語句、執行次數、耗時和數據庫名稱。

四、查詢最頻繁被執行的SQL語句

查詢最頻繁被執行的SQL語句可以通過sys.dm_exec_query_stats視圖中的execution_count來實現。以下是一個查詢最頻繁被執行的SQL語句的代碼示例:

SELECT TOP 10 
    SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
    ((CASE qs.statement_end_offset
        WHEN -1 THEN DATALENGTH(qt.TEXT)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS query,
    qs.execution_count,
    qs.total_worker_time/qs.execution_count/1000000 AS avg_cpu_time_sec_per_exec,
    qs.total_elapsed_time/qs.execution_count/1000000 AS avg_elapsed_time_sec_per_exec,
    qs.total_logical_reads/qs.execution_count AS avg_logical_reads_per_exec,
    qs.total_physical_reads/qs.execution_count AS avg_physical_reads_per_exec,
    ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.execution_count DESC;

執行以上代碼可以獲取最頻繁被執行的10條SQL語句。以上代碼中的total_worker_time/qs.execution_count/1000000和total_elapsed_time/qs.execution_count/1000000是因為需要計算每次執行的平均CPU時間和平均耗時。查詢結果包含SQL語句、執行次數、平均CPU時間、平均耗時、平均邏輯讀取次數、平均物理讀取次數和數據庫名稱等信息。

五、查詢最佔用內存的SQL語句

查詢最佔用內存的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_logical_reads和total_physical_reads來實現。以下是一個查詢最佔用內存的SQL語句的代碼示例:

SELECT TOP 10 
    SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, 
    ((CASE qs.statement_end_offset
        WHEN -1 THEN DATALENGTH(qt.TEXT)
        ELSE qs.statement_end_offset
        END - qs.statement_start_offset)/2)+1) AS query,
    qs.execution_count,
    qs.total_logical_reads,
    qs.total_physical_reads,
    ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY (qs.total_logical_reads + qs.total_physical_reads) DESC;

執行以上代碼可以獲取最佔用內存的10條SQL語句。查詢結果包含SQL語句、執行次數、邏輯讀取次數、物理讀取次數和數據庫名稱。

六、結語

通過以上方法可以查詢出SQL Server最近執行的SQL語句,並通過不同的維度進行排列和分析,有助於發現性能瓶頸和優化SQL Server的性能。

原創文章,作者:XTTOG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/315769.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XTTOG的頭像XTTOG
上一篇 2025-01-09 12:14
下一篇 2025-01-09 12:14

相關推薦

  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是數據庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • RabbitMQ Server 3.8.0使用指南

    RabbitMQ Server 3.8.0是一個開源的消息隊列軟件,官方網站為https://www.rabbitmq.com,本文將為你講解如何使用RabbitMQ Server…

    編程 2025-04-27
  • SQL Server Not In概述

    在今天的軟件開發領域中,數據庫查詢不可或缺。而SQL Server的”Not In”操作符就是這個領域中非常常用的操作符之一。雖然”Not In…

    編程 2025-04-25
  • Windows Server 2012激活碼

    一、激活碼是什麼? 激活碼是用於激活軟件產品的一種序列號,可以通過購買或升級軟件獲得。Windows Server 2012的激活碼可以確保軟件的合法使用,避免非法行為。 激活碼的…

    編程 2025-04-25
  • 使用VSCode Live Server進行Web開發

    Web開發已經成為現代開發的一個重要部分,而VSCode也成為了許多開發者的首選開發工具。VSCode Live Server是VSCode中一個非常有用的插件,可以幫助Web開發…

    編程 2025-04-25
  • GORM SQL注入詳解

    GORM是一個非常優秀的Go語言ORM框架,它的目標是簡化數據庫操作,提高開發效率,但是在使用的過程中,也難免會遇到SQL注入的問題。本文將從多個方面來詳細解析GORM SQL注入…

    編程 2025-04-25
  • SQL Server時間差詳解

    一、DATEDIFF函數 DATEDIFF函數可用於計算兩個時間之間的差值,其語法如下: DATEDIFF (datepart, startdate, enddate) 其中,da…

    編程 2025-04-25

發表回復

登錄後才能評論