【问题标题】:Speed Up Oracle Select by Cache or partition通过缓存或分区加速 Oracle Select
【发布时间】:2019-12-26 11:00:01
【问题描述】:

我有一个 100+ 百万行的 oracle MV。我们的大部分代码都针对这个视图调用,所以我想保持语法完整并确保这些调用非常快。

由于业务逻辑,我知道不到 100 万行就足以回答 99% 以上的所有呼叫。假设这百万行在分区 1 中。我想知道:

  1. Oracle 是否(可能)自行发现并通常返回缓存结果而不是实际扫描表?
  2. 我是否可以告诉 Oracle 始终先检查第一个分区,然后按喜欢的方式继续。
  3. 我还能做些什么吗?

如果 (1) 是这种情况,那么我想我们已经尽可能快了。 否则我怎么能让(2)工作?还是有什么 (3) 是我还没想到的?

你能帮忙吗? 你好, 彼得

【问题讨论】:

  • 是否有一个通用键可以标识这些“100 万行”?如果是这样,这就是您的分区依据,Oracle 将足够聪明地找出答案。
  • @APC;基本上是的。但是现在我们还没有按这个键进行分区。所以我想这就是我们接下来要做的。
  • @APC:只是为了仔细检查:键是按一些“日期值”排序的,这足以确保所有重要的行都在分区 1 中。但大多数选择不会要求这样做日期值。 oracle 是否仍然足够聪明,可以先检查分区 1?
  • 不太可能。通常,分区修剪(仅搜索 Oracle 知道具有所有必需记录的分区)仅适用于使用分区键的查询。可能如果您有与日期绝对相关的东西并且您收集直方图统计信息,那么 Oracle 可能能够建立相关性并仍然查看一个分区。但我不能确定,因为我只使用过其键始终是查询一部分的分区(我过着多么狭窄的生活)。
  • 所有这些 (99.9%) 查询都使用相同或相似的 WHERE 子句吗?你怎么知道他们能满足这个子集?你能写一个可靠地识别所有这些记录的查询吗?

标签: oracle performance caching query-optimization large-data-volumes


【解决方案1】:

部分答案 2)

你可以告诉Oracle你想从哪个分区中选择数据:

SELECT *
FROM partitioned_table PARTITION (partition_name) s
WHERE ....;

【讨论】:

  • 嗯,是的。我不想更改我的同事 SQL。有时他们也需要其他数据,所以我无法将 MV 降低到 99.9%。因此,我想知道是否有使用优化器的技巧的解决方案。
  • 你当前的分区键是什么?
  • 当前键是文章ID。这实际上将成为大多数调用的一部分,但是,由于此键中没有任何有用的排序机制,因此按键进行分区也会将所有相关 ID 拆分到分区中。
【解决方案2】:

我想,我想要的方式是不可能的。我发布了 APC 评论,因为它似乎不符合我的需求:

APC: 不太可能。通常,分区修剪(仅搜索 Oracle 知道具有所有必需记录的分区)仅适用于使用分区键的查询。可能如果您有与日期绝对相关的东西并且您收集直方图统计信息,那么 Oracle 可能能够建立相关性并仍然查看一个分区。但我不能确定,因为我只使用过其键始终是查询的一部分的分区(我过着多么狭窄的生活)。 – APC 8 月 21 日 10:24

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多