Choosing an optimization class

Setting the optimization class can provide some of the advantages of explicitly specifying optimization techniques.

This is true, particularly when:
  • Managing very small databases or very simple dynamic queries
  • Accommodating memory limitations on your database server at compile time
  • Reducing query compilation time; for example, during statement preparation

Most statements can be adequately optimized with a reasonable amount of resource by using the default optimization class 5. Query compilation time and resource consumption are primarily influenced by the complexity of a query; in particular, by the number of joins and subqueries. However, compilation time and resource consumption are also affected by the amount of optimization that is performed.

Query optimization classes 1, 2, 3, 5, and 7 are all suitable for general use. Consider class 0 only if you require further reductions in query compilation time, and the SQL and XQuery statements are very simple.

Tip: To analyze a long-running query, run the query with db2batch to determine how much time is spent compiling and executing the query. If compilation time is excessive, reduce the optimization class. If execution time is a problem, consider a higher optimization class.
When you select an optimization class, consider the following general guidelines:
  • Start by using the default query optimization class 5.
  • When choosing a class other than the default, try class 1, 2, or 3 first. Classes 0, 1, and 2 use the greedy join enumeration algorithm.
  • Use optimization class 1 or 2 if you have many tables with many join predicates on the same column, and if compilation time is a concern.
  • Use a low optimization class (0 or 1) for queries that have very short run times of less than one second. Such queries tend to:
    • Access a single table or only a few tables
    • Fetch a single row or only a few rows
    • Use fully qualified and unique indexes
    • Be involved in online transaction processing (OLTP)
  • Use a higher optimization class (3, 5, or 7) for queries that have longer run times of more than 30 seconds.
  • Class 3 or higher uses the dynamic programming join enumeration algorithm, which considers many more alternative plans, and might incur significantly more compilation time than classes 0, 1, or 2, especially as the number of tables increases.
  • Use optimization class 9 only if you have extraordinary optimization requirements for a query.
Complex queries might require different amounts of optimization to select the best access plan. Consider using higher optimization classes for queries that have:
  • Access to large tables
  • A large number of views
  • A large number of predicates
  • Many subqueries
  • Many joins
  • Many set operators, such as UNION or INTERSECT
  • Many qualifying rows
  • GROUP BY and HAVING operations
  • Nested table expressions

Decision support queries or month-end reporting queries against fully normalized databases are good examples of complex queries for which at least the default query optimization class should be used.

Use higher query optimization classes for SQL and XQuery statements that were produced by a query generator. Many query generators create inefficient queries. Poorly written queries require additional optimization to select a good access plan. Using query optimization class 2 or higher can improve such queries.

For SAP applications, always use optimization class 5. This optimization class enables many Db2® features optimized for SAP, such as setting the DB2_REDUCED_OPTIMIZATION registry variable.

In a federated database, the optimization class does not apply to the remote optimizer.