Best Practices for Optimal Performance in ArcFM - Designer

Version 6

    This section outlines best practices for Designer users. Designer users should also review the section above about reducing the ArcMap footprint as these best practices apply to Designer as well as ArcFM.

     

    Design Stored Displays

     

    Design Stored Displays allow you to create and store a stored display with each design. This means the following information will be stored with each design: selectable layers, definition queries, layer order, symbology, visible scale, labeling properties. While this may be useful information, it also may be slowing performance. If you have configured design stored displays, weigh the benefits against the performance impact.

    Design stored displays cause the MM_STORED_DISPLAYS table to become bloated and slow performance. Below are the steps to disable design stored displays.

    1. Open the Process Framework Administration Tool and select the Configuration tab.
    2. Look for the WMSDisableDesignStoredDisplay value. If this value exists and is set to 0, then you have design stored displays enabled. If this value does not exist or is set to 1, then design stored displays are disabled.
    3. To disable design stored displays, either delete the WMSDisableDesignStoredDisplay config value or set its value to 1.

     

    Database Indices

     

    You will notice significant performance gains in opening and saving designs if you create the following indices on the Process Framework (PX) tables in your database.

     

    Index NameTableFields

    PX_USER_USERID_IDX

    1. PROCESS.MM_PX_USER

    USER_ID

    PX_USER_ROLE_ID_RLID_IDX

    1. PROCESS.MM_PX_USER_ROLE

    USER_ID,ROLE_ID

    PX_ROLE_RLID_IDX

    1. PROCESS.MM_PX_ROLE

    ROLE_ID

    PX_NODE_TYPE_ID_IDX

    1. PROCESS.MM_PX_NODE_TYPE

    NODE_TYPE_ID

    PX_NODE_TYPE_NAME_IDX

    1. PROCESS.MM_PX_NODE_TYPE

    Name

    PX_FILTERS_PRODID_IDX

    1. PROCESS.MM_PX_FILTERS

    Progid

    PX_STATE_STID_IDX

    1. PROCESS.MM_PX_STATE

    STATE_ID

    PX_STATE_STA_IDX

    1. PROCESS.MM_PX_STATE

    STATE

    PX_STATE_ROLE_STID_IDX

    1. PROCESS.MM_PX_STATE_ROLE

    state_id

    PX_SUBTASKS_ID_IDX

    1. PROCESS.MM_PX_SUBTASKS

    task_id

    PX_SUBTASK_PARAM_STID_IDX

    1. PROCESS.MM_PX_SUBTASKS_PARAMETERS

    subtask_id

    PX_TRAN_TO_STATE_TRANID_IDX

    1. PROCESS.MM_PX_TRANSITION_TO_STATE

    transition_id

    PX_TRAN_FROM_STATE_TRANID_IDX

    1. PROCESS.MM_PX_TRANSITION_FROM_STATE

    transition_id

    PX_TRAN_ROLE_TRANID_IDX

    1. PROCESS.MM_PX_TRANSITION_ROLE

    transition_id

    PX_HIST_ID_NODETY_NDID_IDX

    1. PROCESS.MM_PX_HISTORY

    USER_ID,NODE_TYPE_ID,NODE_ID

    MM_MOBILESTATE_NODETYID_IDX

    1. PROCESS.MM_MOBILE_STATE

    NODE_TYPE_ID,NODE_ID


    SQL Index Statements

    create index PX_USER_USERID_IDX on PROCESS.MM_PX_USER(USER_ID);

    create index PX_USER_ROLE_ID_RLID_IDX on PROCESS.MM_PX_USER_ROLE(USER_ID,ROLE_ID);

    create index PX_ROLE_RLID_IDX on PROCESS.MM_PX_ROLE(ROLE_ID);

    create index PX_NODE_TYPE_ID_IDX on PROCESS.MM_PX_NODE_TYPE(NODE_TYPE_ID);

    create index PX_NODE_TYPE_NAME_IDX on PROCESS.MM_PX_NODE_TYPE(name);

    create index PX_FILTERS_PRODID_IDX on PROCESS.MM_PX_FILTERS(progid);

    create index PX_STATE_STID_IDX on PROCESS.MM_PX_STATE(STATE_ID);

    create index PX_STATE_STA_IDX on PROCESS.MM_PX_STATE(STATE);

    create index PX_STATE_ROLE_STID_IDX on PROCESS.MM_PX_STATE_ROLE(state_id);

    create index PX_SUBTASKS_ID_IDX on PROCESS.MM_PX_SUBTASKS(task_id);

    create index PX_SUBTASK_PARAM_STID_IDX on PROCESS.MM_PX_SUBTASKS_PARAMETERS(subtask_id);

    create index PX_TRAN_TO_STATE_TRANID_IDX on PROCESS.MM_PX_TRANSITION_TO_STATE(transition_id);

    create index PX_TRAN_FROM_STATE_TRANID_IDX on PROCESS.MM_PX_TRANSITION_FROM_STATE(transition_id);

    create index PX_TRAN_ROLE_TRANID_IDX on PROCESS.MM_PX_TRANSITION_ROLE(transition_id);

    create index PX_HIST_ID_NODETY_NDID_IDX on PROCESS.MM_PX_HISTORY(USER_ID,NODE_TYPE_ID,NODE_ID);

    create index MM_MOBILESTATE_NODETYID_IDX on PROCESS.MM_MOBILE_STATE(NODE_TYPE_ID,NODE_ID);

     

    DesignID Index

     

    To maximize performance, you will want to add indices to the DesignID field of all feature and object classes that participate in a design. You will also need to update your Adds tables if working with a versioned geodatabase. You can run the following Python script to programmatically create the necessary indices:

    import arcpy

     

     

     

    arcpy.env.workspace = r"c:\location_of_your_database\database_name.gdb

     

    """

     

    For a versioned database, point to the .sde file in your C:\Users\[username]\AppData\Roaming\ESRI\Desktop10.1\ArcCatalog directory. Be sure to have that connection use saved credentials. See http://gis.stackexchange.com/questions/16859/define-workspace-for-sde-connection-in-python for an example.

     

    """

     

     

     

    for dataset in arcpy.ListDatasets():

        for fc in arcpy.ListFeatureClasses(feature_dataset=dataset):

            try:

                arcpy.AddIndex_management(dataset + "/" + fc, "DesignID", "DesignID")

            except RuntimeError:

                print("Skipping feature class " + fc + " in dataset " + dataset)

    for table in arcpy.ListTables():

        try:

            arcpy.AddIndex_management(table, "DesignID", "DesignID")

        except RuntimeError:

              print("Skipping table " + table)

     

    Running the Script in ArcCatalog

      1. Change the value of arcpy.env.workspace to your SDE connection or personal geodatabase.
      2. Start ArcCatalog.
      3. In ArcCatalog, select Geoprocessing > Results to open the Results pane. This pane will show the actions the script makes.
      4. Select Geoprocessing > Python to open the Python window.
      5. Copy and paste the preceding code into the Python window.
      6. Hit Enter. The script will add the indices to the necessary tables.