在某些情况下,您可以在SQL语句中指定连接顺序提示,这样它就不会访问对结果没有影响的行。
联接中的驱动表是与其他表联接的表。通常,驱动表包含过滤条件,该条件消除了表中行的最高百分比。该连接顺序可以对SQL语句的性能有显著的影响。
请考虑以下准则:
- 当索引更有效地检索请求的行时,请避免进行全表扫描。
- 当您可以使用另一个获取少量行的索引时,请避免使用从驱动表中获取许多行的索引。
- 选择连接顺序,以便稍后在连接顺序中将较少的行连接到表。
以下示例显示了如何有效地调整连接顺序:
SELECT *
FROM taba a,
tabb b,
tabc c
WHERE a.acol BETWEEN 100 AND 200
AND b.bcol BETWEEN 10000 AND 20000
AND c.ccol BETWEEN 10000 AND 20000
AND a.key1 = b.key1
AND a.key2 = c.key2;- 选择行驶表和行驶索引(如果有)。
上一个示例中的前三个条件中的每个条件都是一个过滤条件,适用于单个表。最后两个条件是联接条件。
过滤条件决定着驱动表和索引的选择。通常,驱动表包含消除最高行百分比的过滤条件。因为100到200的范围比的范围窄
acol,但是10000和20000的范围相对较大,taba所以在驱动表中,其他所有条件都相等。对于嵌套循环联接,联接通过联接索引发生,联接索引是用于将表连接到联接树中较早的表的主键或外键上的索引。除了行驶表之外,很少在非联接条件下使用索引。因此,在
taba被选为驱动表之后,分别使用onb.key1和index 分别c.key2驱动到tabb和tabc。 - 选择最佳的连接顺序,尽早驱动最佳的未使用过滤器。
您可以通过首先使用尚未使用的最佳过滤器联接到表来减少以下联接的工作。因此,如果
bcol BETWEEN比()限制更严格(拒绝更高的行数)ccol BETWEEN,则如果tabb在before之前进行连接,则最后一个联接变得更容易(行数更少)tabc。 - 您可以使用
ORDERED或STAR提示来强制加入顺序。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




