Re: [SQL ] 是否避免null值
舉個例
index_phone(phone)
select name,phone
from employee
where phone is null
這時候就掰掰了 會是full table scan
也許這例子不是很好,因為比數不大
如果是巨量的比數就會非常慘
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.250.60.74
→
06/20 10:17, , 1F
06/20 10:17, 1F
→
06/20 12:01, , 2F
06/20 12:01, 2F
推
06/20 13:08, , 3F
06/20 13:08, 3F
→
06/20 13:09, , 4F
06/20 13:09, 4F
→
06/20 13:14, , 5F
06/20 13:14, 5F
這就是為何主題問的要避免null值呀
問問題要盡可能描述要表達的意思
你是想問為何要query該欄位是null這種sql的出現?
A:就我知道很多PG不會去避免這類事情,或是根本不知道full table scan
還是你認為可為null的欄位不能建立索引?
A:可以建
還是要問當初規劃為何該欄位要設為可null又被建立index?
A:當你的系統大到沒辦法考慮那麼詳細(或是根本沒考慮),
或是承接舊系統有轉檔舊資料,
或是後續調效時才增加index
※ 編輯: alan3100 來自: 111.250.94.141 (06/20 13:31)
→
06/20 16:37, , 6F
06/20 16:37, 6F
→
06/20 16:37, , 7F
06/20 16:37, 7F
→
06/20 16:38, , 8F
06/20 16:38, 8F
→
06/20 16:41, , 9F
06/20 16:41, 9F
→
06/20 16:41, , 10F
06/20 16:41, 10F
→
06/20 16:42, , 11F
06/20 16:42, 11F
→
06/21 10:49, , 12F
06/21 10:49, 12F
全為null的值不會健在index內
所以如果判斷is null會變成index無法使用
→
06/21 10:50, , 13F
06/21 10:50, 13F
→
06/21 10:51, , 14F
06/21 10:51, 14F
→
06/21 10:52, , 15F
06/21 10:52, 15F
資料面來講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)
討論串 (同標題文章)
完整討論串 (本文為第 7 之 7 篇):