编辑:我不知道为什么讨厌这个问题,但可能是因为我的问题很困惑。我特意使用 /*+ ORDERED */
来控制执行顺序并更改 FROM
子句中表的顺序。我想知道为什么执行时间会改变。是因为加入顺序吗?是因为 table 的大小吗?希望这能消除困惑。
所以我只是在玩弄 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
提示。如 documentation 中所述:
The ORDERED hint causes Oracle to join tables in the order in which they appear in the FROM clause.
通常,Oracle(或任何其他优化器)会为 join
找到最佳顺序,因此 from
子句中的顺序无关紧要。但是使用 ordered
提示,您可以指定连接的顺序。因此,更改 from
子句中表的顺序会对执行产生重大影响。
顺便说一句,您应该学习使用现代的、显式的 join
语法。
关于sql - 为什么在 FROM 子句中改变表的顺序会使 SQL 执行时间不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28933353/