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.contactId
的 contacts.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 条件。
我有一个连接查询没有使用最匹配的索引,我正在寻求帮助来纠正这个问题。
我有以下查询:
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.contactId
的 contacts.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 条件。