【问题标题】:Oracle DB read queries performance boostOracle DB 读取查询性能提升
【发布时间】:2017-01-13 20:37:10
【问题描述】:

我正在使用 Oracle 数据库,在某些情况下,我们会查询表中的所有行(选择少数但不是所有列名)(在某些情况下,会在表上创建视图)。我想提高我的选择查询的性能。我在表中使用主键。

例如有一个表:表 (id, a, b, c, d, e, f) 有 100k 行。我查询如下:

SELECT c, d, f FROM Table;

我曾尝试使用 MATERIALIZED VIEWS,但实际上几乎没有发现性能提升。

我考虑过使用 PARTITIONS,但后来我认为我正在扫描所有行(但不是所有列),那么在这种情况下分区会有所帮助吗?

【问题讨论】:

  • 也许你应该考虑表压缩:docs.oracle.com/cd/B28359_01/server.111/b28310/…
  • 如果您只选择大量行,那么瓶颈几乎肯定是数据库和从中读取数据的应用程序之间的网络。但是为什么你会经常从一个表中选择所有的行呢?为什么用户或应用程序经常想要查看 100,000 行?
  • 显示 100k 行是对 SQL 客户端的性能测试,而不是对数据库的性能测试。为什么您认为 MVIEW 会使检索 all 行更快?您仍然会检索 100k 行。

标签: sql database oracle oracle11g rdbms


【解决方案1】:

评论有点长。

如果您选择所有行,则您选择了很多数据。删除少量列可能对性能影响不大——除非您要删除的列非常宽。毕竟,数据库引擎仍然需要读取所有个数据页,并返回几乎所有的数据。

如果您确实有宽列,那么您也许可以通过使用物化视图(具有相关的开销)来减少时间,或者将常用的列存储在一个表中,将其余列存储在另一个表中(垂直分区)。

最后,100,000 条记录是返回给应用程序的大量记录。如果您可以在数据库中做更多的工作并减少返回的数据量,我不会感到惊讶。

【讨论】:

    【解决方案2】:

    根据您的列类型/数据,检索 100,000 条记录并不算多。如果您要检索大型类型,例如BLOBCLOB,那就太多了。好吧,这一切都依赖于运行你的 Oracle 服务器的机器的配置,但我假设它有一个合理的配置。

    我在一个包含 386,843 行的 Oracle 表中执行了一个查询...它在 8.25 秒内为每行返回三个 NUMBER 列...考虑到数据量,它并没有那么慢...

    EXPLAIN PLAN 表示它创建了一个索引 FAST FULL SCAN,但由于检索到所有数据,FULL TABLE SCAN 也不应该代表性能问题。

    我认为你应该检查两点:

    1. 有多少客户端将同时执行此功能?比方说,500 个同时访问...这对您的数据库/网络来说是一个很大的负载,即使有一些数据缓存...

    2. 网络不会耽误您的工作吗?您可能会在这里发现问题...

    您不能“按需”加载数据吗?每次检索 5,000 行。这是处理用例的更好方法。这样,表/索引分区可能会有很大帮助。

    【讨论】:

      猜你喜欢
      • 2015-10-17
      • 2020-06-04
      • 2019-05-23
      • 2021-08-14
      • 2014-04-02
      • 1970-01-01
      • 2013-01-16
      • 2016-03-24
      相关资源
      最近更新 更多