SQL Server計算列是否占用空間

2021-09-21 20:19:12 字數 1637 閱讀 9560

今天看網上有個問題:sql server計算列是否占用空間

其實這個問題查一下msdn或者bol就可以知道結果了 。在建立計算列的時候有乙個引數可以指定persisted。使用這個引數可以指定資料庫引擎將在表中物理儲存計算值,並在計算列依賴的任何其他列發生更新時對這些計算值進行更新。而且將計算列標記為 persisted,便可對具有確定性、但不精確的計算列建立索引,提高效能。

如果不使用persisted引數,那麼計算列不會占用磁碟空間,但是查詢計算列的時候要計算出值,這樣效能會受影響(空間換效能)。

這裡我們測試一下:

use tempdbgo

-- createtable

create

table udfeffect(id int,

firstname varchar

(100),

lastname varchar

(100))

go-- insert onehundred thousand records

insert

into udfeffect(id,firstname,lastname)

select

top 100000 row_number

()over 

(order

by a.name) rowid,

'bob',

case

when

row_number

()over 

(order

by a.name)%2 = 1 then

'smith'

else

'brown'

end

from

sys.

all_objects a

cross

join

sys.

all_objects bgo

-- check thespace used by table

sp_spaceused

'udfeffect'

go

-- addcomputed column

alter

table dbo.udfeffect add

fullname as 

(firstname+

' '+lastname)

go-- check thespace used by table

sp_spaceused

'udfeffect'

go

可以看到表大小並沒有改變,資料頁沒有增長。

-- addcomputed column persisted

alter

table dbo.udfeffect add

fullname_p as 

(firstname+

' '+lastname)

persisted

go-- check thespace used by table

sp_spaceused

'udfeffect'

go

使用persisted引數可以看到資料有增長。

-- clean updatabase

drop

table udfeffectgo

Sql Server中如何判斷表中某列是否存在

比如說要判斷表a中的字段c是否存在兩個方法 一,if exists select 1 from sysobjects t1 inner join syscolumns t2 on t1.id t2.id where t1.name a and t2.name c print 存在 else prin...

SQLServer佔記憶體過多的問題

經常看見有人問,mssql占用了太多的記憶體,而且還不斷的增長 或者說已經設定了使用記憶體,可是它沒有用到那麼多,這是怎麼一回事兒呢?首先,我們來看看mssql是怎樣使用記憶體的。最大的開銷一般是用於資料快取,如果記憶體足夠,它會把用過的資料和覺得你會用到的資料統統扔到記憶體中,直到記憶體不足的時候...

SQL Server 聚焦計算列持久化(二十一)

上一節我們結束了hash match aggregate和stream aggregate的講解,本系列我們來講講關於sql server中的計算列問題,簡短的內容,深入的理解,always to review the basics。在sql server 2005就引入了計算列,我們首先稍微看下在...