如何在Oracle中提高简单选择查询的性能

时间:2018-12-26 17:44:50

标签: java oracle oracle11g

我最近参加了一次采访,有人问我一个问题

我们有一个表employee(id, name)。在我们的Java代码中,我们正在编写一种逻辑来从该表中获取数据并将其显示在UI中。查询是

Select id,name from employee

查询是在调试过程中,我们发现此jdbc调用触发了查询并获得了20秒的输出,我们希望将其减少为5秒或最佳时间。您如何才能做到这一点,或者我将如何解决这个问题?

由于查询中没有where clause,因此我不建议对该列建立索引。 由于此逻辑每次要花费20秒,因此,其他一些锁定该表的代码也毫无疑问。 我建议限制从表中获取的记录数量应该会有所帮助,但是面试官看起来并不确信

作为开发人员,我们还有其他事情可以优化电话吗?我猜DBA可能会调整数据库设置以提高此查询的性能,但是还有其他方法吗

3 个答案:

答案 0 :(得分:3)

好的,所以这是一个面试问题,因此问题和解决方案都是假设的。面试官正在寻求可能的优化和/或方法。以下是最有可能帮助您的一些信息:

  • 将查询修改为 page 数据,而不是提取全部数据。这看起来适用于示例查询。请注意,这不仅是“限制从表中选择的行数” ...,这可能就是为什么当您这么说时,面试官看上去很可疑!

  • 如果确实需要显示整个所选记录集,但要以简化形式(例如,求和,求平均值,排序,整理等)显示,请在查询中进行简化,而不是通过获取记录并在其中进行客户。

  • 按照Ivan的建议调整fetchSize()

还有一些其他的想法不太可能帮助和/或需要大量的修改。

  • 查看网络配置。例如,通过操作系统级调整TCP缓冲区或优化物理或虚拟网络路径,您可能能够获得更好的吞吐量。
  • 在数据库服务器本身上运行查询(以消除网络开销)
  • 使用内存表
  • 查询辅助数据库服务器;例如只读快照或从属

答案 1 :(得分:2)

您可以尝试将fetchSize()的数量增加Statement/PreparedStatement,以减少应用程序服务器/台式机与数据库服务器之间的网络往返次数。 您可以启动多个线程来查询一些数据,然后合并来自多个线程的所有数据。

答案 2 :(得分:0)

编辑:不适用于这种情况,因为idname是此表上的唯一列,但对其他读者来说仍然有用。


如果创建同时覆盖idname的索引,则数据库甚至可以不必读取表,因此可以使用该索引更快地读取数据。

请参阅此link,以获得更全面的说明。

  

如果索引包含您请求的所有列,则甚至不需要查看表。这个概念称为索引覆盖率。