【问题标题】:Performance of SELECT query- Oracle/JDBCSELECT 查询的性能 - Oracle/JDBC
【发布时间】:2011-12-20 19:05:56
【问题描述】:

我在系统中有一个现有的查询,它是一个简单的选择查询,如下所示:

SELECT <COLUMN_X>, <COLUMN_Y>, <COLUMN_Z> FROM TABLE <WHATEVER>

随着时间的推移,<WHATEVER> 的记录数量正在增长。有什么办法可以提高这里的性能吗?开发人员正在使用Statement 接口。我相信PreparedStatement 在这里不会有帮助,因为查询只执行一次。

还有什么可以做的吗?其中一列是主键,其他列是 VARCHAR(如果信息有帮助)

【问题讨论】:

  • 您需要表格中所有行中的三列?
  • 哪一部分慢?查询或java代码?你在 sqlplus 或 toad 中尝试过吗?
  • 有多少数据?您是通过网络发送的吗?
  • @jonearles:目前,有接近 5K 的记录(从之前的 3.5K 增加),不,我不是通过网络发送的。
  • 您是否准确测量过在哪里“太慢”了?获取大量数据将花费大量时间。

标签: java performance oracle jdbc


【解决方案1】:

您查询是否有任何谓词?还是您总是返回表中的所有行?

如果您总是返回所有行,column_x, column_y, column_z 上的覆盖索引将允许 Oracle 仅扫描索引而不是执行表扫描。随着时间的推移,查询仍然会变慢,但索引的增长速度应该比表慢。

如果您要返回行的子集,从性能角度来看,可能还有其他索引更有利。

【讨论】:

  • 不,查询没有任何谓词。是的,我必须一直返回表中的所有行。感谢您的反馈,我会落实您的建议,并将结果回复您。
【解决方案2】:

除了 SQL 查询调优之外,您还可以进行任何优化吗?如果是,这里有一些建议:

  • 尝试将表放入内存(如 MySQL 中的 MEMORY 存储引擎)或数据库中的任何其他优化
  • 在java中缓存ResultSet。只有当表格内容发生变化时才再次查询。如果表只有插入而没有更新或删除(一厢情愿),那么您可以使用 SELECT COUNT(*) FROM 表。如果返回的行与上次不同,则仅在需要时触发原始查询并更新缓存。

【讨论】:

    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2020-11-03
    • 2015-01-17
    • 1970-01-01
    • 2016-12-01
    • 2012-07-18
    • 2013-04-22
    • 1970-01-01
    相关资源
    最近更新 更多