【问题标题】:Sybase / hibernate database performanceSybase / hibernate 数据库性能
【发布时间】:2017-03-22 11:43:27
【问题描述】:

我们有一个 Sybase 数据库,我们用一个非常简单的查询来查询。

Select * from ts_logs where time_sheet_id = 1234

该表有大约 110 万条记录,直到 3 天前,它是一个非常快速的查询,大约在半秒内执行。

我们的应用程序使用休眠,并且 sql 输出显示完全相同的查询。截至三天前,我们注意到性能大幅下降,查询现在需要 9 到 11 秒才能执行。

我们尝试在 NetBeans 数据库可视化工具中运行查询,发现同样的性能问题。我们最初开始确定这是一个数据库性能问题,并决定在 dbvisualizer 中进一步诊断该问题,但令我们惊讶的是 dbvisualizer 在不到半秒的时间内执行了完全相同的查询。

我们在每个环境中都使用 jtds 1.3。

所有环境中的相同数据库。

所有环境中的相同查询。

什么可能导致 hibernate / netbeans 中的性能瓶颈,而不是 dbvisualizer?对下一个景点有什么想法吗?

CREATE TABLE ts_log (id numeric identity(19) NOT NULL GENERATED ALWAYS AS IDENTITY, log_comment varchar(2500), log_entry varchar(2500) NOT NULL, time_sheet_id numeric(19) NOT NULL, PRIMARY KEY (id));

【问题讨论】:

  • 查询返回多少行?也许 DbVisualizer 不会显示所有这些,而 NetBeans 会。或者 DbVisualizer 不显示所有内容。请edit 您的问题并为相关表格添加create table 语句。您是否在所有四种环境中都对连接 URL 使用相同参数?
  • 用 create 语句更新了问题。 NetBeans 的默认值为 1000 行,实际返回的总行数为 2。所有环境中的相同 url。

标签: hibernate sybase jtds


【解决方案1】:

可能发生的情况是查询计划已更改,可能是由于行数增加。您应该运行 UPDATE STATISTICS,并检查查询计划。如果搜索参数的选择性不足以检索所需的行,则应重新考虑表/查询设计。

【讨论】:

  • 我们昨晚运行了更新统计信息,发现它解决了我们的问题。我们最终发现,在某些机器上 dbvisualizer 会使用表索引查询表,但在其他使用 dbvisualizer 的机器上,尽管驱动程序相同,但它不会使用表索引。我打算发布一个问题,询问什么会导致索引不总是被使用?这似乎是不同机器之间非常一致的行为。你对这件事有什么想法吗?它已经运行了将近 3 年,突然变成了一个问题。
  • 当数据内容发生变化或表出现碎片时,查询计划总是有可能在某个时候翻转。因此,定期运行 UPDATE STATISTICS(如果可能,UPDATE INDEX STATISTICS)是正常数据库维护的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 2017-01-05
  • 2022-11-12
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多