【问题标题】:Insert Select with REGEXP_LIKE for 10Mn+ records running slow使用 REGEXP_LIKE 插入 Select 用于 10Mn+ 条运行缓慢的记录
【发布时间】:2021-08-22 23:52:26
【问题描述】:

问题是关于 Oracle 11g、Exadata。

我有一个大型临时表(超过 1000 万行),其中有一列显示事务发生位置的事务描述

TRANSACTION_DESCRIPTION
_______________________
KMART 19028    New jers
JC Penny 32f8d New Jers
KMARTStore 23101xg  Los Ang
JCPenny       Austin
Amazon Prime   Calif
MACYS        DALLAS

我有一个将各个商店与其母公司汇总的参考表。我可以买到像 JC Penny 或 JCPENNY 或 jcpenny 这样的单个商店的任何变体。

参考存储表的样子

Store_to_Search      Aggregator_Store
_____________________________________
JC Penny             JCPenny
JCPENNY              JCPenny
JCPenny              JCPenny
Macy                 Macy's
Macys                Macy's
Macy's               Macy's

我在 Transaction_description 上找到 Store_to_search 以查找匹配的聚合器。我对 Transaction_description 字段中的其他内容不感兴趣。 这是连接条件。

ON REGEXP_LIKE(T.TRAN_DESCRIPTION, '(^)' || S.STORE_TO_SEARCH )

Transaction_Description 和 Store_to_Search 均已编入索引,不唯一。

运行选择会在大约 5-6 分钟内返回数据。如果我删除这个维度表,那么我会在大约 1-2 分钟内得到结果。

但是,插入最终的 FACT 表需要 2-3 小时以上的时间。这是不可接受的。

事实表在插入时没有任何索引。 Fact 表中也没有分区。

我想要一些关于如何改进的建议 -

  • 插入(使用提示?)
  • 整个概念 - 有没有更好的方法来实现我想要实现的目标?

另外-我不是甲骨文的人。更多的 SQL Server,如果我们可以迁移到另一个团队使用的 Oracle,这是一个原则证明。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 我在大约 1-2 分钟内得到结果 - 这真的是获取所有值或仅获取前几行的时间吗?使用gather_plan_statistics 提示执行插入,然后使用以下命令检查执行的计划:select * from table(dbms_xplan.display_cursor(format => 'ALL ALLSTATS LAST))
  • 谢谢@astentx 好点。它使用 SQL Developer 返回前 50 个。我将不得不阅读如何做你提到的接下来的两件事。我会回来的。
  • 请提供您用于插入的实际查询

标签: sql oracle insert sql-insert large-data


【解决方案1】:

经过长时间的深思熟虑和谷歌搜索,我决定明智地处理它。

我没有在 FACT 表中插入数据,而是在将在我的多维数据集中使用的 FACT 表的 VIEW 中使用连接来引用表。如果我正确索引它会很快。

谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 2011-03-22
    • 2015-11-10
    相关资源
    最近更新 更多