This is page 6 of 8 of the general performance analysis scripts online for the Performance Analyser 1.20 tool. See page 1 for the introduction. Use the links in the table below to navigate between pages.

- General analysis
Analyse SQL Configuration Page 1
Analyse SQL Indexes Page 2
Analyse SQL Queries Page 3
Analyse Blocking Page 4
Baseline - benchmark queries Page 5
- AX Specific
Analyse AX Configuration Page 6
Analyse AX Indexes Page 7
Analyse AX Queries Page 8

Analyse AX Configuration

AOS_DEBUG
CONNECTION_CONTEXT
TOO_BIG_FOR_ENTIRE_TABLE_CACHE
TABLES_THAT_COULD_BE_ENTIRE_TABLE_CACHE
ENTIRE_TABLE_CACHE_WITH_UPDATES
OCC_DISABLED
AX_DATABASE_LOGGING
AX_ALERTS_ON_TABLE
AX_BATCH_CONFIGURATION
AOS_CLUSTER_CONFIG
AX_DB_LOGGING_BY_TABLE
NUMBER_SEQUENCE_USAGE

 

USE DynamicsPerf

--AOS Configuration issues
--
--    AOS_DEBUG
  -- --------------------------------------------------------------
  -- Is Enable X++ Debug enabled on any AOS Servers.
  -- 20% decline in transactions processed on the AOS instances with this enabled
  -----------------------------------------------------------------
  
  SELECT SERVER_NAME,
      AOS_INSTANCE_NAME,
      SETTING_NAME,
      SETTING_VALUE
  FROM   AOS_REGISTRY
  WHERE  IS_CONFIGURATION_ACTIVE = 'Y'
      AND SETTING_NAME = 'xppdebug'
      AND SETTING_VALUE <> '0'

  -- --------------------------------------------------------------
  --    CONNECTION_CONTEXT
  -- Is Context_Info enabled on any AOS Servers.
  --
  -----------------------------------------------------------------
  
  SELECT SERVER_NAME,
      AOS_INSTANCE_NAME,
      SETTING_NAME,
      SETTING_VALUE
  FROM   AOS_REGISTRY
  WHERE  IS_CONFIGURATION_ACTIVE = 'Y'
      AND SETTING_NAME = 'connectioncontext'
      AND SETTING_VALUE <> '0'

 

--AOT configuration issues
  
   --  TOO_BIG_FOR_ENTIRE_TABLE_CACHE

   -- --------------------------------------------------------------
   -- Find tables that have entire table cache enabled that are larger than 128K
   -- Causes the cache to overflow to disk on the AOS Server
   -----------------------------------------------------------------

   SELECT A.TABLE_NAME,
       APPLICATION_LAYER,
       CACHE_LOOKUP,
       PAGE_COUNT
   FROM   AX_TABLE_DETAIL_CURR_VW A,
       INDEX_STATS_CURR_VW I
   WHERE  A.DATABASE_NAME = I.DATABASE_NAME
       AND A.TABLE_NAME = I.TABLE_NAME
       AND CACHE_LOOKUP = 'EntireTable'
       AND ( INDEX_DESCRIPTION = 'HEAP'
        OR INDEX_DESCRIPTION LIKE 'CLUSTERED%' )
       AND PAGE_COUNT > 16  -- 128kb
       --AND PAGE_COUNT> 4  --32KB AX2012RTM
       --AND PAGE_COUNT> 12  --96KB AX2012R2
      
   ORDER  BY PAGE_COUNT DESC

   --  TABLES_THAT_COULD_BE_ENTIRE_TABLE_CACHE

   -- --------------------------------------------------------------
   -- Find tables that have no cache enabled that are smaller than 128K
   -- These could cause lots of roundtrips between AOS and SQL
   --
   -- NOTE:
   -- Table should be static and not updated much before changing
   -- cache to Entiretable
   -----------------------------------------------------------------

   SELECT A.TABLE_NAME,
       APPLICATION_LAYER,
       CACHE_LOOKUP,
       PAGE_COUNT
   FROM   AX_TABLE_DETAIL_CURR_VW A,
       INDEX_STATS_CURR_VW I
   WHERE  A.DATABASE_NAME = I.DATABASE_NAME
       AND A.TABLE_NAME = I.TABLE_NAME
       AND CACHE_LOOKUP = 'None'
       AND ( INDEX_DESCRIPTION = 'HEAP'
        OR INDEX_DESCRIPTION LIKE 'CLUSTERED%' )
       AND PAGE_COUNT < 16  -- 128kb
       --AND PAGE_COUNT> 4  --32KB AX2012RTM
       --AND PAGE_COUNT> 12  --96KB AX2012R2
       AND PAGE_COUNT > 0
      
   ORDER  BY TABLE_NAME DESC
   --
   --  ENTIRE_TABLE_CACHE_WITH_UPDATES
   --
   -- --------------------------------------------------------------
   -- Find tables that have entire table cache and show update rate
   -- Causes the cache to be refreshed on all AOS instances
   -----------------------------------------------------------------
   
   SELECT A.TABLE_NAME,
       APPLICATION_LAYER,
       CACHE_LOOKUP,
       USER_UPDATES
   FROM   AX_TABLE_DETAIL_CURR_VW A,
       INDEX_STATS_CURR_VW I
   WHERE  A.DATABASE_NAME = I.DATABASE_NAME
       AND A.TABLE_NAME = I.TABLE_NAME
       AND CACHE_LOOKUP = 'EntireTable'
       AND ( INDEX_DESCRIPTION = 'HEAP'
        OR INDEX_DESCRIPTION LIKE 'CLUSTERED%' )
   ORDER  BY USER_UPDATES DESC

   --
   -- OCC_DISABLED
   --
   -- --------------------------------------------------------------
   --  Find tables above SYS layer that do not have OCC enabled:
   --
   -----------------------------------------------------------------
   
   SELECT TABLE_NAME
   FROM   AX_TABLE_DETAIL_CURR_VW
   WHERE  APPLICATION_LAYER NOT IN ( 'SYS', 'System Table' )
       AND OCC_ENABLED = 0
   ORDER  BY TABLE_NAME

   --
   -- AX_DATABASE_LOGGING
   --
   -- --------------------------------------------------------------
   -- Find tables above SYS layer that have logging enabled
   --
   -----------------------------------------------------------------
   
   SELECT *
   FROM   AX_TABLE_DETAIL_CURR_VW
   WHERE  APPLICATION_LAYER NOT IN ( 'SYS', 'System Table' )
       AND ( DATABASELOG_INSERT = 1
        OR DATABASELOG_DELETE = 1
        OR DATABASELOG_UPDATE = 1
        OR DATABASELOG_RENAME_KEY = 1 )
   ORDER  BY TABLE_NAME

   --
   --  AX_ALERTS_ON_TABLE
   --
   -- --------------------------------------------------------------
   -- Find tables above SYS layer that have events enabled
   --
   -----------------------------------------------------------------
   
   SELECT *
   FROM   AX_TABLE_DETAIL_CURR_VW
   WHERE  APPLICATION_LAYER NOT IN ( 'SYS', 'System Table' )
       AND ( EVENT_INSERT = 1
        OR EVENT_DELETE = 1
        OR EVENT_UPDATE = 1
        OR EVENT_RENAME_KEY = 1 )
   ORDER  BY TABLE_NAME

   -- SELECT * FROM EVENTRULE   -- DO THIS IN THE AX DATABASE TO DISCOVER ABOVE DATA

--AX Application configuration issues

   --
   --  AX_BATCH_CONFIGURATION
   --
   -- -----------------------------------------------------------------------------
   -- List BATCHGROUP configuration in Dynamics AX
   --------------------------------------------------------------------------------
   
   SELECT *
   FROM   AX_BATCH_CONFIGURATION_VW

   --
   --  AOS_CLUSTER_CONFIG
   --
   -- -----------------------------------------------------------------------------
   -- List AOS cluster configuration in Dynamics AX
   --------------------------------------------------------------------------------

   SELECT *
   FROM   AX_SERVER_CONFIGURATION_VW

   --
   --  AX_DB_LOGGING_BY_TABLE
   --
   -- --------------------------------------------------------------
   -- List top 200 tables be logged in Dynamics AX
   -- NOTE: if this query returns zero rows
   --         the AOTEXPORT class has not been run
   -----------------------------------------------------------------

   SELECT [TABLE_NAME],
       [ROWS_LOGGED],
       [DATABASELOG_UPDATE],
       [DATABASELOG_DELETE],
       [DATABASELOG_INSERT]
   FROM   [AX_DATABASELOGGING_VW]
   ORDER  BY [ROWS_LOGGED] DESC
   
   --
   --  NUMBER_SEQUENCE_USAGE
   --
   -- -----------------------------------------------------------------------------
   -- List NUMBERSEQUENCE table configuration in Dynamics AX
   -- Are sequences marked as Coninuous?  If so why?
   -- Is FETCHAHEADQTY > 0,  if not preallocation is not setup for this sequence
   -- Pre-allocation requires knowledge of the avg. number of numbers consumed
   -- per user process to determine a good value.       
   --------------------------------------------------------------------------------
   
   SELECT RUN2.[DATABASE_NAME],
       RUN2.[COMPANYID],
       RUN2.[NUMBERSEQUENCE],
       RUN2.[TEXT],
       Datediff(hh, RUN1.STATS_TIME, RUN2.STATS_TIME)                                       AS ELAPSED_HOURS,
       RUN2.NEXTREC - RUN1.NEXTREC                                                          AS TOTAL_NUMBERS_CONSUMED,
       ( RUN2.NEXTREC - RUN1.NEXTREC ) / ( Datediff(hh, RUN1.STATS_TIME, RUN2.STATS_TIME) ) AS HOURLY_CONSUMPTION_RATE,
       RUN2.HIGHEST - RUN2.NEXTREC                                                          AS [NUMBERSREMAINING],
       RUN2.[CONTINUOUS],
       RUN2.[FETCHAHEAD],
       RUN2.[FETCHAHEADQTY]
   FROM   AX_NUM_SEQUENCES_VW RUN1
       INNER JOIN AX_NUM_SEQUENCES_VW RUN2
         ON RUN1.NUMBERSEQUENCE = RUN2.NUMBERSEQUENCE
         AND RUN1.COMPANYID = RUN2.COMPANYID
   WHERE  RUN1.RUN_NAME = 'BASE_to_compare_to'
       AND RUN2.RUN_NAME = 'Feb_26_2020_804AM'
   ORDER  BY 6 DESC

 

   --To find run_name run the following query

   SELECT *
   FROM   STATS_COLLECTION_SUMMARY
   ORDER  BY STATS_TIME DESC

   -- --------------------------------------------------------------
   -- Review number sequence configuration in Dynamics AX
   -----------------------------------------------------------------

   SELECT *
   FROM   AX_NUM_SEQUENCES_CURR_VW
   WHERE  CONTINUOUS = 'Yes'