Step 1: Check Stats.do
Navigate to your instance: https://[instance].service-now.com/stats.do. This page shows real-time JVM metrics, thread counts, active sessions, and database query times. High thread counts and high average transaction times are immediate red flags.
Step 2: Check System Logs
Navigate to System > System Log > All. Filter by Level: Error first. Error logs often point directly at the problem script or table causing issues.
Step 3: Identify slow queries with Performance Log
Enable SQL query logging temporarily: navigate to System Diagnostics > Log Filters and enable database query logging. Then reproduce the slow operation. The logs will show query times and identify which queries are slow.
Common root causes and fixes
Cause: GlideRecord loop on a large table without a limiting query
// This runs against millions of records
var gr = new GlideRecord('cmdb_ci');
gr.query(); // No filter!
while (gr.next()) { ... }
Fix: Add an addEncodedQuery() and setLimit().
Cause: Business Rule running on every update of a high-volume table
Check the Business Rule conditions. If it runs on every update of the incident table and your org has 10,000 incidents per day, that rule runs 10,000 times. Make the condition as specific as possible, and make Async if the work does not need to be synchronous.
Cause: Scheduled Job running too frequently with expensive logic
Navigate to System Scheduler > Scheduled Jobs and review jobs running every minute or every 5 minutes. Each job run shows its last execution time in the log. Slow jobs running frequently multiply their impact.
Cause: Client Script making multiple GlideAjax calls on form load
Multiple simultaneous GlideAjax calls on form load slow form rendering. Consolidate into a single server call using a Display Business Rule with g_scratchpad to pre-load data.
Instance Scan
Run an Instance Scan (System Diagnostics > Instance Scan) to get a comprehensive report of anti-patterns. The Performance category specifically identifies query and scripting issues.