Remote SQL generation and global optimization in federated databases
For a federated database query that uses relational nicknames, the access strategy might involve breaking down the original query into a set of remote query units and then combining the results. Such remote SQL generation helps to produce a globally optimized access strategy for a query.
The optimizer uses the output of pushdown analysis to decide whether each operation is to be evaluated locally at the Db2® server or remotely at a data source. It bases its decision on the output of its cost model, which includes not only the cost of evaluating the operation, but also the cost of shipping the data and messages between the Db2 server and the remote data source.
Server options that affect global optimization
- Relative ratio of processing speed
Use the CPU_RATIO server option to specify how fast or slow the processing speed at the data source should be relative to the processing speed at the Db2 server. A low ratio indicates that the processing speed at the data source is faster than the processing speed at the Db2 server; in this case, the Db2 optimizer is more likely to consider pushing processor-intensive operations down to the data source.
- Relative ratio of I/O speed
Use the IO_RATIO server option to specify how fast or slow the system I/O speed at the data source should be relative to the system I/O speed at the Db2 server. A low ratio indicates that the I/O speed at the data source is faster than the I/O speed at the Db2 server; in this case, the Db2 optimizer is more likely to consider pushing I/O-intensive operations down to the data source.
- Communication rate between the Db2 server and the data
source
Use the COMM_RATE server option to specify network capacity. Low rates, which indicate slow network communication between the Db2 server and a data source, encourage the Db2 optimizer to reduce the number of messages that are sent to or from this data source. If the rate is set to 0, the optimizer creates an access plan that requires minimal network traffic.
- Data source collating sequence
Use the COLLATING_SEQUENCE server option to specify whether a data source collating sequence matches the local Db2 database collating sequence. If this option is not set to Y, the Db2 optimizer considers any data that is retrieved from this data source as being unordered.
- Remote plan hints
Use the PLAN_HINTS server option to specify that plan hints should be generated or used at a data source. By default, the Db2 server does not send any plan hints to the data source.
Plan hints are statement fragments that provide extra information to the optimizer at a data source. For some queries, this information can improve performance. The plan hints can help the optimizer at a data source to decide whether to use an index, which index to use, or which table join sequence to use.
If plan hints are enabled, the query that is sent to the data source contains additional information. For example, a statement with plan hints that is sent to an Oracle optimizer might look like this:
The plan hint is the string:select /*+ INDEX (table1, t1index)*/ col1 from table1
/*+ INDEX (table1, t1index)*/
- Information in the Db2 optimizer knowledge
base
The Db2 server has an optimizer knowledge base that contains data about native data sources. The Db2 optimizer does not generate remote access plans that cannot be generated by specific database management systems (DBMSs). In other words, the Db2 server avoids generating plans that optimizers at remote data sources cannot understand or accept.
Nickname characteristics that affect global optimization
- Index considerations
To optimize queries, the Db2 server can use information about indexes at data sources. For this reason, it is important that the available index information be current. Index information for a nickname is initially acquired when the nickname is created. Index information is not collected for view nicknames.
- Creating index specifications on nicknamesYou can create an index specification for a nickname. Index specifications build an index definition (not an actual index) in the catalog for the Db2 optimizer to use. Use the CREATE INDEX SPECIFICATION ONLY statement to create index specifications. The syntax for creating an index specification on a nickname is similar to the syntax for creating an index on a local table. Consider creating index specifications in the following circumstances:
- When the Db2 server cannot retrieve any index information from a data source during nickname creation
- When you want an index for a view nickname
- When you want to encourage the Db2 optimizer to use a specific nickname as the inner table of a nested-loop join. You can create an index on the joining column, if none exists.
Before you issue CREATE INDEX statements against a nickname for a view, consider whether you need one. If the view is a simple SELECT on a table with an index, creating local indexes on the nickname to match the indexes on the table at the data source can significantly improve query performance. However, if indexes are created locally over a view that is not a simple SELECT statement, such as a view that is created by joining two tables, query performance might suffer. For example, if you create an index over a view that is a join between two tables, the optimizer might choose that view as the inner element in a nested-loop join. The query will perform poorly, because the join is evaluated several times. An alternate approach is to create nicknames for each of the tables that are referenced in the data source view, and then to create a local view at the Db2 server that references both nicknames.
- Catalog statistics considerations
System catalog statistics describe the overall size of nicknames and the range of values in associated columns. The optimizer uses these statistics when it calculates the least-cost path for processing queries that contain nicknames. Nickname statistics are stored in the same catalog views as table statistics.
Although the Db2 server can retrieve the statistical data that is stored at a data source, it cannot automatically detect updates to that data. Furthermore, the Db2 server cannot automatically detect changes to the definition of objects at a data source. If the statistical data for-or the definition of-an object has changed, you can:- Run the equivalent of a RUNSTATS command at the data source, drop the current nickname, and then recreate it. Use this approach if an object's definition has changed.
- Manually update the statistics in the SYSSTAT.TABLES catalog view. This approach requires fewer steps, but it does not work if an object's definition has changed.