SSブログ

使用容量計算 [技術情報]

ユーザーがWebUI上で容量の確認をしようと思うと「サイト コレクションの利用状況の概要」でサイトコレクション単位で確認することができます。ただし、サイトコレクション単位でしかデータは存在していません。
しかもそのデータは集計値ではなく累積値になっています。つまり、サイトコレクションにファイルが追加・削除されるたびに加算・減算を行っているようです。

Sitesテーブルに存在する下記のカラムがそう。
 ・DISKUSED … ディスク使用量

そのほかにもこんなカラムがあります。
 ・DISKQUOTA … クォータ設定値
 ・DISKWARNING … 警告メール送信値

それじゃぁつまらないので、できる限り正確なサブサイト単位の容量を計算してみたいと思います。

まず、容量は2つに分かれています。1つがサイトコレクション単位の容量、もう一つがサブサイト単位の容量です。
 サイト単位 … WebPartsテーブル
 サブサイト単位 … Docs, DocVersions, ComMd, Personalization, Lists, UserData

まず、サイト単位の情報を取得します。
-- WebParts
SELECT Sites.FullUrl AS SiteUrl,Sites.id AS SiteId,Sites.DiskUsed AS DiskUsed,
  Sites.DiskQuota AS DiskQuota,Sites.DiskWarning AS DiskWarning,
  Sum(ISNULL(WebParts.tp_Size,0)) AS WebPartsSize FROM Sites
 LEFT OUTER JOIN WebParts ON Sites.id = WebParts.tp_SiteId
 GROUP BY Sites.FullUrl,Sites.id,DiskUsed,DiskQuota,DiskWarning
 ORDER BY Sites.FullUrl

次にサブサイト単位にDocsの情報を集計します。
-- Docs
SELECT Sites.FullUrl AS SiteUrl,  Webs.FullUrl AS SubSiteUrl, Sites.Id AS SiteId,
  Webs.Id AS WebId, ISNULL(SUM(CAST(ISNULL(Docs.Size, 0) AS BIGINT) +
  CAST(ISNULL(Docs.CheckoutSize, 0) AS BIGINT)+
  CAST(ISNULL(Docs.MetaInfoSize, 0) AS BIGINT)),0) AS DocSize
 FROM Sites
 LEFT OUTER JOIN Webs ON Sites.Id = Webs.SiteID
 LEFT OUTER JOIN Docs ON Sites.Id = Docs.SiteId and Webs.id = Docs.webid
 GROUP BY Sites.FullUrl,Webs.FullUrl,Sites.Id,Webs.Id
 ORDER BY Sites.FUllUrl,Webs.FullUrl

次にDocVersions,ComMd,Personalizationを集計します。
-- DocVersions,ComMd,Personalizations,
SELECT Sites.FullUrl AS SiteUrl, Webs.FullUrl AS SubSiteUrl, Sites.Id AS SiteId,
  Webs.Id AS WebId, SUM(CAST((ISNULL(DocVersions.Size, 0)
  + ISNULL(DocVersions.MetaInfoSize, 0)) AS BIGINT)) AS DocVerSize,
  SUM(ISNULL(CONVERT(BIGINT,ComMd.[size]),0)) AS ComMdSize,
  SUM(ISNULL(CONVERT(BIGINT,Personalization.[tp_size]),0)) AS PersonalSize FROM Sites
 LEFT OUTER JOIN Webs ON Sites.Id = Webs.SiteID
 LEFT OUTER JOIN Docs ON Sites.Id = Docs.SiteId and Webs.id = Docs.webid
 LEFT OUTER JOIN DocVersions ON Sites.id = Docversions.siteid and Docs.id = DocVersions.id
 LEFT OUTER JOIN ComMd ON Sites.id = ComMd.siteid and Docs.id = ComMd.docid
 LEFT OUTER JOIN Personalization ON Sites.id = Personalization.tp_siteid
  and Docs.id = Personalization.tp_pageurlid
 GROUP BY Sites.FullUrl,Webs.FullUrl,Sites.Id,Webs.Id ORDER BY Sites.FUllUrl,Webs.FullUrl

次にリストデータの集計をします。
-- Lists,UserData
SELECT Sites.FullUrl AS SiteUrl,  Webs.FullUrl AS SubSiteUrl, Sites.Id AS SiteId,
  Webs.Id AS WebId, SUM(ISNULL(CONVERT(BIGINT,UserData.[tp_Size]), 0)) AS UserDataSize
 FROM Sites
 LEFT OUTER JOIN Webs ON Sites.Id = Webs.SiteID
 LEFT OUTER JOIN Lists ON Webs.Id = Lists.tp_WebId
 LEFT OUTER JOIN UserData ON Sites.id = UserData.tp_siteid and Lists.tp_id = UserData.tp_ListId
 GROUP BY Sites.FullUrl,Webs.FullUrl,Sites.Id,Webs.Id
 ORDER BY Sites.FUllUrl,Webs.FullUrl

上記のDocs, DocVersions, ComMD, Personalization, UserDataの集計値を加算した値に最初で算出したWebPartsの集計値を加算します。

ただし、正式に発表された情報ではないのであくまでも目安としてつかってください。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。