@SMS_메세지 VARCHAR(2000),
@수신번호 VARCHAR(20),
@발송번호갯수 INT,
@발송번호목록 TEXT
BEGIN
박정아^010-1234-5678|최승현^010-2345-6789|김수영^010-3456-7890|이승우^010-5555-2222|문지현^010-4444-8888|
CREATE TABLE #SMSSEND
SET @SMS_CNT_20 = CEILING(CONVERT(FLOAT,@발송번호갯수) / 20)
SET @SMS_COMMIT_CNT = 0
003. 루프를 돌면서 발송번호 목록을 20개씩 쪼갭니다.
WHILE @SMS_COMMIT_CNT < @SMS_CNT_20
BEGIN
SET @DEST_TEMP =@DEST_TEMP + SUBSTRING(@DEST_INFO_TEMP,1,PATINDEX('%|%', @DEST_INFO_TEMP))
SET @DEST_SEND_CNT = @DEST_SEND_CNT + 1
SET @DEST_INFO_TEMP = SUBSTRING(@DEST_INFO_TEMP,PATINDEX('%|%', @DEST_INFO_TEMP) + 1,DATALENGTH(@DEST_INFO_TEMP) - PATINDEX('%|%', @DEST_INFO_TEMP)) -- 변수에 담은 전화번호는 해당 변수에서 제거한다
IF (@DEST_SEND_CNT % 20 = 0 )
BEGIN
INSERT TABLE #SMSSEND
SET @DEST_SEND_CNT = 0 --발송한 SMS 카운트를 초기화 한다
SET @SMS_COMMIT_CNT = @SMS_COMMIT_CNT + 1 --( 총발송건수 / 20 ) - 1건 차감한다
SET @DEST_TEMP = '' --보낸 SMS 받는이 전화번호데이터는 초기화한다
END
SELECT FROM #SMSSEND
END
위의 내용대로 구성이 되어 있는데요
이프로시저를 실행하면
2. @발송번호갯수가 2만명기준이면(1명당 20바이트) 1분 45~50초 정도 소요
3. @발송번호갯수가 3만명기준이면(1명당 20바이트) 7분~8분 정도 소요
조언을 구합니다. 도움을 부탁드리겠습니다.
Comment 11
-
이리
2016.06.09 10:46
-
추억만이
2016.06.09 10:50
SMSSEND 에 PK를 삭제하거나 PK를 넌클러스터드 인덱스로 변경하세요
-
미련곰퉁아
2016.06.09 11:21
현재 임시테이블에 PK는 없습니다. 실행계획도 올려드리겠습니다.
-
미련곰퉁아
2016.06.09 11:30
실행계획 다시 올려드리겟습니다. 예상실행계획을 올렷네요 죄송합니다.
-
미련곰퉁아
2016.06.09 11:33
1천개 이내갯수에서는 빠르게 처리됩니다. 갯수가 많을때가 문제가되는데요
갯수가 많게끔해서 해보려햇는데 시간이 너무 걸려서 그 실행계획은 올리지 못햇습니다.
-
추억만이
2016.06.09 11:42
SDK_SMS_SEND 에 PK 있네요
-
미련곰퉁아
2016.06.09 11:46
아네네 그 실제테이블에는 PK가 잇는데 문제는 그쪽디비는 저희관할이 아니라 서비스업체용이라 저희 맘대로
PK를 없애거나 그러질 못합니다.
-
minsouk
2016.06.09 12:51
sql 문자열 파싱은 그 문자가 길면 상당히 느려집니다. 그러나 clr 로 작성하면 그 속도가 느려지지 않습니다. 한번에 smssend 에 스트림으로 넣으면 3~5만건 10초면 넣을 수 있을듯 합니다. 짜 드려요?
-
미련곰퉁아
2016.06.09 13:11
아 감사합니다. CLR 은 처음 해보는거라 찾아보고 해보고 혹시안되면 다시 도움요청드리겠습니다.
감사합니다. !!
-
항해자™
2016.06.09 13:30
제가 볼 때는 while문 안에서 insert 하는것 때문에 느린것 같습니다,,
혹시 어플 로직을 변경할 수 있다면, UDT로 데이터를 받는게 가장 좋을 것 같구요,,,
그게 아니라면 스트링 파싱을 해야 하는데, 젤 빠른건 clr 이고, 차선책으로 쓸만한 것은 xml 파싱입니다.
xml 파싱을 사용한다면, 아래와 같은 방식으로 해 볼수 있겠네요,,
create function dbo.fnTbl2NString
( @pString xml
) returns table
as
return (
select row_number() over(order by (select 1)) as cRows
, col.value('@n','nvarchar(1000)') as cValue
from @pString.nodes('/x') as a (col)
)
go
declare @vString varchar(max) = '박정아^010-1234-5678|최승현^010-2345-6789|김수영^010-3456-7890|이승우^010-5555-2222|문지현^010-4444-8888'
declare @vXML xml = convert(xml,N'<x n="'+ replace(@vString,'|','"/><x n="') +'"/>')
insert #SMSSEND
select max(case b.cRows when 1 then b.cValue end) as cName
, max(case b.cRows when 2 then b.cValue end) as cTels
from dbo.fnTbl2NString(@vXML) as a
cross apply (
select *
from dbo.fnTbl2NString(convert(xml,'<x n="'+ replace(a.cValue,'^','"/><x n="') +'"/>'))
) as b
group by a.cRows
go
-
미련곰퉁아
2016.06.09 13:49
이게 한 스트링에 전화번호를 무한대로 붙인다는거 자체가 무리인거 아는데 현재 시스템이 운영중이라 변경이 어려워서
고심중이엿는데 minsouk 님 항해자™ 님이 조언해주시는거 바탕으로 다시 작업해보겠습니다.
공부가 많이 필요한거 같습니다. 모르는게 너무 많네요 감사합니다. !!
프로시저만 보고는 예측만 할 뿐이지 정확하게 알기는 힘들 수 있습니다.
실행계획을 같이 올려주시면 고수님들이 분석하셔서 알려주실 겁니다 ^^