1. What is an Oracle trigger?
A trigger is a stored PL/SQL block that automatically executes in response to certain events on a table, view, schema, or database.
- Common types: BEFORE INSERT, AFTER UPDATE, INSTEAD OF DELETE (for views)
- Use case: Auditing, enforcing complex business rules, or cascading actions
2. How do triggers affect performance?
Triggers can impact performance because they execute automatically on DML operations (INSERT, UPDATE, DELETE)
Factors affecting performance:
1. Frequency of firing: Triggers on heavily updated tables can add overhead
2. Complexity of trigger code: Loops, queries, or heavy PL/SQL logic inside triggers slow down DML
3. Row vs. statement triggers:
o Row-level triggers (FOR EACH ROW) execute for every affected row → heavier load on large updates
o Statement-level triggers execute once per DML statement → lighter impact
3. Row-level vs. statement-level triggers – which is better?
- Row-level: Necessary if you need to examine or modify each row. Slower for bulk operations
- Statement-level: Preferred when you only need to act once per DML statement
Tip: For bulk inserts/updates, minimize row-level triggers to improve performance
4. Can triggers cause blocking or deadlocks?
Yes. Triggers that modify other tables can cause locks
- Avoid triggers that update the same table that fired the trigger (mutating table errors)
- Minimize DML inside triggers, or use compound triggers (Oracle 11g+) to handle row-level changes efficiently
5. What is a mutating table, and how to avoid it?
- A mutating table is the table currently being modified by a DML operation. Accessing it inside a row-level trigger can cause the ORA-04091 error
Avoidance strategies:
1. Use AFTER statement-level triggers to perform queries on the table
2. Use compound triggers to store row changes in a collection and process after all rows are done
6. How can I monitor trigger performance?
1. DBA_TRIGGERS – check triggers on tables
2. DBMS_TRACE / DBMS_SESSION – trace trigger execution
3. SQL Monitoring – check if triggers contribute to slow DML
4. Use AUTOTRACE in SQL*Plus to measure additional cost of trigger execution
7. Best practices for performance optimization
- Only use triggers when necessary – don’t replace application logic blindly
- Keep trigger code minimal; avoid complex queries or loops
- Prefer statement-level triggers when possible
- Use compound triggers to avoid mutating table problems efficiently
- Avoid recursive triggers (a trigger that fires another trigger)
- Consider instead-of triggers on views for selective logic, but monitor performance
8. Common performance issues
- Bulk DML on tables with row-level triggers → slow
- Triggers performing SELECT or INSERT/UPDATE on large tables → heavy I/O
- Recursive triggers causing excessive CPU usage
- Complex logic or PL/SQL functions inside triggers → hidden latency