database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 4324 게시물 읽기
No. 4324
데이타 insert
작성자
WW
작성일
2008-07-10 09:54
조회수
5,663

첫번째 테이블에 10만건
밑에 테이블에 500만건 데이타를 넣으려고 합니다.
위에 테이블의 건수가 10000건이 되었을때(밑에 테이블은 50만건) 한번 commit하고 다시
트랜잭션 생성해서 처리를 반복합니다.
밑에 테이블의 건수가 50만건을 조금 넘으면 
 cmd.ExecuteNonQuery(); 이 부분에서 인수가 무효라고 에러가 나고 있습니다.
ㅜㅜ 여기 첨부파일 못올리나요...
<에러메세지... >
system.data.oledb.oledbexception; 인수가 무효입니다.
system.data.oledcommand.executecommandtextforsingleresult(tagDBPARAMS db Params, object& executeResult)
system.data.oledcommand.executecommandtext(object& executeResult)

디스크 공간도 충분한데요..
어디가 문제인지 모르겠네요.. 도움 부탁드려요.

string sReceiptNo = " ", sItem = "", sInsertItem = "", sEdaban = "";
            int sDataCount = Convert.ToInt32(txtDpKanri.Text), sEntryNo = 0, sKouban=0;
            int sKanriDataCnt = Convert.ToInt32(txtKanri.Text), sCount = 0, sTotal = 0;
            RegisterReceiptInfo(sGyomu, sGyomuAtt);
            getKanrino(sReceiptTbl, sReceiptType);
            using (OleDbConnection con = new OleDbConnection(connectionString))
            {
                using (OleDbCommand cmd = new OleDbCommand())
                {
                    cmd.Connection = con;
                    con.Open();
                    OleDbTransaction txn = con.BeginTransaction();
                    cmd.Transaction = txn;
                    try
                    {
                        for (int i = 0; i < sDataCount; i++)
                        {
                            sReceiptNo = GetReceiptNo(sReceiptType, sReceiptTbl, sKanriNo++);
                            cmd.CommandText = "INSERT INTO " + sReceiptTbl + " (kanri_no, receipt_no, entry_dtm, receipt_type_cd, group_cd, koji_type_cd) "
                                + "VALUES(" + sKanriNo + ",'" + sReceiptNo + "',#" + DateTime.Now.ToString() + "# , " + sReceiptType + ", '"
                                + sGroupData[sGroupCount] + "', " + sKoujiKubunnData[sKoujiKubunnCount] + ")";
                            cmd.ExecuteNonQuery();
                            if (sGroupCount >= sGroupData.Count - 1)
                                sGroupCount = 0;
                            else
                                ++sGroupCount;

                            if (sKoujiKubunnCount >= sKoujiKubunnData.Count - 1)
                                sKoujiKubunnCount = 0;
                            else
                                ++sKoujiKubunnCount;

                            for (int j = 0; j < sKanriDataCnt; j++)
                            {
                                sItem = sStockItem[sItemCnt].ToString();
                                int pos = sItem.IndexOf("@");
                                sInsertItem = sItem.Substring(0, pos);
                                sEdaban = sItem.Substring(pos + 1, sItem.Length - (pos + 1));
                                cmd.CommandText = "INSERT INTO " + sTbl + " (kanri_no, kouban, item_cd, price_edaban, suryou, ins_dtm, entry_no) "
                                    + "values(" + sKanriNo + ", " + ++sKouban + ", '" + sInsertItem + "', " + sEdaban + ", 1, #" + DateTime.Now.ToString() + "#, " + ++sEntryNo + ")";
                                cmd.ExecuteNonQuery();
                                if (sItemCnt >= sStockItem.Count - 1)
                                    sItemCnt = 0;
                                else
                                    ++sItemCnt;
                            }
                            sKouban = 0;
                            sEntryNo = 0;
                            ++sTotal;
                            if (sCount == 10000 || sTotal == sDataCount)
                            {
                                txn.Commit();
                                sCount = 0;
                                if (sTotal < sDataCount)
                                {
                                    txn = con.BeginTransaction();
                                    cmd.Transaction = txn;
                                }                               
                            }
                            else
                                ++sCount;                             
                        }
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                              txn.Rollback();
                        }
                        catch
                        {
                            // Do nothing here; transaction is not active.
                        }
                    }
                }
            }
            sKanriNo = 0;
            sGroupCount = 0;
            sKoujiKubunnCount = 0;
            sGroupData.Clear();
            sKoujiKubunnData.Clear();




이 글에 대한 댓글이 총 4건 있습니다.

.net에서 command를 처리하는 time과 
만약 asp.net이라면 iis에서 command에 처리에 대한 time을 세팅하는 부분이 있을겁니다. 

50만건 정도를 처리할 때 아마도 이 timeout에 걸려 application에서 에러로 리턴했을겁니다

여리님이 2008-07-10 11:41에 작성한 댓글입니다. Edit

^^;


일단 MS-SQL ASP.NET이라면 Oledb보다는 System.Data.Sql 것을 ADO로 작성하시면 성능이 더 올라갑니다.


그리고 execute timeout이라면 비동기로 insert하는것으로 만들어주시면 좋습니다.


ASP.NET에 비동기 page설정후 BeginExecute, EndExecute로 하셔서 비동기 처리로 바꾸어보시기 바립니다.


그리고 쿼리를 문자열로 보다는 


insert @1 @2 이렇게 parameter로 만드셔서 하시는게 오류 추적하시는데 용의하십니다.


그럼

김병석(byung82)님이 2008-07-10 12:36에 작성한 댓글입니다.

감사합니다.   ^_____^

WW님이 2008-07-10 15:26에 작성한 댓글입니다. Edit

prepare 되지 않은 쿼리로 인한 파싱의 부하가 대부분일 것으로 고려가 되구요 
이때는 프로시져로 입력 하도록 하던지 bcp 유틸리티를 이용하던지 하는게 좋을듯 합니다. 
아마 프로시져로 바꾸면 한 10배 빨리 올라갈겁니다. bcp 로 바꾸면 거기서 한 10배 빨라지구요
인덱스를 지우고 넣고 만들면 한 2배 더 빨라지고, 통계를 disable 시키고 넣으면 더 빨라지고...
테스트 할 부분이 많을듯 합니다.

q님이 2008-07-11 10:00에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
4327중복 제거 [3]
지윤서
2008-07-14
4689
4326전체 로우개수 추가 조회
초봉
2008-07-11
5819
4325한테이블에서 두번 쿼리 질문요.. [3]
이현호
2008-07-10
4708
4324데이타 insert [4]
WW
2008-07-10
5663
4323한테이블에 넣을수 있는 최대데이타건수 [3]
WW
2008-07-10
5110
4322스토어드 프로시져에서 특정 문자 찾기 [1]
kimjeehyun
2008-07-09
5288
4321업데이트 문장에서 메소드 문의. [5]
궁금이
2008-07-09
5185
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다