What This Table Is

The pa_indicators table stores KPI definitions that power Performance Analytics dashboards and reports. Each record defines what data to collect (through the collection_query field), how to aggregate it (aggregate_type), and when to collect it (collection_schedule).

Owned by the Performance Analytics module, this table is the configuration backbone for automated KPI collection. The PA framework reads these definitions and executes the collection queries on schedule, storing results in pa_snapshots and pa_cube_fact tables. The indicators drive the entire PA collection pipeline from data extraction to dashboard visualization.

This table doesn't extend task or any other core table—it's a standalone configuration table. No tables extend pa_indicators, but it has critical relationships with pa_cubes (parent container), pa_m2m_cube_indicator (cube assignments), and pa_collection_log (execution history).

Large enterprises typically have 200-500 active indicators across all cubes. Each indicator can generate thousands of snapshots daily depending on breakdown configuration. Query performance is generally good since most scripting reads indicator metadata rather than processing collection data—that heavy lifting happens in the PA framework's scheduled jobs.

When You'll Script Against This Table

You'll primarily script against pa_indicators in Business Rules when building PA automation, Script Includes for custom collection logic, and Scheduled Jobs for bulk indicator management. The most common pattern is querying indicator definitions to programmatically trigger collections or validate KPI configurations before deployment.

Access requires pa_admin role for writes and pa_power_user for reads. The table respects domain separation—indicators in global domain are visible to all, but scoped indicators follow standard domain ACL patterns. No record-level security exists beyond domain restrictions.

  • Validate collection queries before indicator activation using GlideRecord.isValidQuery()
  • Clone indicators across cubes by copying definition fields and updating cube references
  • Bulk activate/deactivate indicators based on cube status or collection performance
  • Generate indicator documentation by extracting name, description, and collection_query fields
  • Monitor collection failures by joining with pa_collection_log on indicator sys_id
  • Build custom collection triggers that execute specific indicators outside their normal schedule
  • Audit indicator changes by comparing collection_query field between versions

Table Gotchas

⚠️

The `aggregate_type` field stores encoded values that don't match the UI labels. 'SUM' displays as 'Sum' but the database value is '1', 'COUNT' is '2', 'AVG' is '3'. Always query by the numeric code, not the display value.

  • The collection_query field accepts complex queries but doesn't validate syntax until collection runs—test queries before saving indicators
⚠️

Changing an active indicator's `collection_query` doesn't automatically recollect historical data. Existing snapshots remain unchanged, potentially creating inconsistent time series.

  • The active field behaves as expected, but inactive indicators still appear in cube configuration UI—filter by both active=true and cube assignment status
  • Performance trap: avoid CONTAINS queries on collection_query field—it's not indexed and queries are expensive with large text values
⚠️

The `unit` field is purely cosmetic for dashboard display. Changing it doesn't convert existing snapshot values—you'll have mixed units in historical data.

  • The order field controls dashboard display sequence but doesn't affect collection execution order—that's controlled by collection_schedule
Free Newsletter

Enjoying this? Get one deep-dive per week.

Join 1,000+ ServiceNow pros — scripts, GlideRecord patterns, Flow Designer techniques, and career moves. Free.

No spam · Unsubscribe anytime

This table doesn't extend a parent, but has tight integration with pa_cubes which provide the organizational container for indicators. The pa_m2m_cube_indicator table manages many-to-many relationships, allowing indicators to belong to multiple cubes. You'll frequently join these three tables when building comprehensive PA reports or management interfaces.

The pa_snapshots and pa_cube_fact tables store the actual collected data generated by these indicator definitions. When troubleshooting collection issues or building custom analytics, you'll query pa_indicators for the configuration and pa_collection_log for execution history. The cmn_schedule table defines when collections run, referenced by the indicator's collection_schedule field.

For breakdown and dimension analysis, developers commonly join with pa_breakdowns and pa_dimensions tables. These define how collected data gets segmented and categorized in dashboards. When building automated PA solutions, you'll typically start with pa_indicators to understand what's being measured, then follow relationships to cubes, schedules, and fact tables.