+ -
当前位置:首页 → 问答吧 → 存储过程中利用游标做判断 执行速度慢

存储过程中利用游标做判断 执行速度慢

时间:2011-12-10

来源:互联网

业务如下:
从表A中取得电话字段到表B中的三个电话字段去匹配,只要表B中有一个电话匹配,即输出该条数据,以表A中电话循环。
※电话字段不是两表中的主键

以下存储过程,执行特别慢,请大家帮忙看看,数据量大约几万条左右。是通过游标,在游标中到表中的去匹配

ALTER PROCEDURE [dbo].[BatchImportChkReptBabyInfo2]
@CustomerDt JetImportCustomers READONLY
AS

BEGIN
--****************定义临时表,用于返回用****************
  CREATE TABLE #TEMPCUSTOMER (  
  VAR_EXISTTYPE INT NULL)
  --****************定义变量****************
  --联系方式1
  DECLARE
  @VAR_MotherTel VARCHAR(20)
  = NULL ;
  --联系方式2
  DECLARE
  @VAR_FatherTel VARCHAR(20)
  = NULL ;
  --联系方式3
  DECLARE
  @VAR_OtherTel VARCHAR(20)
  = NULL ;
  DECLARE
  @VAR_EXISTTYPE INT
  = 0 ;
  DECLARE
  @VAR_EXISTCNT INT
  = 0 ;  
  DECLARE
  @VAR_EXISTTOTALCNT INT
  = 0 ;  
   
  DECLARE CUSTOMER_CURSOR CURSOR FOR
  SELECT MOBILEPHONE1,MOBILEPHONE2,MOBILEPHONE3
  FROM KH_QZKH
  OPEN CUSTOMER_CURSOR
  FETCH NEXT FROM CUSTOMER_CURSOR
  INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
  WHILE (@@FETCH_STATUS = 0)
  BEGIN
  IF (ISNULL(@VAR_MotherTel,'') <> '')
  BEGIN
  SELECT @VAR_EXISTCNT = count(CUSTOMERUID)
  FROM KH_QZKH
  WHERE ISDEL = 0
  AND (MOBILEPHONE1 = @VAR_MotherTel)
  IF (@VAR_EXISTCNT > 0)
  BEGIN
  SET @VAR_EXISTTYPE = 11
  ;
  --返回值
  SET @VAR_EXISTTOTALCNT = @VAR_EXISTTOTALCNT + 1
  ;
  END  
  END  
  --插入到临时表中
  INSERT INTO #TEMPCUSTOMER
  VALUES (@VAR_EXISTTYPE)
  FETCH NEXT FROM CUSTOMER_CURSOR
  INTO @VAR_MotherTel,@VAR_FatherTel,@VAR_OtherTel
  END
  CLOSE CUSTOMER_CURSOR
  DEALLOCATE CUSTOMER_CURSOR
  --返回@CustomerDt
  SELECT  
  VAR_EXISTTYPE AS EXISTTYPE
FROM #TEMPCUSTOMER
  DROP TABLE #TEMPCUSTOMER  
   
  return @VAR_EXISTTOTALCNT;
END
 

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

不要用游标了
select * from 表A a
 where exists(select 1 from 表B where 电话1=a.电话 or 电话2=a.电话 or 电话3=a.电话)

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

樓主的游標部分代碼的邏輯很奇怪耶,
 1.變量@VAR_FatherTel,@VAR_OtherTel在游標循環中未使用?
 2.插入臨時表#TEMPCUSTOMER的@VAR_EXISTTYPE,每次循環前都未初始化?
 3.變量@VAR_MotherTel的值來自MOBILEPHONE1,為何還需要MOBILEPHONE1=@VAR_MotherTel?

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