朋友的一個checksum計算列建立的索引:
在資料庫設計中需要一列标注網頁的URL位址,LINK NVARCHAR(1000)。在INSERT的時候需要判斷之前有無同樣的URL位址記錄被插入。
也就是用select top 1 @ID=ID from Table where Link=@Link,然後判斷@ID值是否大于0。
如果資料量過大,需要給LINK加為索引,但是這時會發現SQL SERVER的索引對那麼大的NVARCHR是無法建立的,限制在200字元以内。
我在最早的時候解決這個問題是采用了對LINK進行MD5化,MD5的值隻有幾十個字元長,然後對MD5結果進行索引。但這樣做性能其實一般,而且大字段的資料庫索引同樣會占用不少存儲空間。
其實在SQL SERVER中可以設定計算字段,就是說該字段是可以是其他字段的計算結果。這樣的話就用CHECKSUM來優化上述的索引問題。
做法範例:
這樣就建立一個csLink列,生成的CHECKSUM值是一個大的整數。對該列進行索引,相當于對BITINT型進行索引,索引存儲空間也非常節約。這樣在判别有無重複LINK的時候就使用:
資料庫會優先判斷csLink索引字段,而實際測試100萬條記錄的CHECKSUM,無一重複,是以第一次比對的傳回條數是極少的,基本可以做到一批比對,而考慮肯能會有重複記錄,是以再加上And Link=@Link,這樣是在小的資料集中再次做無索引比對,這樣性能損耗幾乎沒有感覺。
計算字段給我感覺就好像視圖,計算字段的靈活度除了簡化查找SELECT語句之外,對索引優化的作用是非常大的。CHECKSUM的用法隻是發現之一,在今後一定會發現更多的有用的TIPS