首页 > 其他分享 >[20231020]增加字段的问题.txt

[20231020]增加字段的问题.txt

时间:2023-10-23 21:56:18浏览次数:43  
标签:20231020 -- orcl 192.168 字段 1521 txt 2.7 BBBBB

[20231020]增加字段的问题.txt

--//测试生产系统遇到的增加字段的相关问题.非常容易混乱,我还是给自己测试看看,加强记忆.

1.环境:
[email protected]:1521/orcl> @ ver1
[email protected]:1521/orcl> @ pr
==============================
PORT_STRING                   : x86_64/Linux 2.4.xx
VERSION                       : 18.0.0.0.0
BANNER                        : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
BANNER_FULL                   : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
BANNER_LEGACY                 : Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
CON_ID                        : 0
PL/SQL procedure successfully completed.

2.测试准备:

[email protected]:1521/orcl> create table ty as select deptno from dept;
Table created.
[email protected]:1521/orcl> @ gts ty '' '' ''
Gather Table Statistics for table ty...
exec dbms_stats.gather_table_stats('TTT', 'TY', estimate_percent => NULL, method_opt=>'FOR TABLE FOR ALL COLUMNS SIZE REPEAT', cascade=>true, no_invalidate=>false)
if lock table ty, add force=>true.
press ctrl+c cancel, enter continue...
PL/SQL procedure successfully completed.

3.增加字段:

--//操作顺序如下:
alter table ty add (status1 varchar2(10) );
alter table ty modify status1 default 'AAAAA';

alter table ty add (status2 varchar2(10) default 'BBBBB');

alter table ty add (status3 varchar2(10));

[email protected]:1521/orcl> insert into ty (deptno) values (50);
1 row created.

[email protected]:1521/orcl> commit ;
Commit complete.

[email protected]:1521/orcl> select ty.*,SYS_NC00003$ from ty;
DEPTNO STATUS1 STATUS2 STATUS3 SYS_NC0000
------ ------- ------- ------- ----------
    10         BBBBB
    20         BBBBB
    30         BBBBB
    40         BBBBB
    50 AAAAA   BBBBB           01

--//再次增加1个字段,注意写法与上面都不同。
[email protected]:1521/orcl> alter table ty add (status4 varchar2(10)  default 'CCCCC' not null);
Table altered.

[email protected]:1521/orcl> select ty.*,SYS_NC00003$ from ty;
DEPTNO STATUS1 STATUS2 STATUS3 STATUS4 SYS_NC0000
------ ------- ------- ------- ------- ----------
    10         BBBBB           CCCCC
    20         BBBBB           CCCCC
    30         BBBBB           CCCCC
    40         BBBBB           CCCCC
    50 AAAAA   BBBBB           CCCCC   01

[email protected]:1521/orcl> insert into ty (deptno) values (60);
1 row created.

[email protected]:1521/orcl> commit ;
Commit complete.

[email protected]:1521/orcl> select ty.*,SYS_NC00003$ from ty;
DEPTNO STATUS1 STATUS2 STATUS3 STATUS4 SYS_NC0000
------ ------- ------- ------- ------- ----------
    10         BBBBB           CCCCC
    20         BBBBB           CCCCC
    30         BBBBB           CCCCC
    40         BBBBB           CCCCC
    50 AAAAA   BBBBB           CCCCC   01
    60 AAAAA   BBBBB           CCCCC   01
6 rows selected.
        
--//主要目的看看是否修改数据块.

[email protected]:1521/orcl> select rowid from ty;
ROWID
------------------
AABni7AAMAAC8KDAAA
AABni7AAMAAC8KDAAB
AABni7AAMAAC8KDAAC
AABni7AAMAAC8KDAAD
AABni7AAMAAC8KHAAA
AABni7AAMAAC8KHAAB

block_row_dump:
tab 0, row 0, @0x1f7a
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 0b
tab 0, row 1, @0x1f71
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 15
tab 0, row 2, @0x1f68
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 1f
tab 0, row 3, @0x1f5f
tl: 6 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [ 2]  c1 29
end_of_block_dump

block_row_dump:
tab 0, row 0, @0x1f84
tl: 20 fb: --H-FL-- lb: 0x1  cc: 4
col  0: [ 2]  c1 33
col  1: [ 5]  41 41 41 41 41
col  2: [ 1]  01
col  3: [ 5]  42 42 42 42 42
tab 0, row 1, @0x1f69
tl: 27 fb: --H-FL-- lb: 0x2  cc: 6
col  0: [ 2]  c1 3d
col  1: [ 5]  41 41 41 41 41
col  2: [ 1]  01
col  3: [ 5]  42 42 42 42 42
col  4: *NULL*
col  5: [ 5]  43 43 43 43 43
end_of_block_dump
End dump data blocks tsn: 5 file#: 41 minblk 770695 maxblk 770695

--//可以看出这样增加字段 alter table ty add (status4 varchar2(10)  default 'CCCCC' not null);,oracle并不修改数据块.
--//那这样的方式如何处理的呢?

SELECT obj#
        ,col#
        ,segcol#
        ,name
        ,default$
        ,type#
    FROM sys.col$
   WHERE obj# IN (SELECT object_id FROM dba_objects WHERE owner = user AND object_name = 'TY')
ORDER BY segcol#;        

[email protected]:1521/orcl> /
  OBJ# COL# SEGCOL# NAME          DEFAULT$ TYPE#
------ ---- ------- ------------- -------- -----
424123    1       1 DEPTNO                     2
424123    2       2 STATUS1       'AAAAA'      1
424123    0       3 SYS_NC00003$              23
424123    3       4 STATUS2       'BBBBB'      1
424123    4       5 STATUS3                    1
424123    5       6 STATUS4       'CCCCC'      1
6 rows selected.

[email protected]:1521/orcl> select * from sys.ecol$ where tabobj#= 424123 ;
TABOBJ# COLNUM BINARYDEFVAL GUARD_ID
------- ------ ------------ --------
 424123      4 4242424242          0
 424123      6 4343434343

--//status2,status4字段在sys.ecol$都有记录,但是GUARD_ID值不同.

[email protected]:1521/orcl> select * from ty where status1='A' or status2='B' or status3='C' or status4='D' ;
no rows selected

[email protected]:1521/orcl> @ dpc '' '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID  0jqyswgwf35q1, child number 0
-------------------------------------
select * from ty where status1='A' or status2='B' or status3='C' or
status4='D'

Plan hash value: 1260447134
---------------------------------------------------------------------------
| Id  | Operation         | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time   |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |        |       |     4 (100)|          |
|*  1 |  TABLE ACCESS FULL| TY   |      2 |    38 |     4   (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
   1 - SEL$1 / TY@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter((DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00003$",0)),NULL,NVL(
              "STATUS2",'BBBBB'),'0',NVL("STATUS2",'BBBBB'),'1',"STATUS2")='B' OR
              NVL("STATUS4",'CCCCC')='D' OR "STATUS1"='A' OR "STATUS3"='C'))

--//注意看加入的过滤条件.
"STATUS1"='A'
(DECODE(TO_CHAR(SYS_OP_VECBIT("SYS_NC00003$",0)),NULL,NVL("STATUS2",'BBBBB'),'0',NVL("STATUS2",'BBBBB'),'1',"STATUS2")='B'
"STATUS3"='C'
NVL("STATUS4",'CCCCC')='D'

--//感觉有时候oracle为了加入新特性,搞的有点复杂.
--//再次提醒,一定要结合sql语句上下文,不要想当然根据NVL("STATUS4",'CCCCC')='D'条件,建立这样的函数索引.

4.继续测试:
[email protected]:1521/orcl> create table tz as select deptno from dept;
Table created.

[email protected]:1521/orcl> @ gts tz '' ''
...

[email protected]:1521/orcl> alter table tz add (z1 varchar2(10)  default '11111' not null);
Table altered.

SELECT obj#
        ,col#
        ,segcol#
        ,name
        ,default$
        ,type#
    FROM sys.col$
   WHERE obj# IN (SELECT object_id FROM dba_objects WHERE owner = user AND object_name = 'TZ')
ORDER BY segcol#;

  OBJ# COL# SEGCOL# NAME   DEFAULT$ TYPE#
------ ---- ------- ------ -------- -----
424128    1       1 DEPTNO              2
424128    2       2 Z1     '11111'      1
--//这样加入并没有引入隐含字段.

[email protected]:1521/orcl> select * from sys.ecol$ where tabobj#= 424128 ;
   TABOBJ#     COLNUM BINARYDEFVAL                     GUARD_ID
---------- ---------- ------------------------------ ----------
    424128          2 3131313131
--//3131313131= 11111

[email protected]:1521/orcl> @ desczz tz 1=1
[email protected]:1521/orcl> @ pr
==============================
DESC_OWNER                    : TTT
DESC_TABLE_NAME               : TZ
SAMPLE_SIZE                   : 4
LAST_ANALYZED                 : 2023-10-20 09:29:31
DESC_COLUMN_ID                :    1
DESC_COLUMN_NAME              : DEPTNO
DESC_NULLABLE                 : NOT NULL
DESC_DATA_TYPE                : NUMBER(2,0)
NUM_DISTINCT                  : 4
DESC_DENSITY                  : .25
NUM_NULLS                     : 0
HISTOGRAM                     :
NUM_BUCKETS                   : 1
TRANS_LOW                     : 10
TRANS_HIGH                    : 40
==============================
DESC_OWNER                    : TTT
DESC_TABLE_NAME               : TZ
SAMPLE_SIZE                   :
LAST_ANALYZED                 :
DESC_COLUMN_ID                :    2
DESC_COLUMN_NAME              : Z1
DESC_NULLABLE                 : NOT NULL
DESC_DATA_TYPE                : VARCHAR2(10)
NUM_DISTINCT                  :
DESC_DENSITY                  :
NUM_NULLS                     :
HISTOGRAM                     :
NUM_BUCKETS                   :
TRANS_LOW                     :
TRANS_HIGH                    :
PL/SQL procedure successfully completed.
--//可以看出我同事应该采用这样的方式增加字段的,这样没有出现隐含字段.

5.总结:
--//写的有点乱,总之在一些运维细节上,一定要严格测试,注意细节.

标签:20231020,--,orcl,192.168,字段,1521,txt,2.7,BBBBB
From: https://www.cnblogs.com/lfree/p/17783569.html

相关文章

  • [20231020]为什么刷新缓存后输出记录顺序发生变化5.txt
    [20231020]为什么刷新缓存后输出记录顺序发生变化5.txt--//前几天做了单表刷新缓存后输出记录顺序发生变化的情况,今天测试2个表的情况。--//我遇到一个奇怪的现象,做一个记录,我无法使用10046跟踪.1.环境:[email protected]:1521/orcl>@[email protected]:1521/orcl>@pr=======......
  • 公共字段自动填充
    在项目开发中我们会遇到公共字段自动填充问题。那么如何进行解决和实现呢/那就是要用到spring第二大核心模块AOP技术。就是自定义切面来进行实现。具体实现为;1).自定义注解AutoFill,用于标识需要进行公共字段自动填充的方法2).自定义切面类AutoFillAspect,统一拦截加入了A......
  • 实体类使用临时字段 myBatis jpa Hibernate
    Mybatis-Plus  使用数据库不存在的字段,可在实体类的属性加上@TableField注解** @TableField(exist=false)**jpaHibernate** @Transient**......
  • POI实现,两个Excel里重复字段去重,之后写到另一个Excel(代码库)
    importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.lang3.StringUtils;importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;importorg.apache.poi.ss.usermodel.*;importorg.jetbrains.annotations.NotNull;import......
  • 【实测有效】.epub文件如何批量转换为word/AZW3/MOBI/DOCX/RTF/TXT/HTMLZ? 附工具下载
    常见电子书格式有很多种,其中有一种.epub格式,这种格式的文件比较多,也比较容易找到,阅读器也有多款软件支持。国内用的相对多点的比如ApabiReader。有时候,.epub文件明明是正常的,但ApabiReader却会报错而无法打开。上篇优爱酷分享了如何将.epub文件转换为可编辑的word,但是手动操作比......
  • SQL AUTO INCREMENT 字段
    参考链接:1.https://www.runoob.com/sql/sql-autoincrement.html2.3.4.https://dba.stackexchange.com/questions/61603/how-to-query-and-increase-a-value-counter-in-a-thread-safe-way-avoid-race-co橘子Jane......
  • 前端接口请求HTTP设置自定义header属性字段大小写问题
    问题:接口请求头传token值的字段为tokenValue,需要用到token的接口一直不能成功请求。后端排查发现没有接收到token,前端虽然传了token值,但是发现浏览器把tokenValue变成了Tokenvalue,导致后端没正确接收到token值。原因是:HTTPRFC里规定,大小写不敏感。HTTP/1.x大小写不敏感,但现实是......
  • 查询查询Oracle数据表中字段的所属表(oracle字段所在表)
    在使用Oracle数据库时,我们经常需要在Oracle中查询某个字段的所属表名。本文将会介绍如何通过两种不同的方法来查询Oracle数据表中字段的所属表。使用Oracle自带的dba_tab_cols视图查询Oracle自带有dba_tab_cols视图,我们可以通过该视图查询Oracle数据库某个字段的所属表。例如,......
  • CmakeList.txt语法
    CmakeList语法PROJECT(hello)#PROJECT(名称,语言):指定工程名称和支持的语言#PROJECT(hello,CCXX):指定了工程名称,支持C和C++SET(SRC_LISTmain.cpp)#SET():用来显示指定变量#SET(SRC_LISTmain.cpptest.cpp)MESSAGE(STATUS"ThisisBINARYdir"${HELLO_BINARY_......
  • 如何使用MyBatis-Plus实现字段的自动填充?一文教会你
    环境说明:Windows10+Idea2021.3.2+Jdk1.8+SpringBoot2.3.1.RELEASE前言在实际的开发过程中,我们经常需要在进行数据库操作时自动填充某些字段值,比如创建时间,更新时间等。手动填充虽然可行,但是容易出错,并且代码冗余,影响开发效率。MyBatis-Plus提供了字段自动填充的功能,可以......