为什么更改 FROM 子句中表的顺序会使 SQL 执行时间不同



编辑:我不知道为什么讨厌这个问题,但也许是因为对我的问题感到困惑。我特意使用 /*+ ORDERED */ 来控制执行顺序,并更改 FROM 子句中表的顺序。我想知道为什么执行时间可以改变。是因为加入顺序吗?是因为桌子大小吗?希望这能消除混乱。

所以我只是在玩SQL查询,并意识到以下内容:如果我更改FROM子句中表的顺序,执行时间可能会非常不同。以下查询在大约 0.966 秒内运行。但是,如果我OrderDetails d移动到FROM子句的最后一个,则执行时间仅为 0.573 秒!这背后有什么原因吗?我正在使用 ORACLE SQL Developer

SELECT /*+ ORDERED */
    su.CompanyName, CategoryName, ProductName, c.CompanyName, c.country,
    FirstName, LastName, Quantity, d.UnitPrice, sh.CompanyName
FROM 
    OrderDetails d, Suppliers su, Shippers sh, Categories t, Products p,
    Employees e, Customers c, orders o
WHERE 
    t.CategoryID = p.CategoryID 
    AND c.CustomerID = o.CustomerID 
    AND e.EmployeeID = o.EmployeeID 
    AND o.OrderID = d.OrderID 
    AND p.ProductID = d.ProductID 
    AND sh.ShipperID = o.ShipVia 
    AND su.SupplierID = p.SupplierID 
    AND LOWER(ProductName) Like '%lager%' 
    AND LOWER(c.city) IN ('vancouver', 'london', 'charleroi', 'cunewalde') 
    AND d.Quantity BETWEEN 5 AND 100 
    AND (RequiredDate-ShippedDate > 10)
ORDER BY 
    c.CompanyName;

呃,您正在指定ordered提示。 如文档中所述:

ORDERED 提示使 Oracle 按以下顺序联接表 它们出现在 FROM 子句中。

通常,Oracle (或任何其他优化器)会找到 join s 的最佳排序,因此 from 子句中的排序无关紧要。但是,使用ordered提示,您可以指定连接的顺序。 因此,更改 from 子句中表的顺序会对执行产生重大影响。

顺便说一下,你应该学会使用现代的、明确的join语法。

您有一个 + 有序优化器提示。

http://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5555

ORDERED 提示使 Oracle 按照表在 FROM 子句中出现的顺序联接表。

为了充分理解这个问题,我建议阅读一本数据库书,特别是搜索和连接的算法章节以及查询优化的章节。

例如,在嵌套循环连接算法中,我们将较大的表放在外部循环中,将较小的表放在内部循环中。这样,我们获得的磁盘访问次数就会减少。

外部循环仅加载一次相同的数据

,内部循环多次加载相同的数据。这就是我们在外循环中迭代较大表的原因。

最新更新