当前位置: 首页 > 知识库问答 >
问题:

针对Hyper-V VM中运行的SQL服务器诊断慢速JDBC选择语句

范弘亮
2023-03-14

我们刚刚构建了一个新的Hyper-V虚拟机来托管Java应用程序和MicrosoftSQL服务器。在运行JavaJDBC应用程序的SQL选择查询时,我们遇到了数据库响应极其缓慢的问题。从SQL服务器管理工作室运行时,同样的查询执行速度很快。

我们已经在裸机和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:45 到 9 秒内 36k 行,具体取决于 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视图也很简单。

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服务器2017
  • SQL服务器2019

Java版本:8_241

我不确定报告 SQL 分析结果的最佳方式,因此我只总结一下 SQL 事件探查器报告的内容。SSMS 客户端在 23 秒内执行视图查询。JDBC 客户端在完成查询之前花费了 100 多秒的时间。

SQL: Batch开始"选择*从app_view…"2020-02-26 20:04:22

SQL:batch starting " select * from app _ view where ... "2020-02-26 19:55:39

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

SQL: Batch开始"前5000名a.app_id从app_table"2020-02-27 10:27:55.740
SQL: Batch完成"前5000名a.app_id从app_table"2020-02-27 10:27:55.810

SQL:BatchStarting“top 5000 a.app_id from app_table a”2020-02-27 10:25:45.63
SQL:Batch Completed“top 5000.app_id for app_table”2020-03-27 10:25:45.843

共有2个答案

江恩
2023-03-14

好的,所以我们得到了这些结果。

编辑:

对这个问题的简短回答是:客户端不应该太重要(即:SSMS与. Net与JDBC等之间不应该有那么大的差异)就Hyper-V与裸机而言,裸机获胜(假设您的磁盘是虚拟化的),原因很明显。您可以在VM与类似规格的裸机环境中使用DiskSpd(https://aka.ms/diskspd)运行一些I/O测试来证明这一点。

然而-我还不相信这些因素中的任何一个是问题所在。根据您的跟踪结果,两个客户端在基表上的表现都很好。两个客户端在视图上的表现都相对较差(Java客户端比SSMS差)。所以,我仍然建议,至少:

>

  • 刷新视图(如前所述)
  • 尝试一个简单的SELECT TOP 5000*FROM dbo。app_view(来自两个客户端)-不带任何WHERE子句-比较结果
  • 在SSMS中检查基础表上的索引碎片(右键单击表下的索引“文件夹”,单击“全部重建”,查看对话框中的数字。)甚至PK索引也可能变得碎片化,这可能导致性能变得不稳定。

    尝试原始查询的不同版本,例如:

    选择*从dbo.app_view其中app_id%1000=0

    (没有SELECT…WHERE IN…)

    最后,实际视图的输出中有多少列?(如果视图非常宽,则由于网络流量以及数据的客户端呈现,可能会对客户端性能产生负面影响。)

  • 陶朝明
    2023-03-14

    首先,让我们看看问题实际上是SQL Server、应用程序还是其他。打开SQL事件探查器并启动跟踪。

    在跟踪运行的情况下,执行以下查询:

    • SELECT TOP 5000a.app_id从dbo.app_table;(运行这一个SSMS)
    • SELECT TOP 5000a.app_id从dbo.app_table;(在您的app/JDBC客户端中运行此项)

    (为了彻底起见,您可以针对您的视图重复上面的SELECT语句。)

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

     类似资料:
    • 好的,我在Eclipse Neon中开发一个游戏,我注意到当我在程序中添加了一个break语句时,程序的速度从大约120 fps降低到了80 fps(这没有什么意义)。所以我决定在另一个班级进行测试,得到了相似的结果。 这是我运行的代码: 所以当我运行代码时(在Eclipse Neon 2 (4.6.2))我得到了意想不到的结果: 使用中断语句:耗时(MS):344.8(5次测试的平均值) 无中断

    • 问题内容: 我的一台Redis服务器今天反复停机,没有任何明显的可诊断原因。我所有的用户最终都会遇到错误。 查看处的日志,最后几行捕获的内容比计划的备份更为有害: pid文件仍然存在。这意味着服务器没有被正式关闭,redis仍被守护? 我登录到系统,并做了两次以使其启动并运行。除了这些日志,我还能如何诊断可能出了什么问题? 更新:我注意到在第一次崩溃时,磁盘交换开始发生。这从未发生过。此外,确认将

    • 当使用JDBC的查询创建语句并获得数百万行的结果集(从SQL Server)时,真正执行了哪些SQL查询,这些行存储在哪里,有多少行?它使用SQL Server游标吗?我知道只有有限数量的行保存在客户端内存(Java代码所在的位置)中,那么其余的行保存在哪里呢,或者可能还没有从SQL Server查询到它们)?当我查看SQL Server profiler时,它只显示了普通的查询(没有添加游标或其

    • 针对Postgres数据库的某个索引SELECT查询所花费的时间非常可变--从50毫秒到多秒,有时甚至是几分钟,即使在最轻的负载下也是如此。 你能为26秒的差距提出一个解释吗? 关于并发的注意事项:即使只有一个请求也有很大的可变性:端到端50-300毫秒,但是当一个用户提交一批大约100个这样的查找时(可能有10-20个同时运行),很可能有几个查找需要5-10秒。然而C3P0的统计数据从来没有比:

    • 本文向大家介绍IBM服务器诊断面板使用方法,包括了IBM服务器诊断面板使用方法的使用技巧和注意事项,需要的朋友参考一下   IBM服务器一般会有一个服务器操作员信息面板(诊断面板),服务器一般的硬件故障都会在诊断面板上提示,但这些提示可能只是一个大概的诊断故障,有助于系统管理员更好的维护。 一、IBM X3650 M3诊断面板位置: 说明:   电源控制按钮和供电指示灯按下此按钮可手动开启和关闭服

    • 我有一个SQL Server 2000数据库,它有一个存储过程,可以根据给定的id从特定的表中删除一行。当我从VB.NET调用存储过程时,它不会删除行,但是通过SSMS直接在数据库上运行相同的脚本,它可以工作。 以下是我的事件链: < li >启动SQL Server Profiler以监视对数据库的所有调用。我将它设置为跟踪存储过程何时开始、完成,甚至跟踪存储过程中SQL语句的开始/完成。 <