AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 250059
Accepted
Max
Max
Asked: 2019-10-03 00:28:50 +0800 CST2019-10-03 00:28:50 +0800 CST 2019-10-03 00:28:50 +0800 CST

Oracle 数据库 TABLES 和 INDEXES 上的 NOLOGGING 子句的目的是什么

  • 772

我在徘徊在表和索引上使用 NOLOGGING 子句的实际目的是什么。

据我从 Oracle 文档中了解到的,我们可以防止数据库仅在直接路径模式下插入时生成重做日志。UPDATING 或 DELETING 时无法避免重做日志生成。

所以,我们通常写

INSERT /*+ APPEND NOLOGGING */ INTO TABLE ... ;
commit;

为了防止重做日志的产生。

我完全不明白在创建 TABLE 或 INDEX 时使用 NOLOGGING 子句的实际优势是什么,也没有在创建 TABLESPACES 时使用 NOLOGGING 子句来设置将在该表空间上创建的对象的默认值。

谁能描述一个实际场景,在数据库对象上设置这个子句可能会带来好处?

oracle transaction-log
  • 2 2 个回答
  • 5257 Views

2 个回答

  • Voted
  1. Best Answer
    Balazs Papp
    2019-10-03T00:35:50+08:002019-10-03T00:35:50+08:00

    没有这样的提示NOLOGGING。

    当然,UPDATEandDELETE操作不能利用NOLOGGING,但是还有其他操作可以:

    日志记录子句

    只有部分支持 LOGGING 的位置支持 NOLOGGING。只有以下操作支持 NOLOGGING 模式:

    DML:

    由 INSERT 或 MERGE 语句产生的直接路径 INSERT(串行或并行)。NOLOGGING 不适用于由 MERGE 语句产生的任何 UPDATE 操作。

    直接加载程序 (SQL*Loader)

    DDL:

    CREATE TABLE ... AS SELECT(在 NOLOGGING 模式下,将记录表的创建,但不会记录直接路径插入。)

    CREATE TABLE ... LOB_storage_clause ... LOB_parameters ... CACHE | 诺卡 | 缓存读取

    ALTER TABLE ... LOB_storage_clause ... LOB_parameters ... CACHE | 诺卡 | CACHE READS(指定新创建的 LOB 列的日志记录)

    ALTER TABLE ... modify_LOB_storage_clause ... modify_LOB_parameters ... CACHE | 诺卡 | CACHE READS(更改现有 LOB 列的日志记录)

    改变表...移动

    ALTER TABLE ...(所有涉及数据移动的分区操作)

    ALTER TABLE ... ADD PARTITION(仅限散列分区)

    ALTER TABLE ... 合并分区

    ALTER TABLE ...分割分区

    ALTER TABLE ...移动分区

    ALTER TABLE ... 修改分区 ... 添加子分区

    ALTER TABLE ...修改分区...合并子分区

    创建索引

    改变索引...重建

    ALTER INDEX ... 重建 [SUB] 分区

    ALTER INDEX ...分割分区

    • 2
  2. Albert Godfrind
    2019-10-03T02:18:30+08:002019-10-03T02:18:30+08:00

    正如您所指出的,NOLOGGING 机制是为了避免生成重做日志信息,这可以使批量加载更快。

    我通常将它用于大型装载工作。例如,加载 TB 的卫星图像:这意味着我会将 TB 位写入数据库(数据文件),但我也会将 TB 写入重做日志。这意味着日志上有额外的 I/O,以及用于归档日志的大量磁盘空间。

    通过在加载期间禁用日志记录,我避免了那些额外的 I/O 和空间。

    当然,这意味着,如果我完全丢失了媒体(= 一个磁盘驱动器无法修复),那么我将无法恢复:我可以从备份中恢复媒体,但我无法前滚失败的加载。这很好:从最后一个提交点重新启动加载比让数据库在 TB 和 TB 的日志中缓慢前进要快。

    因此,基本上,在以下情况下,nologging 是有意义的:

    1. 您知道它会加快负载的速度。
    2. 您可以轻松地从任何故障中重新启动/继续(例如:只需重做CREATE TABLE AS SELECT或INSERT SELECT
    • 1

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve