我的最终目标...匹配家用电话,手机或办公电话的行中的SELECT
所有字段qry1
tbl2
这是我当前的“失败” SQL语法。通过失败,我的意思是10到15分钟后执行还没有完成,而每个人(独立地)加入的时间都在一到两分钟之内。
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON ((qry1.CellPhone = tbl2.CellPhone) OR (qry1.HomePhone = tbl2.HomePhone) OR (qry1.WorkPhone = tbl2.WorkPhone));
问题:我的SQL语法是否有错误?有更好的方法来完成我的任务吗?对我来说,简单地独立运行3个(家庭,工作,单元格)JOIN查询,然后对它们进行UNION,然后在必要时进行重复数据删除是否更有意义?
如果单个联接的工作速度很快,则复合OR条件可能会很慢,因为它不能使用单个索引,而单个条件可以为三个联接条件分别使用单个索引。因为它不能使用一个索引,所以它可能正在执行非索引的顺序表扫描。(您应该研究查询计划,以便了解优化器的实际作用。)
因此,鉴于单个查询的运行速度相当快,因此,使用UNION可以显着提高性能(除非DBMS中的优化器存在盲点):
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.CellPhone = tbl2.CellPhone
UNION
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.HomePhone = tbl2.HomePhone
UNION
SELECT qry1.* FROM qry1 INNER JOIN tbl2 ON qry1.WorkPhone = tbl2.WorkPhone
那应该给您大约3个独立查询一样快的结果。它不会那么快,因为UNION会执行重复消除(当然,单个查询不会消除)。您可以使用UNION ALL,但是如果两个表中有很多行,其中两对或三对字段匹配,则可能导致结果重复很多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句