精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲精品久久区二区三区蜜桃臀| 在线看一区二区| 国产91在线播放| 亚洲а∨天堂久久精品2021| 日韩精品麻豆| 亚洲欧美日韩国产中文在线| 国产一区深夜福利| 欧美偷拍第一页| 国产精品zjzjzj在线观看| 性欧美大战久久久久久久久| 久久av一区二区三区亚洲| 欧美黄色一级大片| 久久久久久影院| 精品久久99ma| 99视频在线免费| 中文字幕中文字幕在线十八区| 久久久久久网| 久久韩国免费视频| 西西大胆午夜视频| 欧美视频精品| 午夜久久久影院| 欧美激情专区| 国产精品视频久久久久久| 欧美日韩在线大尺度| 亚洲欧美在线磁力| 亚洲热在线视频| 高潮在线视频| 亚洲欧洲av在线| 91网在线免费观看| 超碰中文字幕在线| 欧美国产综合| 亚洲欧美中文另类| 熟妇高潮一区二区| 肉色欧美久久久久久久免费看| 成人精品视频一区二区三区尤物| 日韩有码片在线观看| 中国免费黄色片| 日本国产亚洲| 欧美日韩免费看| 日日噜噜夜夜狠狠久久丁香五月 | 亚洲综合网站在线观看| 日本一区二区三区免费看| 国产成人麻豆精品午夜在线| 老司机午夜精品视频| 久久最新资源网| av永久免费观看| caoporn成人| 欧美精品 日韩| 中文字幕永久视频| 性欧美又大又长又硬| 夜夜夜精品看看| 一区二区av| av天在线观看| 99re这里只有精品视频首页| 91精品婷婷国产综合久久蝌蚪| 国产精品 欧美激情| 欧美日韩中文一区二区| 精品中文字幕久久久久久| 污污污www精品国产网站| 国产精品免费精品自在线观看 | 国产一区二区在线免费| 黄色av网站免费观看| 国产精品试看| 欧美性在线视频| 日本天堂在线视频| 亚洲无线视频| 久久精品小视频| 午夜影院黄色片| 加勒比久久综合| 亚洲欧美制服第一页| 成年人免费观看视频网站| 日韩在线你懂的| 亚洲精品二三区| 亚洲国产精品自拍视频| 欧美男男freegayvideosroom| 欧美日韩国产综合新一区 | 国产午夜精品一区二区 | 蜜桃精品久久久久久久免费影院 | 天天色棕合合合合合合合| 国产剧情一区在线| 99精彩视频在线观看免费| 精品人妻伦一二三区久久| 国产精品一区二区免费不卡| 91在线高清视频| 亚洲女同志亚洲女同女播放| 99久久99久久精品国产片果冻| 国产精品美女无圣光视频| 一本色道久久综合精品婷婷| 久久99精品网久久| 91在线|亚洲| 天堂在线资源网| 久久久www成人免费毛片麻豆| 91精品视频在线播放| 99热精品在线播放| 成人的网站免费观看| 欧美日韩国产精品一区二区| 国产三级电影在线观看| 国产精品久久久久久亚洲毛片 | 日韩精品免费电影| 性欧美精品中出| 婷婷丁香综合| 高清亚洲成在人网站天堂| 黄网站免费在线| 亚洲精选91| 国产精品久久久久久婷婷天堂| 日本一区二区三区免费视频| 激情视频一区| 国产精品久久久久久久天堂| 国产精品久久久久久久久久久久久久久久久久| 韩国成人精品a∨在线观看| 国产精品成人观看视频免费| 99久久精品免费看国产交换| 91视视频在线观看入口直接观看www| 亚洲自拍在线观看| 深夜福利视频一区| 亚洲色图在线视频| 久无码久无码av无码| 成人美女大片| 日韩视频在线观看一区二区| 日韩精品无码一区二区三区久久久| 日本韩国欧美超级黄在线观看| 欧美成人欧美edvon| 免费看黄色的视频| 欧美日本久久| 国产精品影片在线观看| 狠狠躁夜夜躁av无码中文幕| 国产丝袜美腿一区二区三区| a级免费在线观看| 亚洲精品第一| 亚洲国产精品热久久| 自拍偷拍第9页| 天使萌一区二区三区免费观看| 国产精品一区二区久久久| 十九岁完整版在线观看好看云免费| 久久久精品蜜桃| www国产黄色| 亚洲日本三级| 国产91对白在线播放| 亚洲av少妇一区二区在线观看| 91在线观看一区二区| 欧美视频在线观看视频| 1769国产精品视频| 欧美激情综合色| 亚洲国产精品二区| 亚洲国产你懂的| 日本精品一二三| 亚洲福利电影| 精品久久久三级| 电影一区二区三| 亚洲精品久久久久国产| 91porny在线| 91色综合久久久久婷婷| 无码aⅴ精品一区二区三区浪潮| 香蕉视频亚洲一级| 色婷婷综合久久| 日韩黄色中文字幕| 精品一区二区免费在线观看| 久久免费视频2| 蜜桃精品一区二区三区| 欧美多人乱p欧美4p久久| 亚洲男女视频在线观看| 婷婷开心久久网| 51妺嘿嘿午夜福利| 蜜桃精品在线观看| 欧洲金发美女大战黑人| 国产精品1luya在线播放| 欧美专区在线观看| 18视频免费网址在线观看| 69精品人人人人| 精品少妇爆乳无码av无码专区| 麻豆精品久久久| 99视频精品全部免费看| 日本中文字幕在线一区| 2018日韩中文字幕| 在线日本视频| 亚洲国产精品悠悠久久琪琪| 国产无套丰满白嫩对白| 国产精品亲子伦对白| 女女调教被c哭捆绑喷水百合| 99久久www免费| www日韩av| 天堂资源在线| 久久久国产精彩视频美女艺术照福利| 亚洲欧美一二三区| 国产精品久久久久国产精品日日| 国产v亚洲v天堂无码久久久| 99久久精品网| 国产原创精品| 91成人短视频在线观看| 97视频免费在线观看| 韩日视频在线| 欧美大胆人体bbbb| 午夜一级黄色片| 亚洲国产一区二区三区| 国产三级短视频| 成人动漫精品一区二区| 午夜两性免费视频| 伊人精品在线| 综合色婷婷一区二区亚洲欧美国产| 九色成人搞黄网站| 性色av一区二区三区在线观看| 成人毛片在线精品国产| 在线观看成人小视频| www.av视频在线观看| 国产精品剧情在线亚洲| 北京富婆泄欲对白| 国产综合久久久久久久久久久久| 自拍偷拍亚洲色图欧美| 亚洲福利天堂| 国产91aaa| 亚洲精品成a人ⅴ香蕉片| 国产mv久久久| 操人在线观看| 欧美成人午夜激情| 99免在线观看免费视频高清| 精品偷拍各种wc美女嘘嘘| 精品人妻一区二区三区蜜桃 | 久久综合色综合| 国产精品―色哟哟| b站大片免费直播| aaa亚洲精品| 国产精久久久久| 国产麻豆成人传媒免费观看| 色播五月综合网| 青青草视频一区| 黄色av免费在线播放| 香蕉久久夜色精品国产| 黄色成人在线看| 国产精品啊v在线| 男女爱爱视频网站| 香蕉国产精品| 亚洲一区二区精品在线观看| 亚洲激情播播| 欧美久久在线| 九一精品国产| 免费看成人片| 国产精品一区2区3区| 国产伦精品一区二区三区视频黑人| 亚洲精品**中文毛片| 97国产成人精品视频| 国产社区精品视频| 久久久久五月天| 黑人另类精品××××性爽| 久久久国产影院| 日本视频在线观看| www.亚洲天堂| 国产激情在线| 久久99精品久久久久久青青91 | 北岛玲一区二区三区四区| 最新国产精品自拍| 成人美女在线视频| 亚洲国产精品无码久久久久高潮| 日韩av在线免费观看不卡| 欧美日韩大尺度| 日韩黄色一级片| www欧美激情| 韩国成人福利片在线播放| xxxx国产视频| 99久久精品99国产精品| av在线网站观看| 国产精品入口麻豆原神| 天天操夜夜操av| 一区二区三区视频在线观看| 国产在线视频99| 欧美日韩中文字幕| 一区二区小视频| 日韩一区二区三区高清免费看看| 精品乱码一区内射人妻无码| 欧美久久久久久蜜桃| 国产精品羞羞答答在线| 亚洲国产精品yw在线观看| 日韩一级中文字幕| 在线观看日韩专区| 羞羞网站在线免费观看| 4444欧美成人kkkk| 欧美亚洲人成在线| 国产精品乱子乱xxxx| 精品av一区二区| 欧美 国产 精品| 亚洲免费中文| 天堂网成人在线| 92精品国产成人观看免费| 自拍偷拍你懂的| 亚洲国产日韩av| 在线观看视频二区| 亚洲成色777777在线观看影院| av免费在线不卡| 亚洲精品一区av在线播放| 麻豆网在线观看| 午夜精品久久久久久久白皮肤| 天堂av在线电影| 国产精品扒开腿做爽爽爽男男| av有码在线观看| 国产欧美日韩中文| 欧美电影在线观看免费| 亚洲va韩国va欧美va精四季| 激情久久久久久久| 午夜剧场高清版免费观看| 99精品欧美一区二区蜜桃免费 | 国产一区二区三区91| 色哺乳xxxxhd奶水米仓惠香| 老鸭窝毛片一区二区三区| 中文字幕一区二区在线观看视频 | 久久精品一区| www.久久com| 国产午夜久久久久| 日本在线视频免费观看| 欧美一区中文字幕| av在线电影网| 欧美最猛性xxxx| 国产精品视频一区视频二区 | 日韩av大片| 五十路熟女丰满大屁股 | 国产又大又黄又粗又爽| av不卡一区二区三区| 日韩a级片在线观看| 欧美色中文字幕| 男女av在线| 欧美激情精品久久久久久大尺度 | 国产高清视频在线观看| 欧美极品少妇全裸体| 四虎永久精品在线| 五月天国产一区| 日韩精品福利网| 亚洲av无码国产精品麻豆天美| 国产精品久线观看视频| 无码人妻精品一区二区| 亚洲高清av在线| 99re6在线精品视频免费播放| 国产成人av在线| 日韩一级电影| 亚洲欧洲日产国码无码久久99| 日韩精品久久久久久| 中文字幕日韩三级片| 亚洲香蕉伊在人在线观| 精品人妻av一区二区三区| 久久在线免费观看视频| 日韩精品一级毛片在线播放| 午夜视频久久久| 麻豆中文一区二区| 人妻无码一区二区三区免费| 欧美性三三影院| wwwxxx在线观看| 国产欧美日韩最新| 国产韩国精品一区二区三区| 欧美精品久久久久久久久25p| 从欧美一区二区三区| 久久精品视频6| 日韩av网址在线| 欧美韩国亚洲| 亚洲精品视频一区二区三区| 日av在线不卡| 国产精品国产三级国产传播| 69堂亚洲精品首页| 天堂8中文在线| 激情小说综合区| 三级影片在线观看欧美日韩一区二区| 久久黄色一级视频| 五月天网站亚洲| 国产在线观看免费| 国产欧美一区二区三区久久| 亚洲色图国产| 中国极品少妇xxxx| 一本久道久久综合中文字幕| av在线中文| 91av一区二区三区| 亚洲精选成人| 大胸美女被爆操| 日韩精品一区在线| 蜜臀国产一区| 正在播放久久| va亚洲va日韩不卡在线观看| 成人午夜淫片100集| 丝袜一区二区三区| 国产调教精品| 国产精品久久久毛片| 一区二区三区久久| 天堂中文在线看| 国产精品午夜一区二区欲梦| 欧美在线资源| 精品人妻一区二区三区日产乱码卜| 亚洲愉拍自拍另类高清精品| 欧美人体大胆444www| 国产一区二区视频在线观看| 国产综合精品一区| 神马久久久久久久久久久| 日韩一区二区中文字幕| 色黄视频在线观看| 亚洲精品免费在线看| zzijzzij亚洲日本少妇熟睡| 香蕉污视频在线观看| 久久97精品久久久久久久不卡| 国产欧美日韩电影| 美女av免费在线观看| 亚洲美女淫视频| 黄视频在线观看免费| av一区二区三区免费| 麻豆久久一区二区| 亚洲另类欧美日韩| 欧美日产国产成人免费图片|