【发布时间】:2023-04-05 06:31:01
【问题描述】:
hibernate 生成的以下查询需要 13+ 秒并锁定表:
SELECT COUNT(auditentit0_.audit_id) AS col_0_0_ FROM Audit auditentit0_ WHERE 1=1;
不断增长的 Microsoft SQL Server 数据库表包含 90+ 百万行。
对于 Microsoft SQL Server,我找到了一种准确的元数据方法,可以非常快速地获取相同的信息。
不过,如果 hibernate 有办法获取这些信息,我宁愿不为 Microsoft sql server 和 oracle(下一个数据库)编写自定义代码。
以下是 Microsoft sql server 的元数据查询示例,该查询准确且几乎是即时的:
SELECT SUM (row_count) FROM sys.dm_db_partition_stats WHERE object_id=OBJECT_ID('huge_audit_table') AND (index_id=0 or index_id=1);
有没有办法让 hibernate 发出类似的表行计数查询?
一个发布的答案表明视图可能是有用的。我正在调查这篇文章,看看它是否可以解决问题:
https://vladmihalcea.com/map-jpa-entity-to-view-or-sql-query-with-hibernate/
【问题讨论】:
-
1) “锁定表格”到底是什么意思?我以前从未见过 SELECT 查询锁定任何东西。 2)全表扫描看起来不正确,我希望对 PK 列进行快速索引扫描。 3) 为什么 1=1?条件不是必须的。 4) 是 Oracle 还是 MS SQL? 5) 元数据是一个估计,而不是正确的值
-
为什么需要它?统计结果。永远不会准确。但实际上没有表行计数是准确的——至少在 Oracle 上是这样。读取始终是非阻塞的,因此在读取过程中行数可能会发生变化。
-
@D-Klotz 将标签从 Oracle11g 更改为 MSSQL
-
Oracle 中的选择计数不会阻塞,元数据字典不同。我不认为有这样的解决方案。 gl
-
在不查看实现细节的情况下,我会考虑创建您自己的视图并将 RDBMS 差异隐藏在视图定义后面的可能性。然后您可以将视图映射到一个简单的 Hibernate 实体。那有意义吗?也可以是存储过程。
标签: java sql sql-server hibernate oracle11g