→ swpoker:?可是index會有null就有點奇怪了? 06/20 10:17
→ alan3100:你在問啥? index裡本來就不存null才會走full table scan 06/20 12:01
推 LPH66:那又怎麼會有 where phone is null 的 query... 06/20 13:08
→ LPH66:或者該問為什麼會在被索引的欄位裡放 null 06/20 13:09
→ swpoker:樓上就是我的疑問 06/20 13:14
這就是為何主題問的要避免null值呀
問問題要盡可能描述要表達的意思
你是想問為何要query該欄位是null這種sql的出現?
A:就我知道很多PG不會去避免這類事情,或是根本不知道full table scan
還是你認為可為null的欄位不能建立索引?
A:可以建
還是要問當初規劃為何該欄位要設為可null又被建立index?
A:當你的系統大到沒辦法考慮那麼詳細(或是根本沒考慮),
或是承接舊系統有轉檔舊資料,
或是後續調效時才增加index
※ 編輯: alan3100 來自: 111.250.94.141 (06/20 13:31)
→ swpoker:index會容易濫用~然後異動會導致效能~ 06/20 16:37
→ swpoker:以前遇到某專案會有專人在開發時會監督SQL~避免這種問題 06/20 16:37
→ swpoker:像現在都只能靠拜拜希望自己或有人會注意到 06/20 16:38
→ swpoker:遇到某專案的架構師告誡pk fk index 不能有null 06/20 16:41
→ swpoker:然後還會問說你建這個index要幹碼?!! 06/20 16:41
→ swpoker:阿~當時覺得很討厭~後來才知道這樣才是好阿 06/20 16:42
→ uthily:請問為什麼 where .. null 就會是 full table scan 呀? 06/21 10:49
全為null的值不會健在index內
所以如果判斷is null會變成index無法使用
→ uthily:假如我是資料庫軟體的設記者,既然接受可為null的欄位建索引 06/21 10:50
→ uthily:比如說在建立 hash table 時把 null 視為某個值就好 06/21 10:51
→ uthily:是有什麼我沒考慮到的限制導致不能這樣處理嗎? 06/21 10:52
資料面來講null沒有比較的意義
如果是設計者為何要把null拿來排序比較?
如果真的要拿來比較就給個初始值(就是標題所說的)
就程式面來講那麼多型態,null你要當什麼值?
但大部分的人不會很明確知道這欄位是否該nullable (根本不知道該如何規劃)
或是後來新增需求需要判斷該欄位是否沒有值就會變得很麻煩 (之前規劃沒預定)
可接受null的欄位有2個意義
一種是null本來就不該被排序比較,程式設計本來就要自己排除
另一種是複合欄位index(a,b,c),在a,b,c皆為null時不會建入index內
select a,b,c
from table1
where a='a' and c='c'and b is not null <=像這種就還是可能會使用index
但是如果改成where ... and b is null --就會是full table scan
※ 編輯: alan3100 來自: 114.36.63.148 (06/21 17:55)