SQL Anywhere uses statistical information to determine the most efficient strategy for executing each statement. SQL Anywhere automatically gathers and updates these statistics. These statistics are stored permanently in the database in the system table ISYSCOLSTAT. Statistics gathered while processing one statement are available when searching for efficient ways to execute subsequent statements.
Occasionally, the statistics may become inaccurate or relevant statistics may be unavailable. This condition is most likely to arise when few queries have been executed since a large amount of data was added, updated, or deleted. In this situation, you may want to execute CREATE STATISTICS.
If there are problems with a particular execution plan, you can use optimizer hints to require that a particular index be used. For more information, see FROM clause.
In unusual circumstances, however, these measures may prove ineffective. In such cases, you can sometimes improve performance by supplying explicit selectivity estimates.
For each table in a potential execution plan, the optimizer must estimate the number of rows that will be part of the result set. If you know that a condition has a success rate that differs from the optimizer's estimate, you can explicitly supply a user estimate in the search condition.
The estimate is a percentage. It can be a positive integer or can contain fractional values.
Whenever possible, avoid supplying explicit estimates in statements that are to be used on an ongoing basis. Should the data change, the explicit estimate may become inaccurate and may force the optimizer to select poor plans. If you do use explicit selectivity estimates, ensure that the number is accurate. Do not, for example, supply values of 0% or 100% to force the use of an index.
You can disable user estimates by setting the database option user_estimates to Off. The default value for user_estimates is Override-Magic, which means that user-supplied selectivity estimates are used only when the optimizer would use a MAGIC (default) selectivity value for the condition. The optimizer uses MAGIC values as a last resort when it is unable to accurately predict the selectivity of a predicate.
For more information about disabling user-defined selectivity estimates, see user_estimates option [database].
For more information about statistics, see Optimizer estimates and column statistics.
The following query provides an estimate that one percent of the ShipDate values will be later than 2001/06/30:
SELECT ShipDate FROM SalesOrderItems WHERE ( ShipDate > '2001/06/30', 1 ) ORDER BY ShipDate DESC
The following query estimates that half a percent of the rows will satisfy the condition:
SELECT * FROM Customers c, SalesOrders o WHERE (c.ID = o.CustomerID, 0.5)
Fractional values enable more accurate user estimates for joins, particularly for large tables.