table omarket_category
idx int
oidx int
occode varchar(50)
ocname varchar(50)
osname varchar(50)
cexpire bit
cdate smalldatetime
table viewomarketCategoryAPI
idx int
oidx int
catenum varchar(50)
catefullname varchar(50)
cateshortname varchar(50)
위와같은 형태의 테이블이 있습니다
omarket_category 테이블의 ocName, csName 컬럼값을 viewomarketcategory 테이블의 cateFullName, cateShortName 컬럼값으로 업데이트 하는 쿼리입니다
문제는 레코드의 갯수가 1만개이상이 되니까 쿼리 실행이 엄청나게 느려져서 타임아웃이 걸려버립니다.
위 테이블 2개를 view로 아래와 같이 omarket_category.oidx = viewomarketcategory.oidx, omarket_category.occode = viewomarketcategory.cateNum의 관계로 조인하여 뷰테이블(NewViewTAble)을 만들어서
update NewViewTable set ocName = cateFullName ,osName = cateShortName where oidx = " & oidx & "
위와 같이 쿼리를 실행하면 2~3초만에 실행이 되어버립니다
기본적인 기초만 있는지라, 어떻게 활용해야 할지가 막막합니다.
비슷한 쿼리가 실행되어야 할 경우가 무한이 많은에 일일이 뷰테이블을 다 만들어서 한다는것도 그렇고...
뭔가 바람직한 방식은 아닐거 같다는 생각이 듭니다.
또한 아래의 쿼리에서 oCName, osName 두개의 컬럼만이지만, 이렇게 업데이트 해야 할 컬럼수가 한 열개쯤 되어버린다면 엄청난 처리속도 저하가 발생할것 같기도 합니다..
Sql = "UPDATE omarket_category SET"
Sql = Sql & " oCName = (SELECT cateFullName FROM viewomarketCategoryAPI WHERE oidx = " & oidx & " AND cateNum = omarket_category.ocCode)"
Sql = Sql & ", osName = (SELECT cateShortName FROM viewomarketCategoryAPI WHERE oidx = " & oidx & " AND cateNum = omarket_category.ocCode)"
Sql = Sql & ", cExpire = 1"
Sql = Sql & ", cdate = '" & FormatDateTime(Now(),2) & " " & FormatDateTime(Now(),4) & ":00" & "'"
Sql = Sql & " WHERE oidx = " & oidx & ""
Sql = Sql & " AND ocCode IN (SELECT cateNum FROM viewOmarketCategoryApi WHERE oidx = " & oidx & ")"
고수님들의 조언을 부탁드립니다
Comment 1
-
카즈야마(이정우)
2014.02.14 11:38
안녕하세요.
해당 쿼리들을 SP 처리하심이...
일단 위의 내용을 보면 viewomarketCategoryAPI 해당 테이블을 oidx, cateNum 으로 조건을 줘서 각각 컬럼마다 테이블 검색을 하게되는거 같은데요
해당 UPDATE 쿼리가 돌기전에
viewomarketCategoryAPI 해당 테이블을 SELECT 해서 CateFullName, cateShortName 등의 컬럼을 변수에 넣어놓고
Update 하시면 속도향상에 도움이 될거 같습니다.
예를들어
SELECT @cateFullName = cateFullName, @cateShortName = cateShortName FROM viewomarketCategoryAPI WHERE ~~~~
이런식으로..
그리고 해당 테이블들에 Index 가 맞게 생성되어있는지 등도 확인 해보세요.
위 쿼리로 봐서 인덱스와 동일 테이블의 반복 SELECT 만 줄여도 문제될만한 쿼리가 아닌거 같습니다.