Re: [SQL ] 是否避免null值

看板Database作者 (BOSS)時間12年前 (2013/06/19 13:32), 編輯推噓1(1014)
留言15則, 4人參與, 最新討論串7/7 (看更多)
舉個例 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
?可是index會有null就有點奇怪了?
06/20 10:17, 1F

06/20 12:01, , 2F
你在問啥? index裡本來就不存null才會走full table scan
06/20 12:01, 2F

06/20 13:08, , 3F
那又怎麼會有 where phone is null 的 query...
06/20 13:08, 3F

06/20 13:09, , 4F
或者該問為什麼會在被索引的欄位裡放 null
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
index會容易濫用~然後異動會導致效能~
06/20 16:37, 6F

06/20 16:37, , 7F
以前遇到某專案會有專人在開發時會監督SQL~避免這種問題
06/20 16:37, 7F

06/20 16:38, , 8F
像現在都只能靠拜拜希望自己或有人會注意到
06/20 16:38, 8F

06/20 16:41, , 9F
遇到某專案的架構師告誡pk fk index 不能有null
06/20 16:41, 9F

06/20 16:41, , 10F
然後還會問說你建這個index要幹碼?!!
06/20 16:41, 10F

06/20 16:42, , 11F
阿~當時覺得很討厭~後來才知道這樣才是好阿
06/20 16:42, 11F

06/21 10:49, , 12F
請問為什麼 where .. null 就會是 full table scan 呀?
06/21 10:49, 12F
全為null的值不會健在index內 所以如果判斷is null會變成index無法使用

06/21 10:50, , 13F
假如我是資料庫軟體的設記者,既然接受可為null的欄位建索引
06/21 10:50, 13F

06/21 10:51, , 14F
比如說在建立 hash table 時把 null 視為某個值就好
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)
文章代碼(AID): #1HmK9eUy (Database)
文章代碼(AID): #1HmK9eUy (Database)