BEGIN
SET @sql = 'INSERT INTO TB_DEFECT_DATA ' + '(CreateDate, CreateTime, DEFECTID, PCID, DefectJudgement, BFImage)
VALUES ( @p_strCreateDate, @p_strCreateTime, @p_nDefectID, @p_nPCID,
@p_nCameraID, @p_nDefectJudgement,@p_BFImage)';
SET @param ='@p_strCreateDate nvarchar(8)
, @p_strCreateTime nvarchar(6)
, @p_nDefectID int
, @p_nPCID tinyint
, @p_nCameraID tinyint
, @p_nDefectJudgement tinyint
, @p_BFImage image'
execute sp_executesql @sql,@param
, @p_strCreateDate = @strDate
, @p_strCreateTime = @strTime
, @p_nDefectID = @nDefectID
, @p_nPCID = @nPCID
, @p_nCameraID = @nCameraID
, @p_nDefectJudgement = @nDefectJudgement
, @p_BFImage = @BFImage
END
테이블 이름이 가변이라서 동적 쿼리로 작성하였습니다. (클라이언트의 요청이라서 ㅠㅠ)
일단 테스트 용도라서 테이블 이름은 고정으로 변경하였습니다.
C++에서 ado를 이용해서 for문으로 약 2000개의 Data가 담긴 구조체를 불러와 저장 프로시저를 호출해서 저장하고 있습니다.
Image(Byte) Data가 없을 땐 한개의 Data당 약 5ms가 걸리고 Image(Byte)를 포함하여 올리면 1개의 Data당 10ms가 걸려
총 2000개의 Data를 올리는데 약 20초가 걸리고 있습니다.
프로그램에서 for문을 돌려서 저장하고 있는게 문제일까요.. 아니면 애초에 다량의 Data를 Insert Into로 밀어넣으려고 한게 문제인가요
읽어주셔서 감사합니다.
Comment 5
-
항해자™
2014.06.27 02:55
-
SQL2005인가요?
2008이라면 "사용자 정의 테이블 형식"을 프로시저의 파라메타로 선언하면 좋은 효과를 볼 수 있는데 아쉽네요.
2000개나 되는 데이터를 밀어 넣는거면 사용자가 입력하는 데이터는 아닐거 같은데
그러면 BCP 등을 이용하는건 어떤가요??
-
ADA
2014.06.27 09:17
답변 감사드립니다
제가 bcp를 잘 알지 못해서 그러는데 단순 검색으로만 확인했을 때..
bcp는 Data가 나열된 txt파일을 올려서 컬럼에 맞춰 저장하는걸로 아는데
그럼 바이너리 타입은 어떻게 올려야하나요? 이미지를 bcp에 맞게 올리는 방법은 잘 모르겠습니다..
SQL는 2005버전입니다.
-
처리짱
2014.06.27 11:23
꼼수 입니다만.. 바이너리 타입을 스트링형으로 바꿔서 저장하면됩니다..
제가 이전에 작업했던 내용 올려 드릴게요..
LPBYTE pData = '00FF';
char szData[10000];
for(int i = 0; i < (int)nBytes; i++)
sprintf(&szData[i * 2], "%02X", (BYTE)pData[i]);
CString strTemp(szData); <-- 스트링 형식으로 변경 끝아래부터는 스트링을 바이너리로 변경
BYTE *pData = new BYTE[nSize];
long nItem = 0;
long nCount = strList.GetLength();
for(int i=0; i<nCount; i = i+2)
{
CString strTemp = strList.Mid(i, 2);
pData[nItem++] = HexStrToInt(strTemp);
}DWORD HexStrToInt(CString aStr)
{
DWORD i;
char * string, * stopstring;string = (char *)(LPCTSTR)aStr;
strtod(string, &stopstring);
i = (DWORD)strtoul(string, &stopstring, 16);
return i;
}
텍스트 파일로 떨굼 -> SQL서버가 깔린곳으로 전송 -> BCP로 인서트의 과정을 거치면 되겠네요..2000번을 돈다는게 프로시져를 2000번 호출한다는 말씀같은데.. 암만해도 글케 되면 엄청 시간이 오래걸리겠죠...
한번에 ㅎㅎㅎ
-
ADA
2014.06.27 11:32
감사합니다! 도전해보겠습니다
DB 공부의 필요성을 절실하게 느끼고 있습니다..
개발자로서 DB를 등한시 했던것에 후회가 느껴지네요..
가능하면 파일로 전송해서 벌크 인서트 해 보시는게 어떨지,,,