USP_DATABASESPACEUSED_ANALYZE

Parameters

Parameter Parameter Type Mode Description
@BUSINESSPROCESSSTATUSID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.[USP_DATABASESPACEUSED_ANALYZE]
(
  @BUSINESSPROCESSSTATUSID uniqueidentifier
)
as begin
  set nocount on;

  if object_id('tempdb..#SPACEUSED') is null
    raiserror('BBERR_TEMPTABLEDOESNOTEXIST: The temporary table #SPACEUSED must be created and populated before this procedure can be called.', 13, 1);

  truncate table dbo.[DATABASESPACEUSED];

  insert into dbo.[DATABASESPACEUSED]
  (
    [ID],
    [SCHEMANAME],
    [NAME],
    [ROWS],
    [RESERVEDKB],
    [DATAKB],
    [INDEXKB],
    [UNUSEDKB]
  ) select
    newid(),
    [SCHEMANAME],
    [NAME],
    [ROWS],
    replace([RESERVED], ' KB', ''),
    replace([DATA], ' KB', ''),
    replace([INDEX], ' KB', ''),
    replace([UNUSED], ' KB', '')
  from #SPACEUSED;

  drop table #SPACEUSED;

  /***********************************************************
   * 1. populate useful DATABASESPACEUSED foreign keys       *
   ***********************************************************/

  update dbo.[DATABASESPACEUSED] set
    [TABLECATALOGID] = [TABLECATALOG].[ID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[TABLECATALOG] on [TABLECATALOG].[TABLENAME] = [DATABASESPACEUSED].[NAME]
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo';

  update dbo.[DATABASESPACEUSED] set
    [TABLECATALOGID] = [TABLECATALOG].[ID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[TABLECATALOG] on [TABLECATALOG].[TABLENAME] + 'AUDIT' = [DATABASESPACEUSED].[NAME]
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo';

  update dbo.[DATABASESPACEUSED] set
    [BUSINESSPROCESSOUTPUTID] = [BUSINESSPROCESSOUTPUT].[ID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[BUSINESSPROCESSOUTPUT] on [BUSINESSPROCESSOUTPUT].[TABLENAME] = [DATABASESPACEUSED].[NAME]
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo'
    and [DATABASESPACEUSED].[NAME] not like 'MKTSEGMENTATIONEXCLUSIONS\_%' escape '\' 
    and [DATABASESPACEUSED].[NAME] not like 'MKTMAILINGPREACTIVATION\_%' escape '\';

  update dbo.[DATABASESPACEUSED] set
    [IDSETREGISTERID] = [IDSETREGISTERADHOCQUERY].[IDSETREGISTERID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[IDSETREGISTERADHOCQUERY] on [IDSETREGISTERADHOCQUERY].[ADHOCQUERYID] = 
    convert(uniqueidentifier, replace(substring([DATABASESPACEUSED].[NAME], 24, 36), '_', '-'))
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo'
    and [DATABASESPACEUSED].[NAME] like 'ADHOCQUERY\_STATICIDSET\_%' escape '\';

  update dbo.[DATABASESPACEUSED] set
    [IDSETREGISTERID] = [IDSETREGISTERSMARTQUERYINSTANCE].[IDSETREGISTERID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[IDSETREGISTERSMARTQUERYINSTANCE] on [IDSETREGISTERSMARTQUERYINSTANCE].[SMARTQUERYINSTANCEID] = 
    convert(uniqueidentifier, replace(substring([DATABASESPACEUSED].[NAME], 32, 36), '_', '-'))
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo'
    and [DATABASESPACEUSED].[NAME] like 'SMARTQUERYINSTANCE\_STATICIDSET\_%' escape '\';

  update dbo.[DATABASESPACEUSED] set
    [IDSETREGISTERID] = [IMPORTSELECTIONPROCESS].[IDSETREGISTERID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[IMPORTSELECTIONPROCESS] on [IMPORTSELECTIONPROCESS].[ID] = 
    convert(uniqueidentifier, replace(substring([DATABASESPACEUSED].[NAME], 29, 36), '_', '-'))
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo'
    and [DATABASESPACEUSED].[NAME] like 'IMPORTSELECTION\_STATICIDSET\_%' escape '\';

  update dbo.[DATABASESPACEUSED] set
    [IDSETREGISTERID] = [IDSETREGISTER].[ID]
  from dbo.[DATABASESPACEUSED]
  inner join dbo.[IDSETREGISTER] on [IDSETREGISTER].[DBOBJECTNAME] = [DATABASESPACEUSED].[NAME]
  where [DATABASESPACEUSED].[SCHEMANAME] = 'dbo'
    and [DATABASESPACEUSED].[IDSETREGISTERID] is null;

  /***********************************************************
   * 2. assign types to DATABASESPACEUSED rows               *
   ***********************************************************/

  update dbo.[DATABASESPACEUSED] set
    [TYPECODE] = case when [NAME] like '%CATALOG' or [NAME] like 'REVISIONLOG%' or [NAME] like 'SYSTEMROLEPERM%' or 
                           [NAME] = 'QUERYVIEWRELATIONSHIP' or [NAME] like 'RECORDTYPE%' then 4 -- system

                      when [NAME] like '%AUDIT' then 6 -- audit

                      when [IDSETREGISTERID] is not null or [NAME] like 'IMPORTSELECTION\_STATICIDSET%' escape '\' then 2 -- ID set

                      when [BUSINESSPROCESSOUTPUTID] is not null then 3 -- output

                      else 1 end -- data

  where [SCHEMANAME] = 'dbo';

  -- identify customization tables as any tables whose author in the table spec catalog is not 'Blackbaud Product Development'


  with xmlnamespaces ('bb_appfx_table' as ns)
  update dbo.[DATABASESPACEUSED] set
    [TYPECODE] = 5 -- custom

  from dbo.[DATABASESPACEUSED]
  inner join dbo.[TABLECATALOG] on [TABLECATALOG].[ID] = [DATABASESPACEUSED].[TABLECATALOGID]
  where isnull([TABLECATALOG].[TABLESPECXML].value('/ns:TableSpec[1]/@Author', 'nvarchar(255)'), '') <> 'Blackbaud Product Development';

  -- when looking for customization tables, we also have to look for tables created for a customization during the spec loading process: for example, USR_SOMEBUSINESSPROCESS 

  -- generates USR_SOMEBUSINESSPROCESSSTATUS and USR_SOMEBUSINESSPROCESSEXPORTFORMAT; they get 'Blackbaud Product Development' as their author, but they're really part of the

  -- customization


  with [CUSTOMTABLES] as (
    select [NAME] from dbo.[DATABASESPACEUSED] where [TYPECODE] = 5
  )
  update dbo.[DATABASESPACEUSED] set
    [TYPECODE] = 5 -- custom

  from [CUSTOMTABLES]
  inner join dbo.[DATABASESPACEUSED] on [DATABASESPACEUSED].[NAME] like replace([CUSTOMTABLES].[NAME], '_', '\_') + '%' escape '\';

  -- "other" for now is any table whose schema is not dbo - this catches custom data warehouses


  update dbo.[DATABASESPACEUSED] set
    [TYPECODE] = 0 -- other

  where [SCHEMANAME] <> 'dbo';

  /***********************************************************
   * 3. assign subtypes to DATABASESPACEUSED rows            *
   ***********************************************************/

  update dbo.[DATABASESPACEUSED] set
    [SUBTYPECODE] = case when ([NAME] like 'ATTRIBUTE%' and len([NAME]) = 41) 
                           or ([NAME] like 'BATCHATTRIBUTE%' and len([NAME]) = 46)
                         then 2 -- attribute


                         when [NAME] like 'MKTSEGMENTATIONDATA\_%' escape '\' 
                           or [NAME] like 'MKTSEGMENTATIONEXCLUSIONS\_%' escape '\' 
                           or [NAME] like 'MKTMAILINGPREACTIVATION\_%' escape '\' 
                           or [NAME] like 'MKTSEGMENTATIONSEGMENTCACHEADDRESSES\_%' escape '\'
                           or [NAME] like 'MKTSEGMENTATIONSEGMENTCACHEEMAILADDRESSES\_%' escape '\'
                           or [NAME] like 'MKTSEGMENTLISTDATADONORS\_%' escape '\'
                           or [NAME] like 'MKTSOURCEANALYSISRULEDATA\_%' escape '\'
                         then 3 -- marketing effort data


                         when ([NAME] like 'SMARTFIELD%' and len([NAME]) = 42)
                         then 4 -- smart field


                         else 1 end -- application

  where [TYPECODE] = 1; -- data


  update dbo.[DATABASESPACEUSED] set
    [SUBTYPECODE] = case when [NAME] like 'IMPORTSELECTION\_STATICIDSET%' escape '\' then 6 -- imported

                         when [NAME] like 'IDSETGENERIC%' then 5
                         else 7 end -- query

  where [TYPECODE] = 2; -- ID set


  update dbo.[DATABASESPACEUSED] set
    [SUBTYPECODE] = case when [NAME] like 'BATCH%' then 9 -- batch

                         when [NAME] like 'MKT%' then 11 -- marketing

                         when [NAME] like 'EXPORT%' or [NAME] like '%EXPORT%' then 10 -- export

                         else 8 end -- other

  where [TYPECODE] = 3; -- output


  /***********************************************************
   * 4. save summary information to DATABASESPACEUSEDHISTORY *
   ***********************************************************/

  declare @ASOF datetimeoffset = sysdatetimeoffset();

  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 0, 0;  -- other data


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 1, 1;  -- application data, transactional data


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 1, 2;  -- application data, attribute data


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 1, 3;  -- application data, marketing effort data


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 1, 4;  -- application data, smart field calculations


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 2, 5;  -- selection data, generic selections


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 2, 6;  -- selection data, imported selections


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 2, 7;  -- selection data, selections from query


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 3, 8;  -- business process history, other output


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 3, 9;  -- business process history, batch process output


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 3, 10; -- business process history, export output


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 3, 11; -- business process history, marketing effort export output


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 4, 0;  -- system tables


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 5, 0;  -- customization tables


  exec dbo.[USP_DATABASESPACEUSEDHISTORY_SAVE] @BUSINESSPROCESSSTATUSID, @ASOF, 6, 0;  -- audit tables


  return 0;
end