현재 프로시저를 이용해서 네개의 테이블에서 휴대번호의 유무를 판단하고 없다면 insert를 하는 프로시저로 진행을 하는데..
검색하고 insert를 하는 시간이 너무나 많은 시간이 걸려서 고수님의 도움을 받고자 합니다.
현재 데이타의 갯수는 각각의 테이블별로 60,000개의 데이타가 있는데..아래의 프로시저문을 보시면 아실것입니다.
각각의 테이블의 index는 pk 말고는 없습니다.
물론 index를 잡는 방법을 모릅니다. 아무리 잡을려고 하는데도 저의 실력으로는 부족하세요.
기존에 운영중이던 테이블의 검색을 진행하는 컬럼에 index를 걸수 있는 방법도 부탁드립니다.
--- 프로시저 수정 소스 ---
ALTER PROCEDURE [dbo].[usp_AutoCall]
@CellNumber varchar(20) = '',
@id varchar(50) = ''
as
DECLARE @cellPhone INT;
DECLARE @cellPhone1 INT;
DECLARE @cellPhone2 INT;
DECLARE @cellPhone3 INT;
DECLARE @cellPhoneAll INT;
Begin Tran
SET NOCOUNT ON
BEGIN
SELECT @cellPhone = COUNT(cellPhone) From chkTable where replace(cellPhone,'-','') = @CellNumber;
END;
BEGIN
SELECT @cellPhone1 = COUNT(userCell) From member where replace(userCell,'-','') = @CellNumber;
END;
BEGIN
SELECT @cellPhone2 = COUNT(phone) From ben_member where replace(phone,'-','') = @CellNumber;
END;
BEGIN
SELECT @cellPhone3 = COUNT(userCell) From aby_member where (replace(userCell,'-','') = @CellNumber) or (replace(userPhone,'-','') = @CellNumber);
END;
set @cellPhoneAll = @cellPhone1 + @cellPhone2 + @cellPhone3;
if @cellPhoneAll <= 0
BEGIN
insert into wkr_autocall_chkTable_temp (cellPhone, regID) VALUES (@CellNumber, @id)
END;
If (@@error <> 0)
RollBack Tran
else
Commit Tran
--- 프로시저 소스 완료 --
-- ASP 소스 시작---
set objConn=Server.CreateObject("ADODB.Connection")
objConn.open "Provider=SQLOLEDB.1;Password=비밀번호;Persist Security Info=True;User ID=아이디;Initial Catalog=디비명;Data Source=IP주소;Network Library=dbmssocn"
Set Cmd = Server.CreateObject("ADODB.Command")
with Cmd
.ActiveConnection = objConn
.CommandType = adCmdStoredProc
.CommandText = "[dbo].[usp_AutoCall2]"
.Parameters.Append .CreateParameter("@CellNumber", adVarChar, adParamInput,20)
.Parameters.Append .CreateParameter("@id", adVarChar, adParamInput,20)
.Parameters("@CellNumber") = cellPhone
.Parameters("@id") = regID
.Execute , , adExecuteNoRecords
End with
Set Cmd = Nothing
-- ASP 소스 끝---
고수님의 도움을 간절히 부탁드립니다.
Comment 3
-
항해자™
2014.03.24 10:50
먼저 아래와 같이 WHERE 절에 있는 REPLACE 구문을 모두 제거해 주세요,,데이터가 중구난방이라면 데이터를 검색어에 맞게 교정작업을 진행해 주시는게 좋을 것 같네요,,모든 데이터가 "xxx-xxxx-xxxx" 와 같은 형식으로 들어가든지,,, "xxxxxxxxxxx" 와 같이 되든지,,,통일을 시켜야 검색도 편하고 인덱스 활용하기도 쉽습니다.마지막으로 아래 프로시저 변수도 테이블의 검색어에 해당하는 컬럼의 크기와 맞춰주시고,맨 아래 부분에 첨부해 드린 인덱스를 적용해 주시면 되겠네요,,,@CellNumber varchar(20)ALTER PROCEDURE dbo.usp_AutoCall( @CellNumber varchar(20) = '', @id varchar(50) = ''ASBEGINSET NOCOUNT ONSET TRANSACTION ISOLATION LEVEL READ UNCOMMITTEDDECLARE @cellPhone int, @cellPhone1 int, @cellPhone2 int, @cellPhone3 int, @cellPhoneAll intBEGIN TRANSELECT @cellPhone = COUNT(cellPhone)FROM dbo.chkTableWHERE cellPhone = @CellNumberSELECT @cellPhone1 = COUNT(userCell)FROM dbo.memberWHERE userCell = @CellNumberSELECT @cellPhone2 = COUNT(phone)FROM dbo.ben_memberWHERE phone = @CellNumberSELECT @cellPhone3 = COUNT(userCell)FROM dbo.aby_memberWHERE userCell = @CellNumberOR userPhone = @CellNumberSET @cellPhoneAll = @cellPhone1 + @cellPhone2 + @cellPhone3IF @cellPhoneAll <= 0BEGININSERT INTO dbo.wkr_autocall_chkTable_temp( cellPhone, regID)VALUES( @CellNumber, @id)IF @@ERROR <> 0BEGINROLLBACK TRANRETURNENDENDCOMMIT TRANENDGOCREATE NONCLUSTERED INDEX IX_chkTable_02ON dbo.chkTable( cellPhone)CREATE NONCLUSTERED INDEX IX_member_02ON dbo.member( userCell)CREATE NONCLUSTERED INDEX IX_ben_member_02ON dbo.ben_member( phone)CREATE NONCLUSTERED INDEX IX_aby_member_02ON dbo.aby_member( userCell)CREATE NONCLUSTERED INDEX IX_aby_member_03ON dbo.aby_member( userPhone) -
웹사랑
2014.03.25 15:29
빠른 답변에 감사드립니다.
그런데 replace문으로 데이타를 일괄적으로 변경한후에 검색하는것과
데이타의 형식을 일괄적으로 움직이는 것에 대한 검색 속도차이가 많이 나는건가요.
현재 데이타에선 일괄적으로 ***-****-**** 또는 ***-***-**** 형식으로 되어 있습니다.
-
폭주
2014.03.26 09:25
인덱스 컬럼을 가공(replace,left,등등) 하면 인덱스 활용 못하고 조회 됩니다.
속도차이또한 데이터에 따라 차이가 나고요.