sql - 为什么在 FROM 子句中改变表的顺序会使 SQL 执行时间不同?

标签 sql oracle

编辑:我不知道为什么讨厌这个问题,但可能是因为我的问题很困惑。我特意使用 /*+ 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/

相关文章:

mysql - 为什么这些查询需要这么长时间?如何修复它?

mysql - 如何在对记录进行编号时使用 MySQL 选择多行?

sql - 如何在 Hive 中删除 External_Table 以及元数据和数据

oracle - ORA-00932 : inconsistent datatypes: expected INTERVAL DAY TO SECOND got CHAR

SQL虚拟列

mysql - 第 1 行出现错误 1064 (42000)

json - 将 JSON 存储在 msSQL 数据库中?

sql-server - 替换 SQL Server 中的 REGEXP_SUBSTR

java - 使用jdbc在Oracle sql中过滤特定日期范围内的数据

oracle - 发现使用 oracle 临时表空间的进程/查询