gpt4 book ai didi

java - 针对 Hyper-V VM 中运行的 SQL Server 诊断缓慢的 JDBC 选择语句

转载 作者:行者123 更新时间:2023-12-01 18:13:08 24 4
gpt4 key购买 nike

我们刚刚构建了一个新的 Hyper-V 虚拟机来托管 Java 应用程序和 Microsoft SQL Server。当从 Java JDBC 应用程序运行 SQL 选择查询时,我们遇到了数据库响应极其缓慢的问题。从 SQL Server Management Studio 运行时,相同的查询执行速度很快。

我们在裸机和 VMware 虚拟机上运行相同的 Java 应用程序和 SQL Server 数据库,没有出现任何性能问题。

我们的问题:

  • 其他开发人员是否在 Hyper-V 虚拟机中遇到过类似的性能问题?
  • 我们如何诊断导致 JDBC 应用程序性能瓶颈的原因?

示例查询:

select * from view1 where app_id in (
select app_id from app_table where app_id % 1000 = 0)
order by app_id

响应时间:

  • SQL Server:9 到 36 秒内处理 45k 行,具体取决于 RAM、CPU 等
  • Java 应用程序:超过 4 小时

Hyper-V 虚拟机

  • Windows Server 2019 主机
  • Hyper-V 配置 9,第 2 代

app_table 表只有两列。

create table app_table (
app_id [numeric](18,0) not null,
col_2 [varchar] (75)
)

app_view View 也很简单。

create view app_view as select app_id from app_table

我们尝试了 Java 应用程序、JDBC 驱动程序和 SQL Server 的各种组合。

应用:

  • 我们的自定义 Java 应用程序
  • SQuirreL 客户端 (4.0.0)

JDBC 驱动程序:

  • sqljdbc4
  • sqljdbc_8.2.0.jre

SQL Server 版本:

  • SQL Server 2017
  • SQL Server 2019

Java版本:8_241

编辑:SQL 探查器结果

我不确定报告 SQL 分析结果的最佳方式,因此我将总结 SQL Profiler 报告的内容。 SSMS客户端在23秒内执行 View 查询。 JDBC 客户端花费了 100 多秒的时间才取消查询并完成。

对于 SSMS 客户端

SQL:BatchStarting“从 app_view 中选择 *,其中...”2020-02-26 20:04:22
<一堆重复的东西>
审核登录/注销
RPC:已完成“exec sp_reset_connection”
批量开始/完成“设置事务隔离级别读取...”
**SQL:BatchCompleted "select * from app_view where ..."2020-02-26 20:04:45

对于 JDBC 客户端 (SQuirreL)

SQL:BatchStarting“从 app_view 中选择 *,其中...”2020-02-26 19:55:39
<一堆重复的东西>
审核登录/注销
RPC:已完成“exec sp_reset_connection”
批量开始/完成“设置事务隔离级别读取...”

查询于 19:57:26 取消

编辑 2:更多 SQL 探查器结果

我在 SSMS 和 JDBC 客户端中分析了更简单的查询“从 app_table a 中选择前 5000 个 a.app_id”。令人惊讶的是,两者都执行得很快,不到 1 秒。

对于 SSMS 客户端

SQL:BatchStarting“app_table a 中的前 5000 个 a.app_id”2020-02-27 10:27:55.740
SQL:BatchCompleted“app_table a 中的前 5000 个 a.app_id”2020-02-27 10:27:55.810

对于 JDBC 客户端 (SQuirreL)

SQL:BatchStarting“app_table a 中的前 5000 个 a.app_id”2020-02-27 10:25:45.063
SQL:BatchCompleted“app_table a 中的前 5000 个 a.app_id”2020-02-27 10:25:45.843

最佳答案

首先,让我们看看问题是否实际上是 SQL Server、应用程序或其他方面的问题。打开 SQL Profiler 并开始跟踪。

运行跟踪后,执行以下查询:

  • SELECT TOP 5000 a.app_id FROM dbo.app_table a;(运行此 SSMS)
  • SELECT TOP 5000 a.app_id FROM dbo.app_table a;(在您的应用/JDBC 客户端中运行此)

(为了更彻底,您可以针对您的 View 重复上面的 SELECT 语句。)

停止跟踪并记下各个应用程序的执行时间(持续时间)。

关于java - 针对 Hyper-V VM 中运行的 SQL Server 诊断缓慢的 JDBC 选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60425411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com