SQL 在 where on join 时查询错误的索引

SQL query wrong index when where on join

我有一个连接查询没有使用最匹配的索引,我正在寻求帮助来纠正这个问题。

我有以下查询:

select
equipment.name,purchaselines.description,contacts.name,vendors.accountNumber
from purchaselines
left join vendors on vendors.id = purchaselines.vendorId
left join contacts on contacts.id = vendors.contactId
left join equipment on equipment.id = purchaselines.equipmentId
where contacts.id = 12345

table purchaselines 在列 vendorId 上有一个索引,这是要使用的正确索引。当查询是 运行 时,我知道连接到 vendors.contactIdcontacts.id 的值,连接到 purchaselines.vendorId.

运行 这个查询的正确方法是什么?当前,table purchaselines.

上没有使用索引

如果您打算查询特定联系人,我会把它放在第一位,因为这是主要依据。此外,您有 left-joins 给其他 table(供应商、联系人、设备)。因此,通过在 CONTACTS table 中添加一个 WHERE 子句,可以强制等式成为一个 INNER JOIN,因此需要。

也就是说,我会尝试将查询重写为(也使用别名来简化较长 table 名称的可读性)

select
      equipment.name,
      purchaselines.description,
      contacts.name,
      vendors.accountNumber
   from 
      contacts c
         join vendors v
            on c.id = v.contactid
            join purchaselines pl
               on v.id = pl.vendorid
               join equipment e
                  on pl.equipmentid = e.id
   where
      c.id = 12345

另请注意 JOIN 的缩进有助于提高可读性 (IMO) 以查看 how/where 每个 table 以更分层的方式到达下一个。它们都是常规的内部 JOIN 上下文。

因此,客户 ID 将是第一个/最快的,然后是该联系人 ID 的供应商,这应该优化与之的连接。然后,我希望采购行有一个 vendorid 优化索引。最后就是ITPK的装备table

反馈基本 JOIN 说明。

JOIN 只是明确说明两个 table 之间的关系。通过列出它们 left-side 和 right-side 以及显示它们之间关系的连接条件就是全部。

现在,在您的数据示例中,每个 table 随后都嵌套在前一个下。尽管一个 table 可能 link 到多个其他 table 是很常见的。例如一名员工。客户可以使用种族 ID link 进行种族查找 table,而且还可以使用工作职位 ID link 进行工作职位查找 table。这可能看起来像

select
      e.name,
      eth.ethnicity,
      jp.jobPosition
   from
      employee e
         join ethnicitiy eth
            on e.ethnicityid = eth.id
         join jobPosition jp
            on e.jobPositionID = jp.id

请注意,employee table 场景中的 ethnicity 和 jobPosition 处于同一层级。例如,如果您想进一步应用只需要某些类型的员工的条件,您可以直接在连接位置添加逻辑附加条件,例如

     join jobPosition jp
        on e.jobPositionID = jp.id
        AND jp.jobPosition = 'Manager'

这将为您提供一份仅包含担任经理的员工的列表。如果您已经直接将 WHERE 条件包含在 JOIN/ON 条件中,则无需显式添加 WHERE 条件。如果您发现自己需要 LEFT JOIN,这有助于在连接处保持 table-specific 条件。