聚集索引的困惑

2021-04-15 22:54:59 字數 2389 閱讀 2922

很久沒來了,提問+散分.

今天遇到個問題,與聚集索引有關,不知道大家有沒有遇到過這樣的情況,請大家不吝賜教.

表中有一nvarchar列,含有數字和字元.需要將該列中的全數字行轉換為數值後進行篩選.

轉換的方法是先使用isnumeric()= 1來判斷每行是否為數值,然後再使用cast()轉換.

當表中沒有聚集索引的時候可以正常轉換,而一旦加了聚集索引,則轉換會出錯,錯誤資訊為:

伺服器: 訊息 8114,級別 16,狀態 5,行 2

將資料型別 nvarchar 轉換為 float 時出錯。

以下是測試**,系統環境為:

簡體中文sqlserver2000sp4 + 簡體中文windowsserver2003sp1

sql code

if

object_id(n'

tbtest')

isnot

null

drop

table

tbtest

go--

--建立測試表

create

table

tbtest(id

int,姓名

nvarchar(20

),部門**

nvarchar(10

))insert

into

tbtest

select1,n

'張三',n

'1000

'union

allselect2,n

'李四',n

'1001

'union

allselect3,n

'王五',n

'2001

'union

allselect4,n

'趙六',n

'2002

'union

allselect5,n

'趙七',n

'a3001'/*

該行含有字元,並非全數字

*/go

----查詢(該查詢能正常執行)

select

*from

tbtest

where

isnumeric

(部門**) =1

andcast

(部門**

asfloat

) >

1000

/*結果

id 姓名 部門**

----------- -------------------- ----------

2 李四 1001

3 王五 2001

4 趙六 2002

*/go

----!加入聚合索引

ifindexproperty

(object_id(n'

tbtest

'),n

'ix_tbtest',

'indexid')

isnot

null

drop

index

tbtest.ix_tbtest

gocreate

clustered

index

ix_tbtest

ondbo.tbtest(id)

go--

--查詢(相同的查詢**,卻因建立了聚合索引而丟擲8114異常)

select

*from

tbtest

where

isnumeric

(部門**) =1

andcast

(部門**

asfloat

) >

1000

/*結果

id 姓名 部門**

----------- -------------------- ----------

2 李四 1001

3 王五 2001

4 趙六 2002

伺服器: 訊息 8114,級別 16,狀態 5,行 2

將資料型別 nvarchar 轉換為 float 時出錯。

*/

聚集索引 非聚集索引

通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...

聚集索引和非聚集索引

聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...

聚集索引和非聚集索引

本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...