Suggestions for improving fragmentation
You can improve fragmentation for optimal performance in decision-support and OLTP queries.
The following suggestions are guidelines for fragmenting tables
and indexes:
- For optimal performance in decision-support queries, fragment the table to increase parallelism, but do not fragment the indexes. Detach the indexes, and place them in a separate dbspace.
- For best performance in OLTP queries, use fragmented indexes to
reduce contention between sessions. You can often fragment an index
by its key value, which means the OLTP query only has to look at one
fragment to find the location of the row.
If the key value does not reduce contention, as when every user looks at the same set of key values (for instance, a date range), consider fragmenting the index on another value used in the WHERE clause. To cut down on fragment administration, consider not fragmenting some indexes, especially if you cannot find a good fragmentation expression to reduce contention.
- Use round-robin fragmentation on data when the table is read sequentially by decision-support queries. Round-robin fragmentation is a good method for spreading data evenly across disks when no column in the table can be used for an expression-based fragmentation scheme. However, in most DSS queries, all fragments are read.
- To reduce the total number of required dbspaces and decrease the time needed for searches, you can store multiple named fragments within the same dbspace.
- If you are using expressions, create them so that I/O requests, rather than quantities of data, are balanced across disks. For example, if the majority of your queries access only a portion of data in the table, set up your fragmentation expression to spread active portions of the table across disks, even if this arrangement results in an uneven distribution of rows.
- Keep fragmentation expressions simple. Fragmentation expressions can be as complex as you want. However, complex expressions take more time to evaluate and might prevent fragments from being eliminated from queries.
- Arrange fragmentation expressions so that the most restrictive
condition for each dbspace is tested within the expression first.
When the database server tests a value against the criteria for a
given fragment, evaluation stops when a condition for that fragment
tests false. Thus, if the condition that is most likely to be false
is placed first, fewer conditions need to be evaluated before the
database server moves to the next fragment. For example, in the following
expression, the database server tests all six of the inequality conditions
when it attempts to insert a row with a value of
25
:x >= 1 and x <= 10 in dbspace1, x > 10 and x <= 20 in dbspace2, x > 20 and x <= 30 in dbspace3
By comparison, only four conditions in the following expression need to be tested: the first inequality for dbspace1
(x <= 10)
, the first for dbspace2(x <= 20
), and both conditions for dbspace3:x <= 10 and x >= 1 in dbspace1, x <= 20 and x > 10 in dbspace2, x <= 30 and x > 20 in dbspace3
- Avoid any expression that requires a data-type conversion. Type conversions increase the time to evaluate the expression. For instance, a DATE data type is implicitly converted to INTEGER for comparison purposes.
- Do not fragment on columns that change frequently unless you are willing to incur the administration costs. For example, if you fragment on a date column and older rows are deleted, the fragment with the oldest dates tends to empty, and the fragment with the recent dates tends to fill up. Eventually you must drop the old fragment and add a new fragment for newer orders.
- Do not fragment every table. Identify the critical tables that are accessed most frequently. Put only one fragment for a table on a disk.
- Do not fragment small tables. Fragmenting a small table across many disks might not be worth the overhead of starting all the scan threads to access the fragments. Also, balance the number of fragments with the number of processors on your system.
- When you define a fragmentation strategy on an unfragmented table, check the next-extent size to ensure that you are not allocating large amounts of disk space for each fragment.