實(shí)現(xiàn)批量查詢數(shù)據(jù)庫表所占空間
當(dāng)進(jìn)行大數(shù)據(jù)量操作時(shí),我們經(jīng)常想要知道數(shù)據(jù)庫中哪些表的邏輯操作次數(shù)最多,以及所有表所占用的空間大小。這樣可以有針對(duì)性地應(yīng)對(duì)表數(shù)據(jù)量過大給內(nèi)存增加的負(fù)擔(dān)。對(duì)于單個(gè)表來說,查詢其占用空間大小是很簡單的。但
當(dāng)進(jìn)行大數(shù)據(jù)量操作時(shí),我們經(jīng)常想要知道數(shù)據(jù)庫中哪些表的邏輯操作次數(shù)最多,以及所有表所占用的空間大小。這樣可以有針對(duì)性地應(yīng)對(duì)表數(shù)據(jù)量過大給內(nèi)存增加的負(fù)擔(dān)。對(duì)于單個(gè)表來說,查詢其占用空間大小是很簡單的。但是如果數(shù)據(jù)庫中有幾十甚至幾百個(gè)表時(shí),使用單表操作語句顯然不夠?qū)嶋H。接下來,我將介紹一種批量查詢數(shù)據(jù)庫表所占空間大小的方法。
創(chuàng)建輔助表
首先,在要批量查詢的數(shù)據(jù)庫中新建一個(gè)表,主要用于收集本數(shù)據(jù)庫中所有表的表名。通過一個(gè)INSERT觸發(fā)器,每次向表中添加表名,都會(huì)觸發(fā)該觸發(fā)器,從而直接顯示出這個(gè)表名所對(duì)應(yīng)的表所占空間大小。
創(chuàng)建觸發(fā)器
我們需要為輔助表AddTable創(chuàng)建一個(gè)觸發(fā)器。這個(gè)觸發(fā)器的構(gòu)造稍顯復(fù)雜,但希望能對(duì)新手有所幫助。首先,我們創(chuàng)建了一個(gè)名為mytrigger的觸發(fā)器,作用在AddTable表上。after insert表示觸發(fā)器在執(zhí)行添加語句之后觸發(fā)。
執(zhí)行動(dòng)態(tài)語句
接下來,我們使用EXECUTE執(zhí)行動(dòng)態(tài)語句。這里的“exec sp_spaceused [表名]”是常用的查詢單個(gè)表所占空間大小的語句。為了將表名傳遞給該語句,我們定義一個(gè)varchar類型的SQL參數(shù),大小為max,并將其初始化為空字符。在EXECUTE語句中,我們可以通過將表名替換為 TableName來動(dòng)態(tài)地執(zhí)行查詢。
添加操作并觸發(fā)觸發(fā)器
觸發(fā)器創(chuàng)建完畢后,我們只需對(duì)AddTable表進(jìn)行添加操作,以觸發(fā)它。根據(jù)之前的需求,我們先查詢出數(shù)據(jù)庫中所有表的表名,然后將它們添加到AddTable表中。首先,我們可以使用以下語句查詢數(shù)據(jù)庫中所有的表名:
select Name from sysobjects where xtype'u'
接下來,執(zhí)行以下語句添加表名:
Insert AddTable select Name from sysobjects where xtype'u'
執(zhí)行后,我們會(huì)發(fā)現(xiàn),在數(shù)據(jù)庫進(jìn)行邏輯添加的過程中,對(duì)應(yīng)表的數(shù)據(jù)也會(huì)被顯示出來。