Query execution plans play a crucial role in identifying
performance bottlenecks within an IBM Db2 database. When a query is executed,
the database optimizer determines the most efficient way to retrieve the
requested data by generating a query execution plan. It does this by parsing SQL requests and turning them into actionable commands for accessing and modifying data.
So the query execution plan outlines the
steps and operations involved in executing the query, including accessing
tables, applying filters, joining data, and performing sorting or aggregations.
Understanding query execution plans is important because they reveal the inner workings of how Db2 will process the query. And they also highlight areas
where performance can be improved if you understand the various ways that data can be processed by Db2. By analyzing query execution plans, you can identify potential inefficiencies and take
proactive steps to optimize queries for better performance.
For example, one high-level performance tuning step that you can identify using a query execution plan is to find table (space) scans that would be better off using an index instead.
But how can you review and analyze query execution plans? Perhaps the first method used by most folks is to examine the Plan Tables. A lot of information is contained in the PLAN_TABLE. The PLAN_TABLE is simply a specific table used by the EXPLAIN command to populate information about the choices made by the Db2 Optimizer when it formulates a query execution plan. The information in the PLAN_TABLE provides detailed information about the access paths chosen, join strategies employed, and other relevant details that impact query performance.
As long as EXPLAIN YES is specified when you bind your program, or you explicitly issue an EXPLAIN PLAN statement, information about the query execution plan will be placed in the PLAN_TABLE.
So, after the optimizer creates the access paths and populates the PLAN_TABLE with data representing those access paths, you will need to examine the results to determine if everything is satisfactory. Many questions can be answered by analyzing the results of EXPLAIN – questions like:
- if we are joining what type of join is used (NLJ, MS, Hybrid),
- was an index used, and if so how many columns matched,
- are we doing a scan, and if so what type of scan (full or page range)
- is prefetch being used, and if so what type (sequential, list)
- was a hint used
- was parallelism used, and if so what degree and type
- was a sort required, and if so why (Join, Unique, Group By, Order By)
- what type of locking is required
And that just covers the main PLAN_TABLE. There are actually many other explain tables available that, if created, will be populated by EXPLAIN. But that is beyond the scope of this high-level tip, which is already becoming rather lengthy.
There are also several additional tools and techniques that can be used to analyze Db2 query execution plans. One commonly used tool is Visual Explain, which provides a graphical representation of the query execution plan. Many tuners prefer a visual approach to revieing and tuning access paths. Visual Explain allows users to visualize the flow of data, understand the order
in which operations are performed, and identify potential performance
Visual Explain is a feature of the free IBM Data Studio tool, as well as the new Db2 Administration Foundation offering. There are other tools, from other vendors, that also provide a visual Explain capability.
Speaking of which, another technique to analyze query execution plans is to use database monitoring tools. Such tools capture real-time performance
data, including query execution plans, and provide useful performance metrics that can be reviewed and acted upon as needed.
By monitoring the execution plans of frequently executed queries, it is possible to detect patterns, identify resource-intensive
operations, and make informed decisions about query optimization.
A Bit of Guidance
It is wise to always Bind your production programs (that use static SQL) specifying EXPLAIN YES so that you can see the access paths chosen by Db2. This way, you can either check to make sure that no access paths have changed before proceeding to implement changes in production, or at least you have the information available should problems arise after you move code into production.
It can be difficult to determine if any access paths have changed, because you will need the old execution plans to compare to the new ones. For this reason, it is a good idea to keep several versions of access path information for each program.
Additionally, sometimes the program has changed between running EXPLAIN, which can make it challenging to find the exact SQL statements to compare. But you are still better off with older versions than without any historical data.
To optimize query execution plans for better performance, it
is essential to focus on areas such as index usage, join strategies, and
predicate selection. By strategically creating and maintaining appropriate
indexes, rewriting complex queries, and refining predicate conditions, it is
possible to influence the optimizer’s decisions and improve query performance.
Analyzing query execution plans is a vital
step in optimizing the performance of IBM Db2 applications. By using tools
like EXPLAIN and Visual Explain, PLAN_TABLE data, and monitoring tools, it is possible to gain valuable insights into query execution, identify
potential bottlenecks, and enhance overall
By proactively analyzing and optimizing query execution plans,
organizations can achieve faster response times, improved scalability, and a
more efficient database environment.
Be sure to check back here next week when we will address database design as a performance issue.