SRE

查詢性能消耗

在 SQL Server 中,您可以使用以下方法来方便地查找性能消耗高的 SQL 语句,包括 CPU 消耗高和 IO 消耗高的情况:

  1. 查询 CPU 消耗高的前五个 SQL 语句: 下面的示例将返回按平均 CPU 时间排名的前五个查询的信息。这些查询是根据查询哈希值聚合的,逻辑上等效的查询按累积的资源使用情况进行分组:

    SELECT TOP 5
        total_worker_time / execution_count AS [Avg CPU Time],
        SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1,
            ((CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(st.text)
                    ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    ORDER BY total_worker_time / execution_count DESC;
    

    这将显示消耗 CPU 时间最多的前五个 SQL 语句。

  2. 查询 IO 消耗高的前五十个 SQL 语句: 下面的示例将返回按平均逻辑读次数、逻辑写入次数和物理读取次数排名的前五十个查询的信息:

    SELECT TOP 50
        (total_logical_reads / execution_count) AS avg_logical_reads,
        (total_logical_writes / execution_count) AS avg_logical_writes,
        (total_physical_reads / execution_count) AS avg_phys_reads,
        SUBSTRING(st.text, (qs.statement_start_offset / 2) + 1,
            ((CASE WHEN qs.statement_end_offset = -1 THEN DATALENGTH(st.text)
                    ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) + 1) AS statement_text
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    ORDER BY avg_logical_reads DESC;
    

    这将显示消耗逻辑读、逻辑写和物理读取资源最多的前五十个 SQL 语句。

  3. 查找 SQL 阻塞进程: 在高并发情况下,容易产生进程阻塞。您可以使用以下查询来查看阻塞的 SQL:

    SELECT
        t1.request_session_id AS 'wait_sid',
        t1.resource_type AS '锁类型',
        DB_NAME(resource_database_id) AS '库名称',
        t1.request_mode AS 'wait锁类型',
        t2.wait_duration_ms AS 'wait_time_ms',
        (SELECT text FROM sys.dm_exec_requests AS r
         CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)
         WHERE r.session_id = t1.request_session_id) AS 'wait_run_batch',
        (SELECT 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)
         FROM sys.dm_exec_requests AS r
         CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS qt
         WHERE r.session_id = t1.request_session_id) AS 'wait 运行的SQL语句',
        t2.blocking_session_id AS '锁定sid',
        (SELECT text FROM sys.sysprocesses AS p
         CROSS APPLY sys.dm_exec_sql_text(p.sql_handle)
         WHERE p.spid = t2.blocking_session_id) AS '锁定SQL'
    FROM sys.dm_tran_locks AS t1
    INNER JOIN sys.dm_os_waiting_tasks AS t2 ON t1.lock_owner_address = t2.resource_address;
    

    这将显示阻塞的 SQL 会话和相关信息。

请根据您的需求选择适当的查询来分析 SQL Server 数据库的性能消耗。¹⁶⁴⁷⁸

來源: 與 Bing 的交談, 2024/4/15 (1) SQL Server 日常维护之八:查询性能消耗高的语句_sql server 查看io消耗最多的条语句-CSDN博客. https://blog.csdn.net/weixin_38623994/article/details/103691542. (2) sqlserver查看消耗IO最多的50条语句 - 芈璐 - 博客园. https://www.cnblogs.com/blossomwei/p/15671768.html. (3) SQL SERVER 占用资源高的SQL语句 - Chr☆s - 博客园. https://www.cnblogs.com/chriskwok/p/9682998.html. (4) SQL Server查看Sql语句执行的耗时和IO消耗-CSDN博客. https://blog.csdn.net/weixin_33796205/article/details/85990354. (5) sql server查询IO消耗大的排查sql诊断语句 - 游不动 - 博客园. https://www.cnblogs.com/ashbur/p/12020563.html. (6) SqlServer性能优化,查看CPU、内存占用大的会话及SQL语句 - 一张琴一壶酒一溪云 - 博客园. https://www.cnblogs.com/Blue-ZXL/p/11933134.html. (7) SQL Server中查询CPU占用高的SQL语句 - 风无心客 - 博客园. https://www.cnblogs.com/zhangq/p/14628845.html. (8) SQL Server 日常维护之八:查询性能消耗高的语句 - 代码先锋网. https://www.codeleading.com/article/46262681117/.

時間消耗查詢

在 SQL Server 中,您可以使用以下方法来方便地查找最消耗时间的 SQL 语句:

  1. 查出前十名总使用 CPU 时间最高的 SQL 语句: 下面的示例将返回按总执行时间排名的前十个查询的信息。这些查询是根据查询哈希值聚合的,逻辑上等效的查询按累积的资源使用情况进行分组:

    SELECT TOP 10
        qs.total_worker_time AS [总执行时间],
        qs.execution_count AS [执行次数],
        qs.total_worker_time / qs.execution_count AS [平均执行时间],
        SUBSTRING(qt.text, qs.statement_start_offset / 2,
            (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
                  ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) AS [SQL指令]
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
    ORDER BY [总执行时间] DESC;
    

    这将显示消耗 CPU 时间最多的前十个 SQL 语句。

  2. 计算大约的等待持续时间: 若要计算大约的等待时间,从查询的经过时间减去 CPU 时间(背景工作时间)。一般而言,CPU 时间是实际的运行时间,而查询存留期的剩余部分正在等候中。例如,您可以使用以下示例计算大约的等待持续时间:

    SELECT
    last_execution_time AS [最后一次执行时间],
    (max_worker_time / 1000) AS [最大执行时间 (ms)],
    (total_worker_time / 1000) AS [总消耗 CPU 时间 (ms)],
    (total_worker_time / execution_count / 1000) AS [平均消耗 CPU 时间 (ms)],
    SUBSTRING(qt.text, qs.statement_start_offset / 2,
        (CASE WHEN qs.statement_end_offset = -1 THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
              ELSE qs.statement_end_offset END - qs.statement_start_offset) / 2) AS [SQL指令]
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS qt
    ORDER BY [总消耗 CPU 时间 (ms)] DESC;SELECT
        last_execution_time AS [最后一次执行时间],
        (max_worker_time / 1000) AS [最大执行时间 (ms)],
        (total_worker_time / 1000) AS [总消耗 CPU 时间 (ms)],
        (total_worker_time / execution_count / 1000) AS [平均消耗 CPU 时间 (ms)]
    FROM sys.dm_exec_query_stats
    ORDER BY [总消耗 CPU 时间 (ms)] DESC;
    

    这将显示查询的最后一次执行时间、最大执行时间、总消耗 CPU 时间和平均消耗 CPU 时间。

请根据您的需求选择适当的查询来分析 SQL Server 数据库的性能。¹³⁴

來源: 與 Bing 的交談, 2024/4/15 (1) [SQL Server]使用DMV找出最消耗CPU/IO的SQL指令 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天. https://ithelp.ithome.com.tw/articles/10200568. (2) SQLServer 查看耗时较多的SQL语句_sqlserver 查詢數據庫耗時sql語句-CSDN博客. https://blog.csdn.net/weixin_42488570/article/details/80893720. (3) 針對執行緩慢的查詢進行疑難解答 - SQL Server | Microsoft Learn. https://learn.microsoft.com/zh-tw/troubleshoot/sql/database-engine/performance/troubleshoot-slow-running-queries. (4) [SQL Server]使用DMV找出最消耗CPU/IO的SQL指令 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天. https://bing.com/search?q=%e5%a6%82%e4%bd%95%e6%9f%a5%e8%a9%a2%e6%9c%80%e6%b6%88%e8%80%97%e6%99%82%e9%96%93+SQL.

連接查詢

在 SQL Server 中,您可以使用以下 SQL 查询来查找连接情况:

  1. 查询目前连接数: 下面的示例将返回当前连接数:

    USE master;
    SELECT cntr_value AS User_Connections
    FROM sys.sysperfinfo AS sp
    WHERE sp.object_name='SQLServer:General Statistics'
    AND sp.counter_name='User Connections';
    

    这将显示当前的用户连接数。

  2. 查询连接明细: 下面的示例将返回连接的详细信息,包括会话 ID、连接时间、登录时间、客户端 IP 地址、登录名和连接状态:

    USE master;
    SELECT c.session_id, c.connect_time, s.login_time, c.client_net_address, s.login_name, s.status
    FROM sys.dm_exec_connections c
    LEFT JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id;
    

    这将显示连接的详细信息。

请根据您的需求选择适当的查询来查找 SQL Server 数据库的连接情况。¹²³⁴

來源: 與 Bing 的交談, 2024/4/15 (1) [SQLServer]查詢目前連線數 及 連線明細 的指令 - Blogger. https://ryan-tw.blogspot.com/2014/05/sqlserver.html. (2) 取得 SQL Server 資料庫正在執行的 T-SQL 指令與詳細資訊 | The Will Will Web. https://bing.com/search?q=SQL+server+%e6%9f%a5%e8%a9%a2%e9%80%a3%e6%8e%a5%e6%83%85%e6%b3%81%e7%9a%84%ef%bc%b3%ef%bc%b1%ef%bc%ac%e8%aa%9e%e6%b3%95. (3) 如何查詢SQL Server目前連線數 @ 狐的窩 :: 痞客邦. https://mark528.pixnet.net/blog/post/62330671. (4) 取得 SQL Server 資料庫正在執行的 T-SQL 指令與詳細資訊 | The Will Will Web. https://blog.miniasp.com/post/2010/10/13/How-to-get-current-executing-statements-in-SQL-Server. (5) 解決連線錯誤的必要條件和檢查清單 - SQL Server | Microsoft Learn. https://learn.microsoft.com/zh-tw/troubleshoot/sql/database-engine/connect/resolve-connectivity-errors-checklist. (6) undefined. http://mark528.pixnet.net/blog/post/62330671-%E5%A6%82%E4%BD%95%E6%9F%A5%E8%A9%A2sql-server%E7%9B%AE%E5%89%8D%E9%80%A3%E7%B7%9A%E6%95%B8. (7) undefined. http://autocad.bestoforum.net/t3380-topic.

maxLifetime設定不當

maxLifetime設定不當:maxLifetime是客戶端在關閉連接前的最大存活時間。如果這個值設定得比資料庫的超時時間長,客戶端可能會嘗試使用已經被資料庫關閉的連接,從而導致驗證失敗2。

如何確認資料庫超時時間 確認資料庫超時時間的方法會根據您使用的資料庫系統有所不同。以下是一些常見的資料庫系統的設定查詢方法:

  • MySQL:您可以使用以下的 SQL 指令來查詢和設定超時時間²:

    SHOW VARIABLES LIKE 'wait_timeout';
    SET SESSION wait_timeout = 999999;
    

    這裡的 999999 是您想要設定的超時時間(單位為秒)。

  • Microsoft SQL Server:您可以在 SQL Server 的物件瀏覽器中,右鍵點擊伺服器並選擇屬性。然後選擇連線節點,在遠端查詢超時框中,輸入或選擇一個從 0 到 2,147,483,647 的值,以設定 SQL Server 等待超時前的最大秒數³。

請注意,這些操作可能需要資料庫管理員的權限。如果您不確定如何操作,或者您的資料庫系統不在上述列表中,建議您聯繫您的資料庫管理員或者查詢相關的官方文件。

希望這些資訊能對您有所幫助!

來源: 與 Bing 的交談, 2024/4/18 (1) How can I see / change MySQL connection timeout settings?. https://stackoverflow.com/questions/16192410/how-can-i-see-change-mysql-connection-timeout-settings. (2) Configure the remote query timeout (server configuration option). https://learn.microsoft.com/en-us/sql/database-engine/configure-windows/configure-the-remote-query-timeout-server-configuration-option?view=sql-server-ver16. (3) Is it possible to set a timeout for a SQL query on Microsoft SQL Server? - Stack Overflow. https://stackoverflow.com/questions/3091783/is-it-possible-to-set-a-timeout-for-a-sql-query-on-microsoft-sql-server. (4) Changing the CommandTimeout in SQL Management studio. https://stackoverflow.com/questions/1137190/changing-the-commandtimeout-in-sql-management-studio.

Broken pipe

"Broken pipe" 這個錯誤通常是由於以下兩種情況之一造成的¹²:

  1. 客戶端已經關閉連接,但伺服器仍在嘗試寫入資料:這種情況下,伺服器會收到 "Broken pipe" 錯誤,因為它嘗試寫入的管道已經被關閉¹。
  2. 連接超時或被中斷:如果連接在傳輸資料時被中斷(例如因為網路問題或客戶端突然關閉),伺服器在嘗試寫入資料時也會收到 "Broken pipe" 錯誤²。

要避免這個問題,您可以嘗試以下的方法:

  1. 確保客戶端在伺服器完成寫入操作之前不會關閉連接:這可能需要您檢查和修改您的應用程式邏輯,以確保客戶端在接收到所有資料之前不會關閉連接¹。
  2. 增加連接的超時時間:如果連接因為超時而被中斷,您可以嘗試增加連接的超時時間,以確保伺服器有足夠的時間來完成寫入操作²。
  3. 檢查和調整伺服器的配置:例如,如果您使用的是 Apache Tomcat,您可能需要檢查和調整 Tomcat 的配置,以確保它可以正確地處理連接和寫入操作²。

希望這些資訊能對您有所幫助!

來源: 與 Bing 的交談, 2024/4/18 (1) How to fix java.net.SocketException: Broken pipe?. https://stackoverflow.com/questions/2309561/how-to-fix-java-net-socketexception-broken-pipe. (2) Java NIO: What does IOException: Broken pipe mean?. https://stackoverflow.com/questions/1181255/java-nio-what-does-ioexception-broken-pipe-mean. (3) 解决Java中的java.io.IOException: Broken pipe问题 - CharyGao - 博客园. https://www.cnblogs.com/Chary/p/16835248.html. (4) 解决:org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe - CSDN博客. https://blog.csdn.net/springhub/article/details/135825938. (5) SpringBoot application throwing "Broken Pipe" time to time. https://stackoverflow.com/questions/68559832/springboot-application-throwing-broken-pipe-time-to-time. (6) spring - java.io.IOException: Broken pipe bringing down the embedded tomcat 8 app - Stack Overflow. https://stackoverflow.com/questions/31211225/java-io-ioexception-broken-pipe-bringing-down-the-embedded-tomcat-8-app. (7) java.io.IOException: Broken pipe within an Apache Tomcat valve. https://stackoverflow.com/questions/36929016/java-io-ioexception-broken-pipe-within-an-apache-tomcat-valve.