精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Oracle 查詢如何做到 “四大皆空“

數據庫 Oracle
在 11G 版本中,當添加帶有默認值且非空約束的列時,不直接更新當前表的所有記錄的該列默認值,而是將數據存儲到數據字典中的 sys.col$ 表中,后續執行 DML 操作時會自動更新該列默認值。

問題與分析

首先,我們看一張圖,我稱之為 “四大皆空”,此圖來源于 劉晨 的視頻分享 《Oracle中新增字段的點點滴滴》,很有意思,從圖中可以發現兩段 SQL,看看一下這張圖有什么奇怪的地方!

SQL 分析

第一段 SQL:

SQL> select * from test where c1 is null;
no rows selected

SQL> select * from test where c1 is not null;
ID NAME C1
------ ------- ---
1 a
  • 有一張 test 表有個 c1 字段;
  • 當查詢 c1 字段值為空時,沒有記錄返回,得出結論:test 表中不存在 c1 字段值為空的數據;
  • 當查詢 c1 字段值不為空時,有一條記錄返回,且 c1 字段是空值,得出結論:test 表中存在 c1 字段值不能空,但是 c1 字段值返回是空值?

看完第一段 SQL,是不是已經產生疑惑 ? 先不急,接著看第二段 SQL!

第二段 SQL:

SQL> select dump(c1) as d from test;
D
-------
NULL

SQL> select nvl(c1,'is null') as c1 from test;
C1
-------
IS NULL
  • 同一張 test 表的相同字段 c1;
  • 當使用 DUMP 函數 來判斷 c1 的值,返回值為空,根據官方文檔描述:If expr is null, then this function returns NULL,可以得出結論:c1 字段值為空。
  • 當使用 NVL 函數 來判斷 c1 的值,返回值為 IS NULL,根據官方文檔描述:If expr1 is null, then NVL returns expr2. If expr1 is not null, then NVL returns expr1 ,得出結論:c1 字段值為空。

看完第二段 SQL,得出統一的結論就是:c1 字段值為空。

根據上面兩段 SQL 的結論,也就有了上圖中的 where PK dump/nvl? 的疑問,那么到底是什么導致的這個問題呢?

猜測與實踐

首先,這明顯不是一個正常的操作能夠導致的問題,所以首先排除插入空值到非空字段的情況,需要從其他的思路的進行探討。

通過 dbms_metadata.get_ddl 函數獲取 test 表結構的定義:

select dbms_metadata.get_ddl('TABLE', 'TEST') from dual;
DBMS_METADATA.GET_DDL('TABLE','TEST')
--------------------------------------------------------------------------------
CREATE TABLE "TEST"."TEST"
( "ID" NUMBER,
"NAME" VARCHAR2(8) DEFAULT 'a',
"C1" VARCHAR2(8) DEFAULT '' NOT NULL ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"

小知識拓展:

  • Oracle 數據庫中,對于 char 和 varchar2 字段來說,缺省值 '' 就是 null;
  • 但是 where 條件后的 '' 不等于 null。

可以發現,c1 字段是非空字段,且默認值為空。 為什么 Oracle 會允許空值插入到非空約束字段中?

想要搞明白原因,光靠猜測是沒有用的,實踐是檢驗真理的唯一標準。

猜測一

有沒有可能是,插入記錄時有非空約束的列默認為空導致:

SQL> insert into TEST (id, name) values (1, 'a');
insert into TEST (id, name) values (1, 'a')
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("TEST"."TEST"."C1")

可以看到插入報錯了,說明這個思路是錯的,此路不通。

猜測二

按理來說,Oracle 這么多版本的更新迭代之后,應該不會在 11G 版本還出現這種問題,綜上所述,猜測可能是 11G 的新特性導致的 BUG。

查詢官方文檔中的 11G 新特性 Enhanced ADD COLUMN Functionality 可以發現:

在 11G 版本中,當添加帶有默認值且非空約束的列時,不直接更新當前表的所有記錄的該列默認值,而是將數據存儲到數據字典中的 sys.col$ 表中,后續執行 DML 操作時會自動更新該列默認值。

接下來就是用新特性來測試一下,首先創建 TEST 表,不包含 C1 字段:

CREATE TABLE TEST (ID NUMBER, NAME VARCHAR2(8) DEFAULT 'a');  

手動添加 c1 列(非空約束+默認值為空):

alter table TEST add c1 varchar2(8) default '' not null;

再次查詢:

SQL> select * from test where c1 is not null;
ID NAME C1
------ ------- ---
1 a

破案了,函數是對的,c1 字段值在默認的情況下確實為空,NOT NULL 列的默認值為 NULL,如果不指定默認值那么就相當于默認值為 NULL。

深入與研究

上面通過猜測和實踐得出了問題的原因,但還是有些不明所以:

  • where PK dump/nvl?函數的結果是對的,where 真的錯了嗎?
  • 為什么要引入 Enhanced ADD COLUMN Functionality 新特性?
  • .......

Where 錯了嗎?

通過 ”四大皆空“ 圖看起來,使用 Where 條件返回了錯誤的數據,CBO 那么聰明,執行計劃判斷不出來?

第一個 SQL:

SQL> select * from test where c1 is null;
no rows selected

分析:當查詢條件 c1 為空時,CBO 給出一個謂詞 filter 過濾條件 NULL IS NOT NULL,這意味著查詢條件恒假,當一個查詢條件恒假的時候,Oracle 不需要真正執行語句,所以看到 Cost(%CPU) 為 0,所以當一個查詢條件明顯的違反表中的約束條件時,Oracle 并不會去執行這個查詢語句,而是直接返回了 0 條記錄。

第二個 SQL 的執行計劃:

SQL> select * from test where c1 is not null;
ID NAME C1
------ ------- ---
1 a

分析:當查詢條件為 c1 不為空時,執行計劃中并沒有 filter 謂詞條件,為什么呢?因為 c1 字段是非空約束,所以 CBO 判讀 c1 is not null 這個查詢條件是恒真的,也就不需要過濾,直接返回所有的數據。

結論: 簡單的說,導致這個問題的原因是由于錯誤的數據存儲于表中,而這導致了 CBO 在判斷時出現了錯誤,導致和預期相反的結果返回,所以 where 并沒有錯誤,是新特性的 BUG 導致 CBO 的判斷錯誤。

新特性詳解

Oracle 為什么要引入這個新特性?我們使用 3 種情況的分析一下!

  • 在 Oracle 11G 之前,向現有表添加一個新列需要修改該表中的所有行,以添加新列。
  • Oracle 11G 引入了元數據唯一默認值的概念。將默認子句添加到現有表的非空列,只涉及元數據更改,而不是對表中的所有行進行更改。優化器重寫新列的查詢,以確保結果與默認定義一致。
  • Oracle 12C 則更進一步,允許元數據默認值的強制和可選列。因此,在現有表中添加帶有默認子句的新列將被作為一個元數據來處理,而不管該列是否被定義為不為空。這代表了空間保存和性能改進。

實踐演示

準備測試數據:

create table test(id number,name varchar2(1));
insert into test values(1,a);
insert into test values(2,b);
commit;
select * from test;

通過 dump 操作來查看數據的實時情況:

select dbms_rowid.rowid_relative_fno(rowid), dbms_rowid.rowid_block_number(rowid) from test;
alter system dump datafile 4 block 173109;

第一種情況:增加一個字段,不帶默認值,不帶非空約束

alter table test add a1 varchar2(1);
desc test

當為表增加一個不帶默認值,不帶非空約束的字段時,已存記錄的數據塊中不會立刻存儲該新增字段:

只有當更新字段或插入數據的時候,數據塊中才會實際存儲:

更新操作:

插入操作:

第二種情況:增加一個字段,帶默認值,不帶非空約束

注意:針對這種情況,12C 引入了新特性:MetaData-Only DEFAULT Column Values for NULL Columns

alter table test add a2 varchar2(1) default 'a';
desc test

Oracle 11g,新增一個帶默認值,不帶非空約束的字段,會立刻在表的數據塊中增加該字段:

并執行全表更新的操作,將該值更新為默認值,DDL操作的執行時間和表的數據量相關:

第三種情況:增加一個字段,帶默認值,帶非空約束

注意:針對這種情況,11G 引入了新特性:Enhanced ADD COLUMN Functionality!

alter table test add a2 varchar2(1) default 'a' not null;
desc test

Oracle 11g,新增一個帶默認值,帶非空約束的字段,已存記錄的數據塊中不會立刻存儲該新增字段:

而是將其作為元數據存儲在數據字典中的 sys.col$ 中:

同時在 sys.ecol$ 中可以看到:

但是,當改變新增列的默認值時,sys.ecol$ 的數據不會實時變化,僅存儲第一次增加列時的默認值:

只有當更新字段或插入數據的時候,數據塊才會實際存儲:

通過這種優化,縮短了DDL執行時間,這就是 Oracle 11G 引入 Enhanced ADD COLUMN Functionality 新特性的原因。

最后

值得一提的是,Oracle 在 12C 以后已經修復了這個 BUG,增加了如下判斷(DEFAULT 為 NULL 是禁止的):

Oracle 學習路漫漫,茫茫文檔需要看,直覺前路要變寬,到頭還被 BUG 絆!

本文參考資料:

  • 《非空字段空值對查詢的影響》http://yangtingkun.net/?p=1481 -- 楊廷琨
  • 《非空字段空值的產生》http://yangtingkun.net/?p=1483 -- 楊廷琨
  • 《Oracle中新增字段的點點滴滴》https://www.modb.pro/video/5098 -- 劉晨
責任編輯:武曉燕 來源: Lucifer三思而后行
相關推薦

2009-11-20 11:37:11

Oracle完全卸載

2018-12-17 09:02:25

百億大表維度查詢

2011-11-09 15:49:52

API

2009-11-11 09:40:53

Oracle索引掃描

2010-11-15 15:20:13

Oracle索引掃描

2015-07-17 09:50:16

Carthage優劣比較

2011-03-21 09:01:49

CSS框架

2019-08-08 10:18:15

運維架構技術

2016-01-08 10:03:07

硅谷通吃互聯網

2022-09-09 08:41:43

Netty服務端驅動

2010-03-30 10:44:05

Nginx啟動

2024-12-04 13:52:30

2021-05-24 10:55:05

Netty單機并發

2020-03-06 18:18:22

數據庫MySQL應用程序

2018-05-06 09:00:49

MES 智能制造

2020-08-17 08:21:31

數據查詢項目

2019-09-17 09:23:41

數據查詢Moneta

2013-01-06 10:44:43

微軟Windows 8云計算

2010-07-21 10:01:25

Oracle

2016-03-30 11:51:55

點贊
收藏

51CTO技術棧公眾號

成人无遮挡免费网站视频在线观看| 日韩乱码人妻无码中文字幕| 欧美一级做a| 亚洲综合久久久| 欧美系列一区| av免费观看在线| 亚洲欧美日韩国产综合精品二区| 中文字幕在线日韩| 亚洲麻豆一区二区三区| 97欧美成人| 亚洲国产人成综合网站| 天堂√在线观看一区二区| 超碰福利在线观看| 日本va欧美va精品发布| 欧美精品videosex牲欧美| 日韩丰满少妇无码内射| 国产精品一区二区中文字幕| 欧美精品亚洲二区| 久久精品香蕉视频| 丁香花在线电影小说观看| 日本一区二区三区在线不卡| 成人蜜桃视频| 国产一区二区三区成人| 久久一区亚洲| 亚州av一区二区| 麻豆91精品91久久久| 久久高清精品| 一色桃子一区二区| 精品人妻一区二区免费视频| 国产中文欧美日韩在线| 在线视频欧美精品| 337p粉嫩大胆噜噜噜鲁| 高h视频在线播放| 日韩一区中文字幕| 色综合666| 国产51人人成人人人人爽色哟哟| 99视频精品全部免费在线| 91久久精品一区二区别| 国产理论视频在线观看| 老司机精品视频在线| 国产精品久久久久久久美男| 国产精品人人人人| 在线视频精品| 欧美一二三视频| 亚洲高清毛片一区二区| 一区二区激情| 日本成人在线视频网址| 日韩三级一区二区三区| 亚洲激情成人| 91精品国产高清自在线看超| 精品成人免费视频| 亚洲欧美日韩一区在线观看| 1769国产精品| 亚洲欧美一区二区三区在线观看| 在线一区欧美| 国产成人高潮免费观看精品| 亚洲精品一区二区二区| 奇米777欧美一区二区| 国产精品色视频| 在线黄色av网站| 经典一区二区三区| 96pao国产成视频永久免费| a在线观看视频| 粉嫩蜜臀av国产精品网站| 成人免费视频观看视频| 污视频在线免费| 国产日韩欧美在线一区| 亚洲精品高清国产一线久久| 日本成人网址| 一区二区三区欧美| 熟女少妇在线视频播放| 日本高清不卡一区二区三区视频 | 国产欧美123| av白虎一区| 色综合天天天天做夜夜夜夜做| 国产精品无码专区av在线播放 | 伊人激情综合| 欧美在线视频免费| 久久久久久av无码免费看大片| 黄色小说综合网站| 国产精品亚洲综合| 国产精品免费播放| 亚洲精品中文字幕在线观看| 一本久道高清无码视频| 国产成人免费9x9x人网站视频| 欧美日本国产一区| 性色av蜜臀av浪潮av老女人| 亚洲瘦老头同性70tv| 久久亚洲电影天堂| 日韩美女视频网站| 美女精品自拍一二三四| 444亚洲人体| 毛片免费在线播放| 一区二区三区四区不卡视频| 91免费视频网站在线观看| 成人av在线播放| 亚洲日本中文字幕| 欧美 日韩 国产 一区二区三区| 亚洲精品综合| 91精品综合视频| 亚洲av成人精品一区二区三区在线播放 | 欧美日韩另类国产亚洲欧美一级| 又黄又色的网站| 日韩成人综合| 欧美诱惑福利视频| aaa级黄色片| 中文字幕国产一区| 黄色国产一级视频| 日韩成人在线观看视频| 夜夜嗨av色一区二区不卡| 国产无遮挡免费视频| 久久er精品视频| 日本一区视频在线观看免费| 色婷婷在线播放| 欧美日韩精品福利| 亚洲码无人客一区二区三区| 激情久久一区| 亚洲xxx视频| 日本中文字幕在线观看| 色就色 综合激情| 人妻无码中文久久久久专区| 亚洲精品a级片| 91精品免费看| 91在线免费看| 在线视频国内一区二区| 女同毛片一区二区三区| 激情欧美日韩| 91黄在线观看| 成人在线网址| 欧美精品三级日韩久久| 中文字幕黄色网址| 久久婷婷影院| 欧美日韩精品免费观看| 国内精彩免费自拍视频在线观看网址 | 欧美精品一区二区三区国产精品| 96日本xxxxxⅹxxx17| 欧美激情在线一区二区| 欧美视频第三页| 一区二区导航| 欧美中文在线观看| 欧美日韩影视| 色婷婷激情久久| 欧美 日韩 国产 成人 在线观看 | 亚洲一级不卡视频| 三上悠亚 电影| 欧美日韩午夜| 成人免费看片网站| av影视在线| 亚洲国产成人精品电影| 日本在线小视频| aaa国产一区| 播放灌醉水嫩大学生国内精品| 久久精品凹凸全集| 欧洲精品久久久| 欧美伦理影视网| 欧美日韩综合色| 小早川怜子一区二区的演员表| 激情图片小说一区| 一本色道久久88亚洲精品综合| 国产精品毛片无码| 欧美激情一区二区三区在线视频观看 | av在线中出| 日韩麻豆第一页| 久草视频在线免费| 中文字幕一区在线| 激情av中文字幕| 麻豆91精品| 天堂精品视频| 亚洲经典视频| 欧美在线视频免费观看| 91caoporn在线| 日韩视频免费直播| 日本一级片免费看| 中文字幕精品在线不卡| 欧美一级xxxx| 亚洲国产黄色| 亚洲精品白虎| 成人香蕉社区| 国产精品一区二区电影| 天堂av最新在线| 亚洲一区二区国产| 国产ts变态重口人妖hd| 偷拍日韩校园综合在线| 久久久久久久久福利| 懂色一区二区三区免费观看| 日韩精品视频久久| 91精品亚洲| 美女视频久久| 麻豆精品久久| 日本中文字幕不卡免费| 成人在线免费看黄| 亚洲色图第一页| 性欧美videos另类hd| 一本一道久久a久久精品| 538精品在线视频| 久久精子c满五个校花| 性鲍视频在线观看| 久久久噜噜噜久久狠狠50岁| 久久久久久久久影视| 九九亚洲视频| 国产精品毛片va一区二区三区| 少妇一区视频| 97高清免费视频| 黄色一级片在线观看| 精品中文视频在线| 亚洲大尺度网站| 欧美色图片你懂的| 五月婷婷中文字幕| 亚洲三级小视频| 国产av自拍一区| 99精品在线免费| 在线成人免费av| 理论片日本一区| 久久精品午夜福利| 国产日韩欧美| 国产www免费| 欧美一区精品| 制服诱惑一区| 欧美日韩高清| 免费99视频| 欧美精品国产白浆久久久久| 91网站免费观看| 亚洲国产91视频| 国产精品久久久久不卡| 欧美日韩免费看片| 2019中文字幕全在线观看| 国产一线二线在线观看| 欧美成人剧情片在线观看| 在线中文资源天堂| 色诱女教师一区二区三区| 精品av中文字幕在线毛片| 亚洲国产中文字幕久久网| 丰满人妻一区二区三区四区53| 在线电影院国产精品| 在线观看国产成人| 欧美丝袜丝交足nylons图片| 国产男人搡女人免费视频| 色婷婷av一区二区三区gif| 亚洲免费在线视频观看| 精品久久在线播放| 人妻 日韩精品 中文字幕| 欧美日韩国产专区| 五月天婷婷激情| 色呦呦国产精品| 亚洲中文字幕无码爆乳av | 成年网站在线免费观看| 午夜在线视频一区二区区别| 青青视频在线播放| 日韩高清一级片| 污网站免费在线| 久久国产剧场电影| 中文字幕一区二区在线观看视频| 精品午夜久久福利影院 | 欧美.com| 国产乱码精品一区二区三区中文| 欧美色图五月天| 欧美日韩在线高清| 精品美女久久| 国产欧美综合一区| 亚洲性图久久| 黄色动漫网站入口| 人人狠狠综合久久亚洲| 亚洲天堂国产视频| 国产激情视频一区二区在线观看| 亚洲av无一区二区三区久久| 成人午夜激情影院| 亚洲欧美色图视频| 日本一区二区三区在线观看| 久久久久久视频| 亚洲午夜成aⅴ人片| 欧美福利视频一区二区| 欧美三级韩国三级日本三斤| 国产99对白在线播放| 亚洲精品成人久久| www日韩tube| 欧美成人网在线| 精品人人视频| 国产精品三级网站| 超碰成人97| 偷拍视频一区二区| 欧美特黄一区| 天天影视综合色| 国产很黄免费观看久久| 欧美 日本 国产| 一色屋精品亚洲香蕉网站| 日韩av无码中文字幕| 欧洲精品一区二区三区在线观看| 国产又粗又黄视频| 日韩精品免费在线播放| 免费在线看a| 97视频网站入口| 亚洲一区有码| 久久久久资源| 欧美在线观看天堂一区二区三区| av天堂永久资源网| 国产高清精品网站| 国产精品国产三级国产专业不| 亚洲一区二区精品3399| 国产精品51麻豆cm传媒| 亚洲精品av在线| 91在线中字| 国产免费一区二区三区在线能观看| 国产精品22p| 黄色小视频大全| 日本在线观看不卡视频| 亚洲一区二区三区四区av| 中文字幕一区二区三区不卡在线 | 欧洲美熟女乱又伦| 亚洲电影一级黄| 国产片高清在线观看| 国产一区二区三区直播精品电影| 国产区美女在线| 亚洲mm色国产网站| 日韩电影二区| 国产一区亚洲二区三区| www.在线成人| 国产亚洲欧美久久久久| 91精品国产综合久久小美女| 黄色av网站在线免费观看| 91精品成人久久| 成人涩涩网站| 国产精品videossex国产高清| 麻豆精品国产传媒mv男同| 高潮毛片无遮挡| 欧美视频裸体精品| 色婷婷综合视频| 欧美黑人巨大精品一区二区| 国产亚洲高清在线观看| 免费成人深夜夜行网站视频| 日本v片在线高清不卡在线观看| 扒开jk护士狂揉免费| 福利二区91精品bt7086| 午夜视频福利在线观看| 韩国一区二区电影| 老汉色老汉首页av亚洲| 波多野结衣av一区二区全免费观看| 国产资源精品在线观看| 国产高潮流白浆| 欧美一区二区三区在线看| 国产区在线看| 亚洲字幕一区二区| 欧美三级午夜理伦三级中文幕| 极品人妻一区二区| 一区二区三区成人在线视频| 亚洲h视频在线观看| 色综合久综合久久综合久鬼88 | 松下纱荣子在线观看| 久久精品国产美女| 久久视频一区| 男女男精品视频网站| 777欧美精品| 在线中文字幕电影| 国产精品一区二区三区不卡| 伊人久久亚洲美女图片| a视频免费观看| 色素色在线综合| 色综合久久影院| 91视频99| 国产日韩欧美三级| 四虎成人免费影院| 91精品国产一区二区人妖| 污片在线免费观看| 久久手机视频| 免费成人av在线| 免费中文字幕在线| 日韩精品亚洲视频| 国产成人午夜性a一级毛片| 国产对白在线播放| 99在线视频精品| 一区二区小视频| 精品中文字幕在线观看| 日韩av中文字幕一区| 中文久久久久久| 亚洲另类在线制服丝袜| 日韩中文字幕免费观看| 日韩av毛片网| 亚洲精彩视频| 亚洲乱码国产乱码精品精大量| 欧美日韩一区成人| 人妖欧美1区| 欧美日韩免费精品| 国产精品香蕉一区二区三区| 波多野结衣国产| 日韩在线观看免费高清完整版| 91亚洲无吗| 婷婷免费在线观看| 午夜婷婷国产麻豆精品| 婷婷五月在线视频| 久久福利电影| 国产精品资源在线看| 波多野结衣人妻| 国内精品久久久久影院 日本资源| 国产一卡不卡| yjizz视频| 欧美精品少妇一区二区三区| 特黄毛片在线观看| 少妇一晚三次一区二区三区| 中文字幕免费在线观看视频一区| 日韩中文字幕免费在线观看| 国产在线观看91精品一区|