SQL優化 NULL值與索引的使用

2021-09-01 19:20:56 字數 912 閱讀 7331

null是資料庫中特有的資料型別,當一條記錄的某個列為null,則表示這個列的值是未知的、是不確定的。簡單的說,由於null存在著無數的可能,因此兩個null不是相等的關係,同樣也不能說兩個null就不相等,或者比較兩個null的大小,這些操作都沒有意義,得不到乙個確切的答案。

那麼,乙個欄位有可能存在空值是否適合建立索引呢?

大多數人都聽說過這樣一句話,索引不儲存null值。這句話其實比不嚴謹。如果採用比較嚴謹的方式來說:b樹索引不儲存索引列全為空的記錄。如果把這句話用在單列索引上,就是前面提到的b樹索引不儲存null。

首先索引分為btree和bitmap兩種,對於btree索引,是不儲存null值的,而bitmap索引,則儲存null值。其次,從索引列的個數來劃分,索引分為單列索引和復合索引,對於單列索引來說很簡單,如果一條記錄中這個索引欄位為空,那麼索引不會儲存這條記錄的資訊。但是對於復合索引,由於存在著多個列,如果某乙個索引列不為空,那麼索引就會包括這條記錄,即使其他所有的所有列都是null值。

究竟日常應用中對可能為空的列如何建立索引,oracle又如何使用這些索引呢?經過測試,簡單總結為以下兩點:

i:對於經常單列訪問字段中非空值的情況,直接建立單列索引。

ii:對於經常查詢欄位is null又希望使用索引的情況,則需要結合查詢條件選擇合適的非空字段建立組合索引。

同時,在日常應用中請注意:

i: 如果要查詢乙個表的記錄數,可以通過全表掃瞄的方法,也可以通過count非空列記錄數的方法,如果此時非空列上存在索引,就可以直接訪問索引獲得資料。

ii: 要查詢乙個可能為空字段的非空記錄數,如果該列上建立了單列索引,直接訪問索引可以獲得資料,但若想通過索引獲得該列所有的記錄數(即全表資料量),即使你固定執行了計畫,強制走該列的索引,oracle也會自動選擇全表掃瞄。這應該也是我們倡導不可能為空的字段一定要新增非空約束的原因之一吧。

NULL 值與索引 二

在null值與索引 一 中講述了null值與索引的一些基本情況。其主要的內容為,基於允許存在null值的索引列,其索引值不會被儲存 其次 是由於這個特性導致了我們在使用is null時索引失效的情形 最後則是描述的通過為null值列新增not null約束來使得is null走索引。儘管我 們可以通...

SQL替換NULL值的顯示

在資料查詢中,有些欄位的值為null,但是我們一般不會直接把null顯示給使用者,所以需要用其他方式替換一下,比如 no value 例如有下面兩個表 t teacher id name 1 teacher1 2 teacher2 3 teacher3 4 teacher4t course id n...

SQL高階之三值邏輯與NULL

普通語言裡的布林型只有 true 和 false 兩個值,即二值邏輯 sql中有 true false 和 unknown,即三值邏輯 關係模型並不是描述現實世界的模型,而是描述人類認知狀態的核心 知識 的模型,我們有限且不完備的知識也會直接反映在表裡 三值邏輯優先順序 q 為什麼where co ...