code
/*author:浪客
location:beijing
date:getdate()
descript:利用checksum建立索引
*/select
checksum(
'我和你');
usetempdb;
godrop
table
dbo.t
create
table
dbo.t(id
intprimary
keyidentity(1
,1),[
name
]nvarchar
(max
));--這裡我偷懶一下,自己注意在ide中,關閉,不要插入太多了.哈
while1=
1insert
into
dbo.t
select
cast
(newid
() as
nvarchar(36
))--
表 't'。掃瞄計數 1,邏輯讀取 5059 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
----
cpu 時間 = 922 毫秒,占用時間 = 918 毫秒。
setstatistics
io on
setstatistics
time
onselect
*from
dbo.t
where
[name]=
'6ddc1b6c-0ac3-475f-8270-ea14ae69878a
'set
statistics
time
offset
statistics
io off
--訊息 1919,級別 16,狀態 1,第 1 行
--表 'dbo.t' 中的列 'name' 的型別不能用作索引中的鍵列。一些大資料型別列還沒發建立索引呢.怎麼搞呢?
create
index
[ix_t_name]on
dbo.t(name);
--難道我們必須要表(聚集索引)掃瞄嗎或者非全文索引,我們可以使用checksum 來做
alter
table
dbo.t
addname_idx
as(checksum(name))
create
index
[ix_t_name]on
dbo.t(name_idx)
--表 't'。掃瞄計數 1,邏輯讀取 6 次,物理讀取 0 次,預讀 0 次,lob 邏輯讀取 0 次,lob 物理讀取 0 次,lob 預讀 0 次。
----
cpu 時間 = 0 毫秒,占用時間 = 1 毫秒。
setstatistics
io on
setstatistics
time
onselect
*from
dbo.t
where
checksum(
'6ddc1b6c-0ac3-475f-8270-ea14ae69878a')
=name_idx
setstatistics
time
offset
statistics
io off
上述也只是出苗粗描了一下,建立索引的話,是不能超過900位元組
的字段的.博友可以看看我的兩篇索引的文章.
文章過後,和同事**了一下這個問題,checksum主要是用於奇偶校檢的雜湊值,但是雜湊可能會出現重複值,所以一直擔心會不會checksum存在重複值的問題,但是msdn對checksum解釋很少,也沒有具體的實現演算法...
但是今天無意中在 使用者自定義函式中,找到了類似的答案說 checksum是確定性函式,結果很明顯,我擔心的事可以散了.呵呵所以把文章頂上去...
c mysql建立索引 MySQL 建立索引
1 索引建立原則 1 搜尋的索引列,不一定是所要選擇的列。換句話說,最適合索引的列是出現在where子句中的列,或連線子句中指定的列,而不是出現在select關鍵字後的選擇列表中的列。2 使用唯一索引。考慮某列中值的分布。索引的列的基數越大,索引的效果越好。3 使用短索引。如果對字串列進行索引,應該...
(索引)建立MySQL索引
建立索引的必要性 主鍵預設是建立索引的,而且具有唯一性 合適地建立索引後比不建立索引,提高了查詢速度 建立索引的語法 簡單索引 可以有重複資料 create index indexname on tablename column name 1舉例子說明如 建立乙個資料表,設定一些初始的資料,然後採用...
SQL 索引 建立索引
create index 語句用於在表中建立索引。在不讀取整個表的情況下,索引使資料庫應用程式可以更快地查詢資料。您可以在表中建立索引,以便更加快速高效地查詢資料。使用者無法看到索引,它們只能被用來加速搜尋 查詢。注釋 更新乙個包含索引的表需要比更新乙個沒有索引的表更多的時間,這是由於索引本身也需要...