NOLOGGING的正确用法

本文通过实验对比,揭示了nologging关键字在Oracle中的实际作用,并指出其正确的应用场合。测试表明,nologging仅在特定场景下能减少redo量,而常规使用时对性能提升有限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在看以前一些工作文档,发现有些DML脚本,用到了nologging的hint,即/*+NOLOGGING*/,这样写到底能不能减少日志量了??带着疑问,我做了以下测试:

1. 直接update,看redo量

SQL> create table a as select * from dba_objects;

Table created.

SQL> set autotrace trace stat;
SQL> update a set object_id=2;

49758 rows updated.

Statistics
----------------------------------------------------------
         50  recursive calls
      50719  db block gets
        806  consistent gets
        684  physical reads
   12760212  redo size
        676  bytes sent via SQL*Net to client
        560  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      49758  rows processed


2. 加nologging hint,再比较redo量,可以看到redo量几乎没变化!!

SQL> drop table a;

Table dropped.

SQL> create table a as select * from dba_objects;

Table created.

SQL> update/*+nologging*/ a set object_id=2;

49761 rows updated.

Statistics
----------------------------------------------------------
         50  recursive calls
      50722  db block gets
        799  consistent gets
        684  physical reads
   12761040  redo size
        679  bytes sent via SQL*Net to client
        574  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          2  sorts (memory)
          0  sorts (disk)
      49761  rows processed


通过上面的测试,我们可以看到nologging作为hint是起不了减少日志的作用滴,其实nologging并不是oracle有效的hint,而是oracle一个关键字,那应该怎么正确使用nologging了???

1. create table a nologging as select * from b;

SELECT a.VALUE
    FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
      AND b.NAME='redo size';

     VALUE
----------
       624


SQL> create table t1 as select object_id from dba_objects;

Table created.

SELECT a.VALUE
FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
      AND b.NAME='redo size';

     VALUE
----------
    701536


可见产生的redo量为:701536-624=700912,再用nologging同样创建一个表t2

SQL> create table t2 nologging as select object_id from dba_objects;

Table created.

SELECT a.VALUE
    FROM v$mystat a,v$statname b
WHERE a.STATISTIC#=b.STATISTIC#
         AND b.NAME='redo size';


     VALUE
----------
    738232


这样用nologging产生的redo量为:738232-701536=36696,redo量明显减少


2. CREATE INDEX T1_IDX ON T1(A) NOLOGGING;

3. ALTER INDEX T1_IDX REDUILD ONLINE NOLOGGING;

4. ALTER TABLE T1 NOLOGGING

以上才是nologging的正确用法,就不一一举例子了。强调一点,存在的不一定是合理的,大家一定要带着怀疑的眼光去看待存在的东西,它们真的不一定是合理的。。。。。。。

<think>好的,我现在需要帮用户创建BASP_FILEMANAGER_DIRECTORY表的SQL语句,并添加字段注释,同时检查配置或语法问题。用户之前提到他们在升级Spring Boot 3和Druid数据源配置时遇到问题,现在可能是在数据库迁移或表结构调整过程中遇到困难。 首先,用户要求创建表结构并添加注释。我需要确保SQL语法正确,特别是考虑到用户之前遇到的ORA-00933错误,这可能与SQL语句的结构有关。比如,INSERT INTO...SELECT语句的语法错误,可能是由于JOIN条件不正确或表别名的问题。因此,在创建表时,必须确保所有关键字和结构正确,比如表名、字段类型、约束等。 接下来,用户需要设置字段注释。在Oracle中,注释是通过COMMENT ON语句添加的,我需要确认每个字段的注释是否正确附加,并且语法无误。同时,用户可能需要确认是否有权限执行这些注释操作,尤其是在生产环境中。 然后,用户提到可能需要检查和修正配置或语法问题。结合之前的引用,用户在使用Druid时遇到了配置问题,比如过滤器声明和监控路径的变化,但这次的问题是关于SQL表创建的,所以重点应放在SQL语句本身。需要检查是否有保留字冲突,比如使用“COMMENT”作为字段名,或者数据类型是否正确,比如VARCHAR2的长度是否合适。 另外,用户之前遇到了主键重复的问题(引用3),所以在创建表时需要确保主键约束正确,并且自增策略合适。例如,在Oracle中通常使用序列和触发器来实现自增主键,但用户之前的引用2提到使用JPA的@GeneratedValue策略,这可能涉及到应用层的配置,但此处需要纯SQL实现。 可能还需要考虑表的存储参数,比如表空间设置,尤其是如果用户有特定的存储要求。此外,索引的创建是否必要,尤其是主键是否已自动创建索引,或者是否需要额外索引来优化查询性能。 用户可能没有明确提到的潜在需求包括分区表、外键约束、默认值设置等,但根据问题描述,目前只需创建基本表结构和注释。需要确认所有字段类型和长度是否符合业务需求,例如FILE_PATH的长度是否足够存储路径信息。 最后,需要确保SQL语句在Oracle环境中能够顺利执行,没有语法错误,比如使用正确的关键字和语句结构,避免缺少分号或错误使用保留字。同时,注释部分是否正确使用COMMENT ON语句,每个字段的注释是否准确无误。</think>### BASP_FILEMANAGER_DIRECTORY表创建SQL(Oracle语法) ```sql -- 创建主表结构 CREATE TABLE BASP_FILEMANAGER_DIRECTORY ( DIRECTORY_ID NUMBER(18) PRIMARY KEY, DIRECTORY_NAME VARCHAR2(255) NOT NULL, PARENT_ID NUMBER(18), FILE_PATH VARCHAR2(1000) NOT NULL, CREATOR VARCHAR2(50) NOT NULL, CREATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP, UPDATE_TIME TIMESTAMP, IS_DELETED CHAR(1) DEFAULT '0' CHECK (IS_DELETED IN ('0', '1')), STORAGE_TYPE VARCHAR2(20) DEFAULT 'LOCAL' ); -- 添加字段注释 COMMENT ON TABLE BASP_FILEMANAGER_DIRECTORY IS '文件管理系统目录结构表'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.DIRECTORY_ID IS '目录唯一标识(主键)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.DIRECTORY_NAME IS '目录名称(唯一约束)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.PARENT_ID IS '父目录ID(外键自关联)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.FILE_PATH IS '完整文件路径(加密存储)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.CREATOR IS '创建者账号(关联用户表)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.CREATE_TIME IS '创建时间(自动生成)'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.UPDATE_TIME IS '最后更新时间'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.IS_DELETED IS '删除标记 0-正常 1-已删除'; COMMENT ON COLUMN BASP_FILEMANAGER_DIRECTORY.STORAGE_TYPE IS '存储类型 LOCAL/OSS/Ceph'; -- 创建索引与约束 CREATE UNIQUE INDEX IDX_DIR_NAME ON BASP_FILEMANAGER_DIRECTORY(DIRECTORY_NAME); ALTER TABLE BASP_FILEMANAGER_DIRECTORY ADD CONSTRAINT FK_PARENT_DIR FOREIGN KEY (PARENT_ID) REFERENCES BASP_FILEMANAGER_DIRECTORY(DIRECTORY_ID); ``` ### 关键配置检查清单 1. **主键生成策略** 建议使用序列生成主键(需显式创建): ```sql CREATE SEQUENCE SEQ_DIRECTORY_ID START WITH 1000 INCREMENT BY 1 NOCACHE; ``` 插入时调用: ```sql INSERT INTO BASP_FILEMANAGER_DIRECTORY(DIRECTORY_ID,...) VALUES(SEQ_DIRECTORY_ID.NEXTVAL,...) ``` 2. **常见错误预防** - **ORA-02291违反完整性约束**:外键PARENT_ID必须引用已存在的DIRECTORY_ID[^3] - **ORA-00904无效标识符**:字段名使用保留字时需加双引号(如改用DIR_NAME代替DIRECTORY_NAME) - **ORA-02290检查约束违规**:IS_DELETED字段只能存'0'或'1' 3. **存储参数优化** 建议指定表空间(根据实际环境调整): ```sql CREATE TABLE BASP_FILEMANAGER_DIRECTORY (...) TABLESPACE USERS PCTFREE 10 INITRANS 2 STORAGE(INITIAL 100M NEXT 50M); ``` ### 语法验证方法 1. **EXPLAIN PLAN检查** ```sql EXPLAIN PLAN FOR SELECT * FROM BASP_FILEMANAGER_DIRECTORY WHERE PARENT_ID = 100; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); ``` 2. **PL/SQL块测试** ```sql DECLARE v_test_count NUMBER; BEGIN SELECT COUNT(*) INTO v_test_count FROM USER_TAB_COMMENTS WHERE TABLE_NAME = 'BASP_FILEMANAGER_DIRECTORY'; DBMS_OUTPUT.PUT_LINE('表注释存在性检查: ' || v_test_count); END; ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值