国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

實用的存儲過程之一

2024-07-21 02:08:59
字體:
來源:轉載
供稿:網友
實用的存儲過程之一
筆者工作的公司采用的是sqlserver數據庫,每天都要處理大量的數據,由于筆者進公司的時間比較晚,公司現有的大部分的程序都是以前的程序員留下的,因為他們沒有相關的文檔,筆者對于后臺數據庫的很多表的結構和數據都不甚了解,給日常的維護造成了很大的麻煩。

在對后臺數據庫進行研究的過程中,我需要得到數據庫的某些相關信息,比如,我希望知道各個用戶表占用多少磁盤空間,并且排列出來,可以讓我知道哪些表比較大,數據比較多等等——我相信,這可能也是不少數據庫管理員所關心的問題,所以我決心做一個通用的存儲過程。我對系統的存儲過程sp_spaceused加了一些改動,以適合我的要求。希望這個存儲過程能對大家有些幫助。存儲過程如下:

if exists(select name from sysobjects where name='spaceused' and type='p')

drop procedure spaceused

go

create procedure spaceused

as

begin

 

declare @id       int                  -- the object id of @objname.

declare @type       character(2) -- the object type.

declare       @pages       int                  -- working variable for size calc.

declare @dbname sysname

declare @dbsize dec(15,0)

declare @logsize dec(15)

declare @bytesperpage       dec(15,0)

declare @pagespermb              dec(15,0)

declare @objname nvarchar(776)        -- the object we want size on.

declare @updateusage varchar(5)             -- param. for specifying that

 

create table #temp1

(

       表名              varchar(200) null,

       行數               char(11) null,

       保留空間        varchar(15) null,

       數據使用空間       varchar(15) null,

       索引使用空間       varchar(15) null,

        未用空間          varchar(15) null

)

--select @objname='n_dep'                               -- usage info. should be updated.

select @updateusage='false'

/*create temp tables before any dml to ensure dynamic

**  we need to create a temp table to do the calculation.

**  reserved: sum(reserved) where indid in (0, 1, 255)

**  data: sum(dpages) where indid < 2 + sum(used) where indid = 255 (text)

**  indexp: sum(used) where indid in (0, 1, 255) - data

**  unused: sum(reserved) - sum(used) where indid in (0, 1, 255)

*/

declare cur_table cursor for

  select name from sysobjects where type='u'

 

open cur_table

fetch next from cur_table into @objname

 

while @@fetch_status=0

begin

create table #spt_space

(

       rows              int null,

       reserved    dec(15) null,

       data        dec(15) null,

       indexp             dec(15) null,

       unused             dec(15) null

)

 

/*

**  check to see if user wants usages updated.

*/

 

if @updateusage is not null

       begin

              select @updateusage=lower(@updateusage)

 

              if @updateusage not in ('true','false')

                     begin

                            raiserror(15143,-1,-1,@updateusage)

                            return(1)

                     end

       end

/*

**  check to see that the objname is local.

*/

if @objname is not null

begin

 

       select @dbname = parsename(@objname, 3)

 

       if @dbname is not null and @dbname <> db_name()

              begin

                     raiserror(15250,-1,-1)

                     return (1)

              end

 

       if @dbname is null

              select @dbname = db_name()

 

       /*

       **  try to find the object.

       */

       select @id = null

       select @id = id, @type = xtype

              from sysobjects

                     where id = object_id(@objname)

 

       /*

       **  does the object exist?

       */

       if @id is null

              begin

                     raiserror(15009,-1,-1,@objname,@dbname)

                     return (1)

              end

 

 

       if not exists (select * from sysindexes

                            where @id = id and indid < 2)

 

              if      @type in ('p ','d ','r ','tr','c ','rf') --data stored in sysprocedures

                            begin

                                   raiserror(15234,-1,-1)

                                   return (1)

                            end

              else if @type = 'v ' -- view => no physical data storage.

                            begin

                                   raiserror(15235,-1,-1)

                                   return (1)

                            end

              else if @type in ('pk','uq') -- no physical data storage. --?!?! too many similar messages

                            begin

                                   raiserror(15064,-1,-1)

                                   return (1)

                            end

              else if @type = 'f ' -- fk => no physical data storage.

                            begin

                                   raiserror(15275,-1,-1)

                                   return (1)

                            end

end

 

/*

**  update usages if user specified to do so.

*/

 

if @updateusage = 'true'

       begin

              if @objname is null

                     dbcc updateusage(0) with no_infomsgs

              else

                     dbcc updateusage(0,@objname) with no_infomsgs

              print ' '

       end

 

 

set nocount on

 

/*

**  if @id is null, then we want summary data.

*/

/*    space used calculated in the following way

**       @dbsize = pages used

**       @bytesperpage = d.low (where d = master.dbo.spt_values) is

**    the # of bytes per page when d.type = 'e' and

**       d.number = 1.

**    size = @dbsize * d.low / (1048576 (or 1 mb))

*/

if @id is null

begin

       select @dbsize = sum(convert(dec(15),size))

              from dbo.sysfiles

              where (status & 64 = 0)

 

       select @logsize = sum(convert(dec(15),size))

              from dbo.sysfiles

              where (status & 64 <> 0)

 

       select @bytesperpage = low

              from master.dbo.spt_values

              where number = 1

                     and type = 'e'

       select @pagespermb = 1048576 / @bytesperpage

 

       select  database_name = db_name(),

              database_size =

                     ltrim(str((@dbsize + @logsize) / @pagespermb,15,2) + ' mb'),

              'unallocated space' =

                     ltrim(str((@dbsize -

                            (select sum(convert(dec(15),reserved))

                                   from sysindexes

                                          where indid in (0, 1, 255)

                            )) / @pagespermb,15,2)+ ' mb')

 

       print ' '

       /*

       **  now calculate the summary data.

       **  reserved: sum(reserved) where indid in (0, 1, 255)

       */

       insert into #spt_space (reserved)

              select sum(convert(dec(15),reserved))

                     from sysindexes

                            where indid in (0, 1, 255)

 

       /*

      ** data: sum(dpages) where indid < 2

       **    + sum(used) where indid = 255 (text)

       */

       select @pages = sum(convert(dec(15),dpages))

                     from sysindexes

                            where indid < 2

       select @pages = @pages + isnull(sum(convert(dec(15),used)), 0)

              from sysindexes

                     where indid = 255

       update #spt_space

              set data = @pages

 

 

       /* index: sum(used) where indid in (0, 1, 255) - data */

       update #spt_space

              set indexp = (select sum(convert(dec(15),used))

                            from sysindexes

                                   where indid in (0, 1, 255))

                         - data

 

       /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */

       update #spt_space

              set unused = reserved

                            - (select sum(convert(dec(15),used))

                                   from sysindexes

                                          where indid in (0, 1, 255))

 

       select reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              data = ltrim(str(data * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              unused = ltrim(str(unused * d.low / 1024.,15,0) +

                            ' ' + 'kb')

              from #spt_space, master.dbo.spt_values d

              where d.number = 1

                     and d.type = 'e'

end

 

/*

**  we want a particular object.

*/

else

begin

       /*

       **  now calculate the summary data.

       **  reserved: sum(reserved) where indid in (0, 1, 255)

       */

       insert into #spt_space (reserved)

              select sum(reserved)

                     from sysindexes

                            where indid in (0, 1, 255)

                                   and id = @id

 

       /*

      ** data: sum(dpages) where indid < 2

       **    + sum(used) where indid = 255 (text)

       */

       select @pages = sum(dpages)

                     from sysindexes

                            where indid < 2

                                   and id = @id

       select @pages = @pages + isnull(sum(used), 0)

              from sysindexes

                     where indid = 255

                            and id = @id

       update #spt_space

              set data = @pages

 

 

       /* index: sum(used) where indid in (0, 1, 255) - data */

       update #spt_space

              set indexp = (select sum(used)

                            from sysindexes

                                   where indid in (0, 1, 255)

                                          and id = @id)

                         - data

 

       /* unused: sum(reserved) - sum(used) where indid in (0, 1, 255) */

       update #spt_space

              set unused = reserved

                            - (select sum(used)

                                   from sysindexes

                                          where indid in (0, 1, 255)

                                                 and id = @id)

       update #spt_space

              set rows = i.rows

                     from sysindexes i

                            where i.indid < 2

                                   and i.id = @id

        insert into #temp1

       select name = object_name(@id),

              rows = convert(char(11), rows),

              reserved = ltrim(str(reserved * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              data = ltrim(str(data * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              index_size = ltrim(str(indexp * d.low / 1024.,15,0) +

                            ' ' + 'kb'),

              unused = ltrim(str(unused * d.low / 1024.,15,0) +

                            ' ' + 'kb')

       from #spt_space, master.dbo.spt_values d

              where d.number = 1

                     and d.type = 'e'

drop table #spt_space

end

fetch next from cur_table into @objname

end

close cur_table

deallocate cur_table

select * from #temp1 order by len(保留空間) desc,保留空間 desc

drop table #temp1

return (0)

end

原理很簡單,相信大家都能看懂,sp_spaceused幾乎原封不動地保留下來,調用也很簡單,直接執行即可,沒有任何參數,存儲過程執行后,將把當前連接的數據庫中所有數據表按照從大到小排列出來,還有其他的相關信息。如果能對大家有所參考價值,就請大家能給forgot2000一點掌聲鼓勵吧,謝謝!

本存儲過程在sqlserver7.0/2000下通過。

本人qq:33563255,e-mail:[email protected]

 

 
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 德保县| 肥东县| 昌江| 东乌| 连江县| 灵宝市| 大方县| 阿尔山市| 安乡县| 师宗县| 衢州市| 长沙县| 泸溪县| 诏安县| 石林| 五家渠市| 贵港市| 玉山县| 漳浦县| 桂阳县| 万源市| 邢台县| 郓城县| 吴江市| 错那县| 玉龙| 定西市| 佛学| 登封市| 将乐县| 吉木乃县| 枣阳市| 图们市| 岑巩县| 长葛市| 左贡县| 阿克苏市| 昌黎县| 鹿泉市| 油尖旺区| 嘉义市|