【问题标题】:How to improve performance of a simple select query in oracle如何提高 oracle 中简单选择查询的性能
【发布时间】:2019-05-24 21:48:39
【问题描述】:

我最近参加了一次面试,有人问了我一个问题

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

Select id,name from employee

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

由于查询中没有where clause,我不建议对该列进行索引。 由于这个逻辑每次都需要 20 秒,所以其他一些代码在这个表上锁定也是不可能的。 我建议限制从表中提取的记录数量应该会有所帮助,但面试官看起来并不相信

作为开发人员,我们还能做些什么来优化调用。我猜 DBA 可能会调整数据库设置以提高此查询的性能,但有没有其他方法

【问题讨论】:

  • 如果您使用一些 ORM 工具(如休眠),您可以启用缓存...但我不知道在有两列的表中为什么需要这样的性能增强...javabeat.net/introduction-to-hibernate-caching
  • 如果生成的 List/Map 很少更改,则可以在本地缓存初始结果以避免未来的数据库命中。或者如果结果偶尔发生变化,那么仍然缓存一段合理的时间,当它过期时立即获取更新的结果到缓存中(而不是在实际需要时等待)。

标签: java oracle oracle11g


【解决方案1】:

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


如果您创建一个涵盖idname 的索引,那么数据库可以使用该索引更快地读取数据,因为它甚至不必读取表。

请参阅此link 以获得更详尽的说明。

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

【讨论】:

  • Employee 表只有这两列。所以,我猜,如果没有任何 where 子句,它会进行全索引扫描,导致与直接访问表的时间大致相同
  • 是的,你是对的 - “事实上”:索引只不过是另一个表。如果问题是关于 Oracle 而不是关于 Java 代码的问题 - 有一堆用于查询优化的 Oracle 提示......
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    好的,这是一个面试问题,所以问题和解决方案都是假设性的。面试官要求可能的优化和/或方法。以下是一些最有可能提供帮助的方法:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-01-20
      • 1970-01-01
      • 2019-09-06
      • 2018-02-09
      • 2018-01-03
      • 2013-01-16
      • 2016-01-09
      • 1970-01-01
      • 2019-05-23
      相关资源
      最近更新 更多