编辑:我不知道为什么讨厌这个问题,但也许是因为我的问题混乱。我故意使用/*+ 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;
答案 0 :(得分:5)
呃,你正在指定ordered
提示。如documentation:
ORDERED提示使Oracle按顺序连接表 它们出现在FROM子句中。
通常,Oracle(或任何其他优化器)会找到join
的最佳排序,因此from
子句中的排序无关紧要。但是使用ordered
提示,您指定了连接的顺序。因此,更改from
子句中表的顺序会对执行产生很大影响。
顺便说一下,您应该学会使用现代的,明确的join
语法。
答案 1 :(得分:2)
你有一个+ ORDERED优化器提示。
http://docs.oracle.com/cd/B10500_01/server.920/a96533/hintsref.htm#5555
ORDERED提示使Oracle按照它们在FROM子句中出现的顺序连接表。
为了完全理解这个问题,我建议您阅读一本数据库书籍,特别是有关搜索和加入算法的章节以及查询优化的章节。
例如,在嵌套循环连接算法中,我们将较大的表放在外循环中,将较小的表放在内循环中。这样我们就可以减少磁盘访问量。
外部循环仅加载相同的数据一次,内部加载相同的数据多次。这就是为什么我们在外循环中迭代更大的表。