+ -
当前位置:首页 → 问答吧 → SQL语句执行特别慢

SQL语句执行特别慢

时间:2011-12-12

来源:互联网

业务如下:
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,如果不匹配到表C中的三个电话字段去匹配,只要有一个电话匹配,即输出该条数据

以表A中电话循环。
※电话字段不是表中的主键

源代码如下:数据一共10万条,运行超20秒, 请大家帮忙看看
——————————————————————————————
SELECT *
FROM @CustomerDt --用户自定义表类型
  WHERE EXISTS (SELECT 1
  FROM KH_QZKH
  WHERE ISDEL = 0
  AND (KH_QZKH.MOBILEPHONE1 = [联系方式1]
  OR KH_QZKH.MOBILEPHONE2 = [联系方式1]
  OR KH_QZKH.MOBILEPHONE3 = [联系方式1]  
  OR KH_QZKH.FIXPHONE1 = [联系方式1]
  OR KH_QZKH.FIXPHONE2 = [联系方式1]
  OR KH_QZKH.FIXPHONE3 = [联系方式1]
   
  OR KH_QZKH.MOBILEPHONE1 = 联系方式2
  OR KH_QZKH.MOBILEPHONE2 = 联系方式2
  OR KH_QZKH.MOBILEPHONE3 = 联系方式2
  OR KH_QZKH.FIXPHONE1 = 联系方式2
  OR KH_QZKH.FIXPHONE2 = 联系方式2
  OR KH_QZKH.FIXPHONE3 = 联系方式2
   
  OR KH_QZKH.MOBILEPHONE1 = 联系方式3
  OR KH_QZKH.MOBILEPHONE2 = 联系方式3
  OR KH_QZKH.MOBILEPHONE3 = 联系方式3
  OR KH_QZKH.FIXPHONE1 = 联系方式3
  OR KH_QZKH.FIXPHONE2 = 联系方式3
  OR KH_QZKH.FIXPHONE3 = 联系方式3)

  OR EXISTS (SELECT 1
  FROM CUSTOMER
  WHERE [联系方式1(*)] = CUSTOMER.MOBILEPHONE1
  OR [联系方式1(*)] = CUSTOMER.MOBILEPHONE2
  OR [联系方式1(*)] = CUSTOMER.MOBILEPHONE3
  OR [联系方式1(*)] = CUSTOMER.FIXPHONE1
  OR [联系方式1(*)] = CUSTOMER.FIXPHONE2
  OR [联系方式1(*)] = CUSTOMER.FIXPHONE3  
   
  OR 联系方式2 = CUSTOMER.MOBILEPHONE1
  OR 联系方式2 = CUSTOMER.MOBILEPHONE2
  OR 联系方式2 = CUSTOMER.MOBILEPHONE3
  OR 联系方式2 = CUSTOMER.FIXPHONE1
  OR 联系方式2 = CUSTOMER.FIXPHONE2
  OR 联系方式2 = CUSTOMER.FIXPHONE3
   
  OR 联系方式3 = CUSTOMER.MOBILEPHONE1
  OR 联系方式3 = CUSTOMER.MOBILEPHONE2
  OR 联系方式3 = CUSTOMER.MOBILEPHONE3
  OR 联系方式3 = CUSTOMER.FIXPHONE1
  OR 联系方式3 = CUSTOMER.FIXPHONE2
  OR 联系方式3 = CUSTOMER.FIXPHONE3
  )

作者: iamheyjudy   发布时间: 2011-12-12

作者: fredrickhu   发布时间: 2011-12-12

(SELECT 1
  FROM KH_QZKH
  WHERE ISDEL = 0
  AND ([联系方式1] in(KH_QZKH.MOBILEPHONE1,KH_QZKH.MOBILEPHONE2,KH_QZKH.MOBILEPHONE3,
  KH_QZKH.FIXPHONE1,KH_QZKH.FIXPHONE2,KH_QZKH.FIXPHONE3)
....
)
改成这样的试试

作者: ssp2009   发布时间: 2011-12-12

引用 2 楼 ssp2009 的回复:
(SELECT 1
FROM KH_QZKH
WHERE ISDEL = 0
AND ([联系方式1] in(KH_QZKH.MOBILEPHONE1,KH_QZKH.MOBILEPHONE2,KH_QZKH.MOBILEPHONE3,
KH_QZKH.FIXPHONE1,KH_QZKH.FIXPHONE2,KH_QZKH.FIXPHONE3)
....
)
改成这样……


感谢回答,试了下 效果不明显,还是很忙,10万条大约20左右

作者: iamheyjudy   发布时间: 2011-12-12

你应该把这些不同的电话字段,放在一个临时表里
SQL code
select id,电话1 as 电话 into #tb from tb
union all
select id,电话2 from tb
union all
select id,电话3 from tb

然后用#tb的电话字段去对比,避免使用or

作者: ssp2009   发布时间: 2011-12-12

引用 4 楼 ssp2009 的回复:
你应该把这些不同的电话字段,放在一个临时表里

SQL code

select id,电话1 as 电话 into #tb from tb
union all
select id,电话2 from tb
union all
select id,电话3 from tb

然后用#tb的电话字段去对比,避免使用or


您再帮我写详细点

作者: iamheyjudy   发布时间: 2011-12-12

SQL code

SELECT *
FROM @CustomerDt a
inner join KH_QZKH b1
on a.[联系方式1] in (b1.MOBILEPHONE1,b1.MOBILEPHONE2,b1.MOBILEPHONE3,b1.FIXPHONE1,b1.FIXPHONE2,b1.FIXPHONE3)
and b.ISDEL=0
inner join KH_QZKH b2
on a.[联系方式2] in (b2.MOBILEPHONE1,b2.MOBILEPHONE2,b2.MOBILEPHONE3,b2.FIXPHONE1,b2.FIXPHONE2,b2.FIXPHONE3)
and b.ISDEL=0
inner join KH_QZKH b3
on a.[联系方式3] in (b3.MOBILEPHONE1,b3.MOBILEPHONE2,b3.MOBILEPHONE3,b3.FIXPHONE1,b3.FIXPHONE2,b3.FIXPHONE3)
and b.ISDEL=0
inner join CUSTOMER c1
on a.[联系方式1] in (c1.MOBILEPHONE1,c1.MOBILEPHONE2,c1.MOBILEPHONE3,c1.FIXPHONE1,c1.FIXPHONE2,c1.FIXPHONE3)
inner join CUSTOMER c2
on a.[联系方式1] in (c2.MOBILEPHONE1,c2.MOBILEPHONE2,c2.MOBILEPHONE3,c2.FIXPHONE1,c2.FIXPHONE2,c2.FIXPHONE3)
inner join CUSTOMER c3
on a.[联系方式1] in (c3.MOBILEPHONE1,c3.MOBILEPHONE2,c3.MOBILEPHONE3,c3.FIXPHONE1,c3.FIXPHONE2,c3.FIXPHONE3)

作者: ap0405140   发布时间: 2011-12-12