我想用注释掉的 LEFT JOIN 来扩展以下查询。但是,这些行使查询明显变慢。
该查询用于 API 以通过电话号码查找用户 ID,并且需要快速处理。那么,有没有比使用不同的 ON 子句加入同一个表两次更高效的替代方法?
set statistics time on
SELECT
ivr.ID
FROM ivr
LEFT OUTER JOIN ADDR_MASTER am1
ON am1.ID = ivr.ID
AND am1.ADDR_TYPE = 'WORK' --WORK PHONE (only adds 35ms to lookup time)
--LEFT OUTER JOIN ADDR_MASTER am2
-- ON am2.ID = ivr.ID
-- AND am2.ADDR_TYPE = 'HOME' --HOME PHONE (fallback if not in IVR, adds 100+ ms :(
WHERE (PHONE1 = '0123456789'
OR PHONE2 = '0123456789'
OR PHONE3 = '0123456789'
OR am1.PHONE = '0123456789'
--OR am2.PHONE = '0123456789'
)
set statistics time off
以下是计划:
我认为这会满足您的要求。
也就是说,您可以做一些不同的事情。
这可能会更好,不确定,但只要它不慢,它可能更容易维护。
现在,假设您实际上只需要 ivr.ID(至少不需要 ADDR_MASTER 中的任何内容),您可以这样做:
我会尝试各种组合,看看哪种组合实际上更快。
重构表会更容易。电话号码应该在一个单独的相关表中,而不是在地址表中(如需要多个电话字段所示),像这样(简化为示例 - 传真机、手机、Peferred # 的标志,始终是应答机器,下午 6 点后不再接听电话等):
如果您希望所有电话与地址相关联,请通过 AddrId 进入。当您想要所有与电话号码关联的地址时,请按电话号码进入。并且与地址关联的电话数量实际上是无限的,而不是仅限于为此目的指定的列数。