Progress 4gl 如何知道正在进行的程序(4GL)访问的记录数?

Progress 4gl 如何知道正在进行的程序(4GL)访问的记录数?,progress-4gl,openedge,progress-db,Progress 4gl,Openedge,Progress Db,我想知道一个正在运行的程序正在访问多少条记录。 我找到了VST_TableStat,但它没有按程序对记录数进行分组 FOR EACH _TableStat NO-LOCK WHERE _TableStat._TableStat-Create > 0 OR _TableStat._TableStat-Delete > 0 OR _TableStat._TableStat-Read > 0 OR _TableStat._Tab

我想知道一个正在运行的程序正在访问多少条记录。 我找到了VST_TableStat,但它没有按程序对记录数进行分组

FOR  EACH _TableStat NO-LOCK
    WHERE _TableStat._TableStat-Create > 0
       OR _TableStat._TableStat-Delete > 0
       OR _TableStat._TableStat-Read   > 0
       OR _TableStat._TableStat-Update > 0,
    FIRST _File NO-LOCK
    WHERE _File._File-Number = _TableStat._TableStat-Id:

    DISPLAY
      /*_File._File-Name*/
        _TableStat-Create
        _TableStat._TableStat-Delete
        _TableStat._TableStat-Read  
        _TableStat._TableStat-Update
        WITH SIDE-LABELS 1 COLUMN 1 DOWN.
END.
这段代码向我显示了表以及访问了多少条记录,但我想知道访问表的程序

有办法知道吗? 或者有一个像_TableStat这样的带有PID之类的东西的表吗

附言:我正在使用Progress10.2B

提前感谢,,
鲁宾尼奥·桑托斯是什么版本的进步

大约引入了10.1C_UserTableStat。它具有按用户划分的表统计信息

_connect VST中还有客户机语句缓存字段。如果为会话启用了适当的位,则会保存堆栈跟踪,以便您可以确定会话正在执行的行以及它是如何到达的

在他们之间,他们可以让你得到你需要的

顺便说一句:ProTop向您展示了很多数据-


如果需要细粒度的逐程序统计数据,您可能还需要查看一些日志条目类型功能,如4gltrace和QryInfo。

什么版本的进度

大约引入了10.1C_UserTableStat。它具有按用户划分的表统计信息

_connect VST中还有客户机语句缓存字段。如果为会话启用了适当的位,则会保存堆栈跟踪,以便您可以确定会话正在执行的行以及它是如何到达的

在他们之间,他们可以让你得到你需要的

顺便说一句:ProTop向您展示了很多数据-


如果需要细粒度的逐程序统计数据,您可能还需要查看一些日志条目类型功能,如4gltrace和QryInfo。

它与表_UserTableStat一起工作,正如我所期望的:

FOR EACH _UserTableStat NO-LOCK
   WHERE _UserTableStat._UserTableStat-Read   > 0
      OR _UserTableStat._UserTableStat-Create > 0
      OR _UserTableStat._UserTableStat-Update > 0
      OR _UserTableStat._UserTableStat-Delete > 0,
   FIRST _File NO-LOCK
   WHERE _File._File-Number = _UserTableStat._UserTableStat-Num,
   FIRST _Connect NO-LOCK
   WHERE _Connect._Connect-Id = _UserTableStat._UserTableStat-Conn:

    DISPLAY
        _Connect._Connect-IPAddress          
        _Connect._Connect-Name               
        _Connect._Connect-Pid                
        _File._File-Name                     
        _UserTableStat._UserTableStat-Read   
        _UserTableStat._UserTableStat-Create 
        _UserTableStat._UserTableStat-Update 
        _UserTableStat._UserTableStat-Delete 
    WITH SIDE-LABELS THREE-D 1 COLUMN 1 DOWN.

END.

谢谢汤姆·巴斯康的帮助

它与表_UserTableStat一起工作,正如我所期望的:

FOR EACH _UserTableStat NO-LOCK
   WHERE _UserTableStat._UserTableStat-Read   > 0
      OR _UserTableStat._UserTableStat-Create > 0
      OR _UserTableStat._UserTableStat-Update > 0
      OR _UserTableStat._UserTableStat-Delete > 0,
   FIRST _File NO-LOCK
   WHERE _File._File-Number = _UserTableStat._UserTableStat-Num,
   FIRST _Connect NO-LOCK
   WHERE _Connect._Connect-Id = _UserTableStat._UserTableStat-Conn:

    DISPLAY
        _Connect._Connect-IPAddress          
        _Connect._Connect-Name               
        _Connect._Connect-Pid                
        _File._File-Name                     
        _UserTableStat._UserTableStat-Read   
        _UserTableStat._UserTableStat-Create 
        _UserTableStat._UserTableStat-Update 
        _UserTableStat._UserTableStat-Delete 
    WITH SIDE-LABELS THREE-D 1 COLUMN 1 DOWN.

END.

谢谢汤姆·巴斯康的帮助

上面的代码与_connect和_UserTableStat之间的连接有问题:

WHERE _Connect._Connect-Id = _UserTableStat._UserTableStat-Conn
您必须使用此选项:

WHERE _Connect._Connect-Usr = _UserTableStat._UserTableStat-Conn
  hint: _Connect-Usr = _Connect-Id + 1
接下来,下面的代码给出了按_UserTableStat-read降序排列的列表:

DEFAULT-WINDOW:WIDTH-CHARS = 240.

DEFINE VARIABLE dmon           AS DATETIME NO-UNDO.
DEFINE VARIABLE dstart         AS DATETIME NO-UNDO.
DEFINE VARIABLE iusertablestat AS INTEGER  NO-UNDO.
DEFINE VARIABLE lfirstview     AS LOGICAL  INITIAL TRUE NO-UNDO.

DEFINE TEMP-TABLE ttuts LIKE _UserTableStat
    FIELD _Connect-Type       AS CHARACTER INITIAL ?
    FIELD _Connect-Name       AS CHARACTER INITIAL ? FORMAT "X(15)"
    FIELD _Connect-Time       AS CHARACTER INITIAL ? FORMAT "X(25)"
    FIELD _Connect-ClientType AS CHARACTER INITIAL ?
    INDEX _UserTableStat-read   _UserTableStat-read
    INDEX _UserTableStat-update _UserTableStat-update
    INDEX _UserTableStat-create _UserTableStat-create
    INDEX _UserTableStat-delete _UserTableStat-delete.
    
dstart = NOW.
dmon = NOW.
DEFAULT-WINDOW:TITLE = SUBSTITUTE("starting scan of _UserTableStat at &1", dstart).
FOR EACH _UserTableStat NO-LOCK: 
    iusertablestat = iusertablestat + 1.

    IF     iusertablestat MODULO 10000 = 0 
        OR INTERVAL(NOW, dmon, "milliseconds") > 1000 THEN
    DO:
        dmon = NOW.
        IF lfirstview THEN
        DO:
            DISPLAY "scanning in process" WITH FRAME fviewit.
            lfirstview = FALSE.
        END.
        DEFAULT-WINDOW:TITLE = SUBSTITUTE("&1 - Scanning since &2 ms - &3 _UserTableStat records (started at &4)"
            , NOW, INTERVAL(NOW, dstart, "milliseconds"), iusertablestat, dstart).
         
        DEFAULT-WINDOW:TITLE = SUBSTITUTE("starting scan of _UserTableStat at &1  scanned &2 records", dstart, iusertablestat).
        PROCESS EVENTS.
    END.

    /* if you are interested in updates or delte, then adapath this next line */
    IF _UserTableStat._UserTableStat-read = 0 
        THEN NEXT.
    
    IF _UserTableStat._UserTableStat-Conn <> ?
        THEN FIND _Connect NO-LOCK WHERE _Connect._Connect-Usr = _UserTableStat._UserTableStat-Conn NO-ERROR. /* beware: you may use _UserTableStat-id + 1 too but do not miss the + 1*/
    ELSE RELEASE _Connect.
    
    CREATE ttuts.
    BUFFER-COPY _UserTableStat TO ttuts.
    IF AVAIL _Connect
        THEN BUFFER-COPY _Connect TO ttuts.
END.


DEFAULT-WINDOW:TITLE = SUBSTITUTE("&1 - Scan completed in &2 ms through &3 _UserTableStat records (started at &4)"
    , NOW, INTERVAL(NOW, dstart, "milliseconds"), iusertablestat, dstart).

FOR EACH ttuts 
    , FIRST _File NO-LOCK WHERE _File._File-Number = ttuts._UserTableStat-Num
    BY ttuts._UserTableStat-read DESCENDING: 
    DISPLAY 
        ttuts._UserTableStat-Num
        _File._File-Name
        ttuts._Connect-Name 
        ttuts._UserTableStat-Conn  /* = _Connect._Connect-Usr */
        ttuts._Connect-Type  
        ttuts._Connect-Time  
        ttuts._Connect-ClientType 
        ttuts._UserTableStat-read   FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-update FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-create FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-delete FORMAT ">>>,>>>,>>>,>>>,>>9"
        WITH WIDTH 240 FRAME fttuts 17 DOWN.
END.
    

上面的代码与_connect和_UserTableStat之间的连接有问题:

WHERE _Connect._Connect-Id = _UserTableStat._UserTableStat-Conn
您必须使用此选项:

WHERE _Connect._Connect-Usr = _UserTableStat._UserTableStat-Conn
  hint: _Connect-Usr = _Connect-Id + 1
接下来,下面的代码给出了按_UserTableStat-read降序排列的列表:

DEFAULT-WINDOW:WIDTH-CHARS = 240.

DEFINE VARIABLE dmon           AS DATETIME NO-UNDO.
DEFINE VARIABLE dstart         AS DATETIME NO-UNDO.
DEFINE VARIABLE iusertablestat AS INTEGER  NO-UNDO.
DEFINE VARIABLE lfirstview     AS LOGICAL  INITIAL TRUE NO-UNDO.

DEFINE TEMP-TABLE ttuts LIKE _UserTableStat
    FIELD _Connect-Type       AS CHARACTER INITIAL ?
    FIELD _Connect-Name       AS CHARACTER INITIAL ? FORMAT "X(15)"
    FIELD _Connect-Time       AS CHARACTER INITIAL ? FORMAT "X(25)"
    FIELD _Connect-ClientType AS CHARACTER INITIAL ?
    INDEX _UserTableStat-read   _UserTableStat-read
    INDEX _UserTableStat-update _UserTableStat-update
    INDEX _UserTableStat-create _UserTableStat-create
    INDEX _UserTableStat-delete _UserTableStat-delete.
    
dstart = NOW.
dmon = NOW.
DEFAULT-WINDOW:TITLE = SUBSTITUTE("starting scan of _UserTableStat at &1", dstart).
FOR EACH _UserTableStat NO-LOCK: 
    iusertablestat = iusertablestat + 1.

    IF     iusertablestat MODULO 10000 = 0 
        OR INTERVAL(NOW, dmon, "milliseconds") > 1000 THEN
    DO:
        dmon = NOW.
        IF lfirstview THEN
        DO:
            DISPLAY "scanning in process" WITH FRAME fviewit.
            lfirstview = FALSE.
        END.
        DEFAULT-WINDOW:TITLE = SUBSTITUTE("&1 - Scanning since &2 ms - &3 _UserTableStat records (started at &4)"
            , NOW, INTERVAL(NOW, dstart, "milliseconds"), iusertablestat, dstart).
         
        DEFAULT-WINDOW:TITLE = SUBSTITUTE("starting scan of _UserTableStat at &1  scanned &2 records", dstart, iusertablestat).
        PROCESS EVENTS.
    END.

    /* if you are interested in updates or delte, then adapath this next line */
    IF _UserTableStat._UserTableStat-read = 0 
        THEN NEXT.
    
    IF _UserTableStat._UserTableStat-Conn <> ?
        THEN FIND _Connect NO-LOCK WHERE _Connect._Connect-Usr = _UserTableStat._UserTableStat-Conn NO-ERROR. /* beware: you may use _UserTableStat-id + 1 too but do not miss the + 1*/
    ELSE RELEASE _Connect.
    
    CREATE ttuts.
    BUFFER-COPY _UserTableStat TO ttuts.
    IF AVAIL _Connect
        THEN BUFFER-COPY _Connect TO ttuts.
END.


DEFAULT-WINDOW:TITLE = SUBSTITUTE("&1 - Scan completed in &2 ms through &3 _UserTableStat records (started at &4)"
    , NOW, INTERVAL(NOW, dstart, "milliseconds"), iusertablestat, dstart).

FOR EACH ttuts 
    , FIRST _File NO-LOCK WHERE _File._File-Number = ttuts._UserTableStat-Num
    BY ttuts._UserTableStat-read DESCENDING: 
    DISPLAY 
        ttuts._UserTableStat-Num
        _File._File-Name
        ttuts._Connect-Name 
        ttuts._UserTableStat-Conn  /* = _Connect._Connect-Usr */
        ttuts._Connect-Type  
        ttuts._Connect-Time  
        ttuts._Connect-ClientType 
        ttuts._UserTableStat-read   FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-update FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-create FORMAT ">>>,>>>,>>>,>>>,>>9"
        ttuts._UserTableStat-delete FORMAT ">>>,>>>,>>>,>>>,>>9"
        WITH WIDTH 240 FRAME fttuts 17 DOWN.
END.
    

不管谁否决了这一点,他都是个白痴——在进行性能调整时,这类问题至关重要。Tom Bascom有一个可以很好地解决这个问题的工具,我相信他很快就会发表评论。谁否决了这一点,谁就是白痴——在进行性能调整时,这种问题是至关重要的。Tom Bascom有一个工具可以很好地解决这个问题,我相信他很快就会发表评论。