当前位置: 首页 > 面试题库 >

为什么CREATE TABLE AS SELECT比SELECT INSERT更快

黎阳冰
2023-03-14
问题内容

我使用INNER JOIN进行查询,结果为1200万行。我喜欢把它放在桌子上。我做了一些测试,当我使用AS
SELECT子句创建表时,比先创建表并在运行SELECT之后运行INSERT更快。我不明白为什么。有人可以为我解释吗?ks


问题答案:

如果您使用“选择创建表”(CTAS)

CREATE TABLE new_table AS 
    SELECT * 
    FROM old_table

您会自动对数据进行 直接路径插入 。如果你做一个

INSERT INTO new_table AS 
    SELECT * 
    FROM old_table

您执行 常规插入操作 。如果要执行直接路径插入,则必须使用APPEND提示。所以你要做

INSERT /*+ APPEND */ INTO new_table AS 
    SELECT * 
    FROM old_table

获得与“在创建表中进行选择时相似”的性能。

常规的常规刀片如何工作?

Oracle检查 表的
可用列表
中是否有可用空间的表段已使用块。如果该块不在缓冲区高速缓存中,则将其读入缓冲区高速缓存。最终,该块被读回到磁盘。在此过程中,将写入该块的撤消操作(此处仅需要少量数据),将更新数据结构,例如,如有必要,将更新的数据表保留在段头中,并将所有这些更改写入重做-
缓冲区也一样。

直接路径插入如何工作?

该过程在表的 高水位线上方
分配空间,即超出已使用的空间。它将数据直接写入磁盘,而无需使用缓冲区高速缓存。并且还将其写入重做缓冲区。提交会话后,高水位标记将超出新的书面数据,并且其他会话现在可以看到此数据。

如何改善CTAS和直接路径插入?

  • 您可以在NOLOGGING模式下创建故事,而不写入任何重做信息。如果执行此操作,则应在插入后对包含该表的表空间进行备份,否则,如果需要,将无法恢复该表。
  • 您可以并行选择

  • 您可以并行插入

  • 如果在插入操作期间必须维护索引和约束,甚至触发,这可能会大大降低插入操作的速度。因此,您应该避免这种情况,并在插入之后创建索引,并可能使用novalidata创建约束。



 类似资料:
  • 问题内容: 我试图理解 为什么Java的ArrayDeque比Java的LinkedList更好, 因为它们都实现了Deque接口。 我几乎看不到有人在他们的代码中使用ArrayDeque。如果有人对ArrayDeque的实现方式有了更多的了解,那将是有帮助的。 如果我理解它,我会更自信地使用它。对于JDK实现管理头和尾引用的方式,我不清楚。 问题答案: 链接结构可能是最糟糕的结构,要在每个元素上

  • 问题内容: 我目前正在开始新的应用开发。应用程序设计师坚持认为我们使用 JBoss5 是因为它“更好”。是否有人对“更好”有更广泛的定义(如果如此)? 我有在具有大量用户负载的大规模应用程序中使用 Tomcat5 和6的经验,并且它处理得很好(IMHO)。两者都将在相同的硬件条件下(如果实现很重要)在 RedHat6 上运行。 提前致谢 问题答案: 说任何工具或框架都只是“更好”是可笑的。它总是取

  • 问题内容: 一直有人告诉我,在调试应用程序时,JavaScript的方法优于简单的使用方法。为什么是这样?有没有一个很好的例子,有人可以指出我哪里是更好的选择? 问题答案: 正在阻止 在非调试环境中不容易被抑制 通常可以很好地格式化对象并允许遍历它们 日志记录语句通常具有交互式的代码指针,该代码发出了日志记录语句 您一次只能查看一个以上的消息 可以通过直观的格式设置不同的日志记录级别

  • 问题内容: 许多Java书籍都将该语句描述为比该语句快。但是我没有找到任何地方为什么切换比if更快。 例 我有一种情况,我必须选择两项中的任何一项。我可以使用 要么 考虑item和BREAD是一个恒定的int值。 在上面的示例中,哪个操作更快,为什么? 问题答案: 因为有很多情况下,有一些特殊的字节码可以有效地评估switch语句。 如果使用IF语句实现,则将进行检查,跳转到下一个子句,进行检查,

  • 问题内容: 阅读此内容后,引人注目: BSON还被设计为快速编码和解码。例如,整数存储为32(或64)位整数,因此不需要在文本之间进行解析。对于小整数,此方​​法比JSON使用更多的空间, 但解析速度要快得多 。 根据我的阅读,使用BSON的全部目的是因为它对CPU的负担更少,并且编码/处理速度更快。 但是,我对Node.js进行了一些测试,并使用本机JSON方法使BSON脱颖而出。一些测试表明J

  • 问题内容: 我已经看到了两种方式,但是哪种方式更适合Python? 哪种方法被认为是更好的Python? 问题答案: 第二个选项是Pythonic,原因有两个: 它是 一个 运算符,转换为一个字节码操作数。另一行是真的; 两个操作员。 碰巧的是,Python会 优化 后一种情况 并转换成任何情况,但这是CPython编译器的实现细节。 这接近于您在英语中使用相同逻辑的方式。