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