【发布时间】:2018-11-21 02:17:08
【问题描述】:
在通过查询和进行在线研究进行研究之后,我正在向您寻求意见。期待您的回复!我正在尝试以一般方式编写此内容,因为我正在寻找有关如何执行此操作的一般想法,而不是确切的陈述。如果这个问题收到的不好,我很乐意重做,让我知道。我们开始:
我有两张桌子:
- 表 1 有 10 条 MIO 记录。它只有一列:
- A 列:唯一 ID(文本,例如“5uz1g09aksmsd”)
- 表 2 有 300 条 MIO 记录。它有两列:
- A 列:唯一 ID(文本,例如“5uz1g09aksmsd”)
- B 列:一个数字(例如 32.5432)
目前还没有索引等,甚至没有 PK,因为这两个表都是刚刚通过 CTAS 创建的。这两个表都已分析。
我现在正在寻找一个快速查询(准备工作,例如创建索引可能需要时间,没问题)来创建第三个表,其中包含表 1 的 10 个 MIO 行,以及表 2 的 B 列(如果匹配)通过 A 列找到(99% 会找到匹配项)。为了更清楚,一个简单的 CTAS 可以是:
create table3 as
select t1.a,
(select t2.b from table2 t2 where t2.a = t1.a and rownum = 1)
-- the rownum = 1 is to show Oracle that there can only be one match
from table1 t1;
这不是尽可能快(我希望)。你有什么想法让它更快?创建索引?哪个?您希望在执行计划中看到什么样的联接?哈希连接?我已经找到了
- 创建表不记录
- 并行查询执行和并行表创建
但我感兴趣的是,考虑到我们被允许更改系统(例如创建索引),完美执行计划的具体细节。特别是我要求 11gR2 但也非常欢迎 12c cmets。
【问题讨论】:
-
表1到表2有外键吗?
-
@Boneist 感谢您的提问。我更新了我的问题以使其更清楚。没有外键(目前还没有,但如果您认为这会大大加快速度,我们可以创建一个)。
-
如果我是你,鉴于列数很少,可能值得将表 1 和 2 的数据存储在索引组织的表中,而不是标准的堆表中(例如
create table_1 (column_a primary key) organization index as select ...)。请注意,这需要指定主键,但我认为这不是问题。 -
@Boneist 谢谢你的建议。明天我将尝试 IOT。你认为好处会从哪里来?表 1 作为 IOT 还是表 2 作为 IOT?或者当两者都是物联网时会有更大的好处?创建索引(T1 上的 A,T2 上的 A,B)在查询速度方面应该产生相同的结果,因为在索引访问之后不需要表访问? T1 上的索引如何提供帮助,因为无论如何我们都需要所有行?在您看来,“完美的非并行全行”执行计划是什么样的?
-
使用 hash join 的最简单方法是使用高效的硬件使用并行查询选项。无日志记录和并行表创建的影响较小,因为经过时间的基数在连接中(简单测试)。由于表是新创建的并且仅包含相关列,因此在您的情况下,索引对哈希联接没有用(它们会比表更大)。
标签: oracle