在大多数情况下,优化器选择最快的查询计划。 由于查询较为复杂或者因为查询没有足够的数据特性相关信息而导致优化器没有选择最佳的查询计划来执行查询时,那么可以使用优化器伪指令。查询计划不佳将导致性能不佳。
在您决定何时使用优化器伪指令之前,您应该了解什么是好的查询计划。
优化器是根据不同的表访问路径、连接顺序和连接计划的成本来创建查询计划。
SELECT * FROM customer WHERE STATE <> "ALASKA";
假定客户在所有的 50 个州中均匀分布,那么您可能估计数据库服务器必须读取表的 98%。当数据库服务器必须读取大多数行时,对表进行顺序读取要比遍历索引(并随后遍历数据页面)效率更高。
SELECT * FROM customer WHERE state = "NEW YORK" AND order_date = "01/20/97"
假定有 200,000 个客户住在纽约并且每天只有 1000 个客户订购,那么优化器最有可能选择 order_date 索引而不选择 state 索引来执行查询。
SELECT * FROM customer, orders WHERE customer.customer_num = orders.customer_num AND customer.state = "NEVADA";
在此示例,如果您首先读取 customer 表,那么可以通过应用选择了满足 state = "NEVADA" 的所有行的过滤器来排除大多数的行。
通过排除 customer 表中的行,数据库服务器将不读取 orders 表(该表可能要比 customer 表大得多)中的那么多行。
在前面的示例中,如果 customer.customer_num 和 orders.customer_num 没有索引,那么散列连接可能是最佳的连接计划。