为查询优化选择索引时,UltraLite 优化程序使用复杂的优化策略。除了简单查询之外,您无法轻易预先确定优化程序用来优化查询性能的索引,或是否使用了某个索引。复杂程度增加时,选择的索引取决于查询所需的子句。在某些情况下,FOR READ ONLY 子句的出现可能导致优化程序选择直接表扫描,而不是选择能提供更好查询性能的索引。
优化查询时,优化程序将查看查询的要求,并检查是否存在可用来提高性能的任何索引。如果使用任何索引都无法提高性能,优化程序将不扫描索引,而是使用临时表或直接页扫描。因此,您可能需要对索引进行试验并经常检查生成的执行计划以确保:
不是在维护优化程序不使用的索引。
将要创建的临时表的数目降到最低。请参见管理临时表。
对于复杂查询,更很难预知要使用哪个索引。例如,如果查询包含 WHERE 谓语,且除了 ORDER BY 子句以外还包含 GROUP BY 子句,则单独的一个索引可能不会满足此查询的搜索条件。因此,如果您创建了一个索引来满足 WHERE 谓语的选择性要求,您可能会发现优化程序实际上并未使用此索引。相反,优化程序可能使用一个为 ORDER BY 条件提供更好性能的索引,因为可能需要更多地处理此子句。
可以通过适当的 API 调用以编程方式检查执行计划,也可以在 Interactive SQL 中的 [计划查看器] 上检查执行计划。
如果未使用索引 执行计划以如下形式出现:
scan(T) |
如果使用临时表 执行计划以如下形式出现:
temp [scan(T)] |
如果使用索引 执行计划包含索引名:
scan (T, index_name) |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |