2016-11-08 142 views
1

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

Select * from ts_logs where time_sheet_id = 1234 

表有大约110万条记录,并直到4天前就已经进行大约半秒钟一个非常快速的查询。

我们的应用程序使用hibernate和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)); 
+1

查询返回多少行?也许DbVisualizer不显示它们和NetBeans。或DbVisualizer不显示所有内容。请[编辑]你的问题,并为有问题的表添加'create table'语句。在所有四种环境中,您是否使用**完全相同的**参数作为连接URL? –

+0

用create语句更新了问题。 NetBeans上的默认值为1000行,返回的实际行总数为2.所有环境中的相同url。 –

回答

1

可能发生的情况是查询计划发生了变化,可能是由于行数增加。您应该运行UPDATE STATISTICS,并检查查询计划。如果搜索参数没有足够的选择性来检索所需的行,则应该重新考虑表/查询设计。

+0

我们昨晚运行了更新统计,发现它解决了我们的问题。我们最终发现的是,在某些机器上,dbvisualizer会使用表索引来查询表,但在使用dbvisualizer的其他机器上,即使使用相同的驱动程序,它也不会使用表索引。我打算发布一个问题,询问什么会导致索引不总是被使用?这似乎是在不同机器中非常一致的行为。你有没有对此有任何想法?它已经运行了近3年,突然成为一个问题。 –

+0

当数据内容发生变化或者表格被分割时,查询计划总是有可能在某个时间点翻转。因此,定期运行UPDATE STATISTICS(如果可能,更新INDEX STATISTICS)是正常数据库维护的一部分。 – RobV