我们刚刚构建了一个新的Hyper-V虚拟机来托管Java应用程序和MicrosoftSQL服务器。在运行JavaJDBC应用程序的SQL选择查询时,我们遇到了数据库响应极其缓慢的问题。从SQL服务器管理工作室运行时,同样的查询执行速度很快。
我们已经在裸机和VMware虚拟机上运行了相同的Java应用程序和SQL Server数据库,没有出现任何性能问题。
我们的问题:
示例查询:
select * from view1 where app_id in (
select app_id from app_table where app_id % 1000 = 0)
order by app_id
响应时间:
Hyper-V虚拟机
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的各种组合。
应用:
JDBC司机:
SQL Server版本:
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
好的,所以我们得到了这些结果。
编辑:
对这个问题的简短回答是:客户端不应该太重要(即:SSMS与. Net与JDBC等之间不应该有那么大的差异)就Hyper-V与裸机而言,裸机获胜(假设您的磁盘是虚拟化的),原因很明显。您可以在VM与类似规格的裸机环境中使用DiskSpd(https://aka.ms/diskspd)运行一些I/O测试来证明这一点。
然而-我还不相信这些因素中的任何一个是问题所在。根据您的跟踪结果,两个客户端在基表上的表现都很好。两个客户端在视图上的表现都相对较差(Java客户端比SSMS差)。所以,我仍然建议,至少:
>
在SSMS中检查基础表上的索引碎片(右键单击表下的索引“文件夹”,单击“全部重建”,查看对话框中的数字。)甚至PK索引也可能变得碎片化,这可能导致性能变得不稳定。
尝试原始查询的不同版本,例如:
选择*从dbo.app_view其中app_id%1000=0
(没有SELECT…WHERE IN…)
最后,实际视图的输出中有多少列?(如果视图非常宽,则由于网络流量以及数据的客户端呈现,可能会对客户端性能产生负面影响。)
首先,让我们看看问题实际上是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语句的开始/完成。 <