Quantcast
Viewing all articles
Browse latest Browse all 12

Ed Barlow Stored Procedures: sp__monobj Updated with formatting for SAP Sybase ASE 15 and higher

Ed Barlow createdImage may be NSFW.
Clik here to view.
SAP Sybase
the sp__monobj uses a heuristic algorithm to find which objects are most busy as part of the excellent Extended Stored Procedures by Ed Barlow (AKA the Ed Barlow Stored Procedures).

I’ve cleaned up the format output

Differences:

diff sp__monobj.old sp__monobj.15
17a18,26
> --------------------------------------------------------------------------------------------------
> -- Vers|   Date   |      Who           | DA | Description
> -------+----------+--------------------+----+-----------------------------------------------------
> -- 1.1 |11/20/2013|  Jason Froebe      |    | Fix formatting of outputs
> -- 1.0 |  2006    |  Edward Barlow     |    | Shows Highest Usage Objects Based On Mda tables.
> --     |          |                    |    |  This uses a heuristic algorithm to find what objects
> --     |          |                    |    |  are most busy.
> -------+----------+--------------------+----+-----------------------------------------------------
>
21a31,34
> declare @max_objectname_size varchar(3)
> declare @exec_str varchar(2000)
>
>
34a48,51
>     print ""
>     print "    score = LogicalReads/100 + PhysicalReads/10 + PhysicalWrites + RowsInserted + RowsDeleted + RowsUpdated + LockRequests + Lockwaits"
>     print ""
>
36,37c53,55
< select ObjName=convert(varchar(40),db_name(DBID)+"."+object_name(ObjectID,DBID)),
<       score= LogicalReads/100 +
---
>
>       select ObjName = db_name(DBID) + ".." + object_name(ObjectID, DBID),
>       score = LogicalReads/100        +
45,46c63,65
< from    master..monOpenObjectActivity
<       where   IndexID=0
---
>     into #busy_report
>       from master..monOpenObjectActivity
>       where IndexID=0
55c74
< and     db_name(DBID)!="tempdb"
---
>       and     DBName !="tempdb"
57a77
>
58a79,87
>
>     select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report
>
>     select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName), score
>         from #busy_report
>         order by score desc'
>
>     exec (@exec_str)
>
72a102,121
>     create table #busy_report_iter_obj (
>         ObjName varchar(255) not null,
>         Op bigint not null,
>         LogReads int not null,
>         PhysReads int not null,
>         PageReads int not null,
>         Writes int not null,
>         Ins int not null,
>         Del int not null,
>         Upd int not null,
>         Locks int not null,
>         LockWt int not null)
>
>     create table #busy_report_iter (
>         ObjName varchar(255) not null,
>         Op int not null,
>         Reads int not null,
>         Writes int not null,
>         NumRows bigint not null)
>
81,86c130,131
< -- select *
<                       -- from master..monOpenObjectActivity
<                       -- where IndexID=0 and db_name(DBID)!='tempdb'
<                       -- and ( @object_name is null or @object_name=object_name(ObjectID, DBID))
<
<               select distinct ObjName=convert(varchar(39),db_name(o.DBID)+"."+object_name(o.ObjectID,o.DBID)),
---
>             insert into #busy_report_iter_obj
>                   select distinct ObjName = db_name(o.DBID) + ".." + object_name(o.ObjectID,o.DBID),
88c133
< LogReads=o.LogicalReads - i.LogicalReads,
---
>                           LogReads=o.LogicalReads - i.LogicalReads,
92,103c137,167
< "Ins"=o.RowsInserted -i.RowsInserted,
<                               "Del"= o.RowsDeleted  - i.RowsDeleted,
<                               "Upd"= o.RowsUpdated - i.RowsUpdated ,
<                               "Locks"= o.LockRequests - i.LockRequests,
<                               "LockWt"= o.LockWaits - i.LockWaits
<               from  master..monOpenObjectActivity o,#tmp i
<               where o.IndexID=i.IndexID
<                       and o.ObjectID=i.ObjectID
<                       and o.DBID=i.DBID
<                       and o.IndexID=i.IndexID
<                       and o.IndexID=0
<                       and i.IndexID=0
---
>                           Ins=o.RowsInserted -i.RowsInserted,
>                               Del= o.RowsDeleted  - i.RowsDeleted,
>                               Upd= o.RowsUpdated - i.RowsUpdated ,
>                               Locks= o.LockRequests - i.LockRequests,
>                               LockWt= o.LockWaits - i.LockWaits
>                   from  master..monOpenObjectActivity o,#tmp i
>                   where o.IndexID=i.IndexID
>                           and o.ObjectID=i.ObjectID
>                           and o.DBID=i.DBID
>                           and o.IndexID=i.IndexID
>                           and o.IndexID=0
>                           and i.IndexID=0
>
>             select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report_iter_obj
>
>             select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName),
>                               Op,
>                           LogReads,
>                               PhysReads,
>                               PageReads,
>                               Writes,
>                           Ins,
>                               Del,
>                               Upd,
>                               Locks,
>                               LockWt
>                 from #busy_report_iter_obj'
>
>             exec (@exec_str)
>
>             delete #busy_report_iter_obj
107c171
< set rowcount 10
---
>                   set rowcount 10
109,138c173,202
< select distinct ObjName=convert(varchar(39),db_name(o.DBID)+"."+object_name(o.ObjectID,o.DBID)),
<               Op=o.Operations-i.Operations,
<       Reads=o.LogicalReads+ o.PhysicalReads- i.LogicalReads- i.PhysicalReads,
<               Writes=o.PhysicalWrites-i.PhysicalWrites,
<       "Rows"=o.RowsInserted + o.RowsDeleted   + o.RowsUpdated-i.RowsInserted - i.RowsDeleted - i.RowsUpdated
<       from  master..monOpenObjectActivity o,#tmp i
<    where    o.IndexID=i.IndexID
<               and o.ObjectID=i.ObjectID
<               and o.DBID=i.DBID
<               and o.IndexID=i.IndexID
<               and o.IndexID=0
<               and i.IndexID=0
<               -- and ( o.LogicalReads>0 or o.LockRequests>0 )
< order by
<       o.LogicalReads/100      +
<       o.PhysicalReads/10      +
<       o.PhysicalWrites                +
<       o.RowsInserted                  +
<       o.RowsDeleted                   +
<       o.RowsUpdated                   +
<       o.LockRequests/100   +
<       o.LockWaits             -
<       i.LogicalReads/100      -
<       i.PhysicalReads/10      -
<       i.PhysicalWrites                -
<       i.RowsInserted                  -
<       i.RowsDeleted                   -
<       i.RowsUpdated                   -
<       i.LockRequests/100   -
<       i.LockWaits    desc
---
>             insert into #busy_report_iter
>             select distinct ObjName = db_name(o.DBID) + ".." + object_name(o.ObjectID,o.DBID),
>                       Op = o.Operations-i.Operations,
>                 Reads = o.LogicalReads+ o.PhysicalReads- i.LogicalReads- i.PhysicalReads,
>                       Writes = o.PhysicalWrites-i.PhysicalWrites,
>                 NumRows = o.RowsInserted + o.RowsDeleted   + o.RowsUpdated-i.RowsInserted - i.RowsDeleted - i.RowsUpdated
>             from  master..monOpenObjectActivity o,#tmp i
>             where    o.IndexID=i.IndexID
>                       and o.ObjectID=i.ObjectID
>                       and o.DBID=i.DBID
>                       and o.IndexID=i.IndexID
>                       and o.IndexID=0
>                       and i.IndexID=0
>             order by
>                   o.LogicalReads/100  +
>                 o.PhysicalReads/10    +
>                 o.PhysicalWrites              +
>                 o.RowsInserted                +
>                 o.RowsDeleted                 +
>                 o.RowsUpdated                 +
>                 o.LockRequests/100   +
>                 o.LockWaits                   -
>                   i.LogicalReads/100  -
>                 i.PhysicalReads/10    -
>                 i.PhysicalWrites              -
>                 i.RowsInserted                -
>                 i.RowsDeleted                 -
>                 i.RowsUpdated                 -
>                 i.LockRequests/100   -
>                 i.LockWaits    desc
139a204,215
>             select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report_iter
>
>             select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName),
>                 Op,
>                 Reads,
>                 Writes,
>                 NumRows
>             from #busy_report_iter'
>
>             exec (@exec_str)
>
>             delete #busy_report_iter
152d227
< -- select 1,* from #tmp where object_id('sp_aux_getsize')=ObjectID and DBID=db_id('master')

SQL of sp__monobj:

use sybsystemprocs
go
/* Procedure library copyright(c) 2004-2006 by Edward M Barlow */

IF EXISTS (SELECT * FROM sysobjects
           WHERE  name = "sp__monobj"
           AND    type = "P")
   DROP PROC sp__monobj

go

CREATE PROC sp__monobj(
                @num_sec_delay int=NULL,
                @num_iter int=NULL,
                @dont_format char(1)=NULL,
                @object_name varchar(30)=NULL)
AS
--------------------------------------------------------------------------------------------------
-- Vers|   Date   |      Who           | DA | Description
-------+----------+--------------------+----+-----------------------------------------------------
-- 1.1 |11/20/2013|  Jason Froebe      |    | Fix formatting of outputs
-- 1.0 |  2006    |  Edward Barlow     |    | Shows Highest Usage Objects Based On Mda tables.
--     |          |                    |    |  This uses a heuristic algorithm to find what objects
--     |          |                    |    |  are most busy.
-------+----------+--------------------+----+-----------------------------------------------------

set nocount on
declare @delay char(8)
declare @objid int

declare @max_objectname_size varchar(3)
declare @exec_str varchar(2000)


if @object_name is not null
begin
        select @objid=ObjectID
        from master..monOpenObjectActivity where object_name(ObjectID,DBID)=@object_name
        if @objid is null
                return
end


if @num_sec_delay is null
begin
        --Busy Object Report
        print "Top 20 Used Objects"
    print ""
    print "    score = LogicalReads/100 + PhysicalReads/10 + PhysicalWrites + RowsInserted + RowsDeleted + RowsUpdated + LockRequests + Lockwaits"
    print ""

        set rowcount 20

        select ObjName = db_name(DBID) + ".." + object_name(ObjectID, DBID),
        score = LogicalReads/100        +
                PhysicalReads/10 +
                PhysicalWrites +
                RowsInserted   +
                RowsDeleted    +
                RowsUpdated    +
                LockRequests   +
                LockWaits
    into #busy_report
        from master..monOpenObjectActivity
        where IndexID=0
        and LogicalReads/100    +
                PhysicalReads/10 +
                PhysicalWrites +
                RowsInserted   +
                RowsDeleted    +
                RowsUpdated    +
                LockRequests   +
                LockWaits      >1000
        and     DBName !="tempdb"
        and ( @object_name is null or @object_name=object_name(ObjectID, DBID))
        order by score desc

        set rowcount 0

    select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report

    select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName), score
        from #busy_report
        order by score desc'

    exec (@exec_str)

end
else
begin
        select *
        into #tmp
        from master..monOpenObjectActivity
        where IndexID=0 and db_name(DBID)!='tempdb'
        and ( @object_name is null or ObjectID=@objid )

        if @num_sec_delay<10
                select @delay="00:00:0"+convert(char(1),@num_sec_delay)
        else
                select @delay="00:00:"+convert(char(2),@num_sec_delay)

    create table #busy_report_iter_obj (
        ObjName varchar(255) not null,
        Op bigint not null,
        LogReads int not null,
        PhysReads int not null,
        PageReads int not null,
        Writes int not null,
        Ins int not null,
        Del int not null,
        Upd int not null,
        Locks int not null,
        LockWt int not null)

    create table #busy_report_iter (
        ObjName varchar(255) not null,
        Op int not null,
        Reads int not null,
        Writes int not null,
        NumRows bigint not null)

        if @num_iter is null
                select @num_iter=100
        while @num_iter>0
        begin
                waitfor delay @delay

                if( @object_name is not null )
                begin
            insert into #busy_report_iter_obj
                    select distinct ObjName = db_name(o.DBID) + ".." + object_name(o.ObjectID,o.DBID),
                                Op=o.Operations-i.Operations,
                    LogReads=o.LogicalReads - i.LogicalReads,
                                PhysReads=o.PhysicalReads- i.PhysicalReads,
                                PageReads=o.PagesRead- i.PagesRead,
                                Writes=o.PhysicalWrites-i.PhysicalWrites,
                    Ins=o.RowsInserted -i.RowsInserted,
                                Del= o.RowsDeleted  - i.RowsDeleted,
                                Upd= o.RowsUpdated - i.RowsUpdated ,
                                Locks= o.LockRequests - i.LockRequests,
                                LockWt= o.LockWaits - i.LockWaits
            from  master..monOpenObjectActivity o,#tmp i
                    where o.IndexID=i.IndexID
                            and o.ObjectID=i.ObjectID
                            and o.DBID=i.DBID
                            and o.IndexID=i.IndexID
                            and o.IndexID=0
                            and i.IndexID=0

            select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report_iter_obj

            select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName),
                                Op,
                    LogReads,
                                PhysReads,
                                PageReads,
                                Writes,
                    Ins,
                                Del,
                                Upd,
                                Locks,
                                LockWt
                from #busy_report_iter_obj'

            exec (@exec_str)

            delete #busy_report_iter_obj
                end
                else
                begin
                    set rowcount 10

            insert into #busy_report_iter
            select distinct ObjName = db_name(o.DBID) + ".." + object_name(o.ObjectID,o.DBID),
                        Op = o.Operations-i.Operations,
                Reads = o.LogicalReads+ o.PhysicalReads- i.LogicalReads- i.PhysicalReads,
                        Writes = o.PhysicalWrites-i.PhysicalWrites,
                NumRows = o.RowsInserted + o.RowsDeleted   + o.RowsUpdated-i.RowsInserted - i.RowsDeleted - i.RowsUpdated
            from  master..monOpenObjectActivity o,#tmp i
            where    o.IndexID=i.IndexID
                        and o.ObjectID=i.ObjectID
                        and o.DBID=i.DBID
                        and o.IndexID=i.IndexID
                        and o.IndexID=0
                        and i.IndexID=0
            order by
                    o.LogicalReads/100  +
                o.PhysicalReads/10      +
                o.PhysicalWrites                +
                o.RowsInserted                  +
                o.RowsDeleted                   +
                o.RowsUpdated                   +
                o.LockRequests/100   +
                o.LockWaits             -
                    i.LogicalReads/100  -
                i.PhysicalReads/10      -
                i.PhysicalWrites                -
                i.RowsInserted                  -
                i.RowsDeleted                   -
                i.RowsUpdated                   -
                i.LockRequests/100   -
                i.LockWaits    desc

            select @max_objectname_size = convert(varchar(3), isnull( max(char_length(ObjName)), 1)) from #busy_report_iter

            select @exec_str = 'select "Object Name" = convert(varchar(' + @max_objectname_size + '), ObjName),
                Op,
                Reads,
                Writes,
                NumRows
            from #busy_report_iter'

            exec (@exec_str)

            delete #busy_report_iter
                set rowcount 0

                end

                delete #tmp

                insert #tmp
                select *
                from master..monOpenObjectActivity
                where IndexID=0 and db_name(DBID)!='tempdb'
                and ( @object_name is null or ObjectID=@objid )

                select @num_iter = @num_iter - 1
        end
end

return

go

GRANT EXECUTE ON sp__monobj  TO public
go

sp__monwaits


Viewing all articles
Browse latest Browse all 12

Trending Articles