Pleasure resort of Gleam™

While Loop를 사용하는 아래와 같은 쿼리가 있다.
(원래 Cursor를 사용 하던 쿼리였다.)
     SET NOCOUNT ON;
    SET XACT_ABORT ON;

    BEGIN TRAN                                                                              -- 트랜잭션 시작

    DECLARE @RegUser                 CHAR(8)
        SET @RegUser='20070073'

    DECLARE @iCnt                   INT             -- Loop 변수
          , @iTotalCnt              INT             -- 전체 데이터 수
          , @sPrevColGrp            VARCHAR(30)
     SELECT @iCnt=0, @iTotalCnt=0, @sPrevColGrp=''

    -- 임시 테이블 선언
    DECLARE @tbTmp TABLE (
        Idx                         INT             IDENTITY(1,1)
       ,ColGrp                      INT
       ,Col01                       VARCHAR(30)
       ,Col02                       VARCHAR(30)
       ,Col03                       VARCHAR(30)
       ,RegDate                     DATETIME        DEFAULT(GETDATE())
    )
    DECLARE @tbTmp2 TABLE (
        ColGrp                     INT
       ,ColGrpSeq                  INT
       ,RegDate                    DATETIME        DEFAULT(GETDATE())
    )

    INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('1', 5477)
    INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('2', 8901)
    INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('3', 9901)



    INSERT INTO @tbTmp (ColGrp, Col01, Col02, Col03)
    SELECT *
      FROM (
            SELECT '1' AS ColGrp, 'Col01_1' AS Col01, '' AS Col02, '' AS Col03
            UNION
            SELECT '2' AS ColGrp, 'Col01_2' AS Col01, '' AS Col02, '' AS Col03
            UNION
            SELECT '2' AS ColGrp, 'Col01_3' AS Col01, '' AS Col02, '' AS Col03
            UNION
            SELECT '3' AS ColGrp, 'Col01_4' AS Col01, '' AS Col02, '' AS Col03
            UNION
            SELECT '3' AS ColGrp, 'Col01_5' AS Col01, '' AS Col02, '' AS Col03
           ) A

    SELECT @iTotalCnt=COUNT(*) FROM @tbTmp                                                  -- 선택된 항목의 COUNT

    WHILE (@iTotalCnt>@iCnt)                                                                -- Loop 시작
    BEGIN
        SET @iCnt = @iCnt+1                                                                 -- Loop count 증가
        PRINT ('@iTotalCnt is ' + CAST(@iTotalCnt AS VARCHAR) + ', @iCnt is ' + CAST(@iCnt AS VARCHAR))

        IF (((SELECT ColGrp FROM @tbTmp WHERE Idx=@iCnt) <> @sPrevColGrp) OR (@sPrevColGrp = ''))
        BEGIN
            SELECT @sPrevColGrp = ColGrp FROM @tbTmp WHERE Idx=@iCnt

                INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq)
                SELECT A.ColGrp, (MAX(B.ColGrpSeq)+1) AS ColGrpSeq
                  FROM @tbTmp A
                  JOIN @tbTmp2 B
                    ON A.ColGrp = B.ColGrp
                 WHERE A.Idx =@iCnt
              GROUP BY A.ColGrp


            UPDATE @tbTmp
               SET Col02 =  A.Col01 + '_' + CAST(ISNULL( (SELECT MAX(ColGrpSeq) FROM @tbTmp2 WHERE ColGrp = A.ColGrp) , 1) AS VARCHAR)
              FROM @tbTmp A
             WHERE A.Idx>=@iCnt
        END

        UPDATE @tbTmp
           SET Col03 = (
                    A.Col01 + '_' + Col02 +'_' + CAST(Idx AS VARCHAR)
               )
          FROM @tbTmp A
         WHERE A.Idx=@iCnt
    END

    SELECT * FROM @tbTmp
    SELECT * FROM @tbTmp2
    ROLLBACK TRAN

원본 쿼리 실행 결과

원본 쿼리 실행 결과

원본 쿼리 통계

원본 쿼리 통계


이 쿼리에서 Loop를 제거하고 아래와 같이 만들었다.
    SET NOCOUNT ON;
    SET XACT_ABORT ON;
    BEGIN TRAN

    DECLARE @RegUser                 CHAR(8)
        SET @RegUser='20070073'

    DECLARE @iCnt                   INT             -- Loop 변수
          , @iTotalCnt              INT             -- 전체 데이터 수
          , @sPrevColGrp            VARCHAR(30)
     SELECT @iCnt=0, @iTotalCnt=0, @sPrevColGrp=''

    -- 임시 테이블 선언
    DECLARE @tbTmp TABLE (
        Idx                         INT             IDENTITY(1,1)
       ,ColGrp                      INT
       ,Col01                       VARCHAR(30)
       ,Col02                       VARCHAR(30)
       ,Col03                       VARCHAR(30)
       ,RegDate                     DATETIME        DEFAULT(GETDATE())
    )
    DECLARE @tbTmp2 TABLE (
        ColGrp                     INT
       ,ColGrpSeq                  INT
       ,RegDate                    DATETIME        DEFAULT(GETDATE())
    )

        INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('1', 5477)
        INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('2', 8901)
        INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq) VALUES ('3', 9901)



        INSERT INTO @tbTmp (ColGrp, Col01, Col02, Col03)
        SELECT *
          FROM (
                SELECT '1' AS ColGrp, 'Col01_1' AS Col01, '' AS Col02, '' AS Col03
                UNION
                SELECT '2' AS ColGrp, 'Col01_2' AS Col01, '' AS Col02, '' AS Col03
                UNION
                SELECT '2' AS ColGrp, 'Col01_3' AS Col01, '' AS Col02, '' AS Col03
                UNION
                SELECT '3' AS ColGrp, 'Col01_4' AS Col01, '' AS Col02, '' AS Col03
                UNION
                SELECT '3' AS ColGrp, 'Col01_5' AS Col01, '' AS Col02, '' AS Col03
               ) A

        SELECT @iTotalCnt=COUNT(*) FROM @tbTmp                                                  -- 선택된 항목의 COUNT

        INSERT INTO @tbTmp2 (ColGrp, ColGrpSeq)
        SELECT A.ColGrp, (MAX(B.ColGrpSeq)+1) AS ColGrpSeq
          FROM @tbTmp A
          JOIN @tbTmp2 B
            ON A.ColGrp = B.ColGrp
      GROUP BY A.ColGrp

        UPDATE @tbTmp
           SET Col02 =  A.Col01 + '_' + CAST(ISNULL( (SELECT MAX(ColGrpSeq) FROM @tbTmp2 WHERE ColGrp = A.ColGrp) , 1) AS VARCHAR)
          FROM @tbTmp A
         WHERE A.Idx>=@iCnt

        UPDATE @tbTmp
           SET Col03 = (
                    A.Col01 + '_' + Col02 +'_' + CAST(Idx AS VARCHAR)
               )
          FROM @tbTmp A


        SELECT * FROM @tbTmp
        SELECT * FROM @tbTmp2
    ROLLBACK TRAN


수정된 쿼리 실행 결과

수정된 쿼리 실행 결과

수정된 쿼리 통계

수정된 쿼리 통계



딱 봐도 속도가 많이 빨라졌다...ㅋ

Comment +0



Generate random password script for  MS-SQL Server

Comment +0

DB 내의 테이블의 행 수, 사이즈, 인덱스 사이즈 알아내기
http://bybi.tistory.com/434

사용자 삽입 이미지

Comment +0

TRUNCATE TABLE

Dev & Mng2007.03.20 13:55

TRUNCATE TABLE

개별 행 삭제를 로깅하지 않고 모든 행을 테이블에서 제거합니다.

구문

TRUNCATE TABLE name

인수

name

잘라내거나 모든 행을 제거할 대상이 되는 테이블의 이름입니다.

비고

TRUNCATE TABLE은 기능적으로 WHERE 절이 없는 DELETE 문과 동일합니다. 둘 다 테이블에서 모든 행을 제거합니다. 그러나 TRUNCATE TABLE이 DELETE보다 더 빠르고 시스템 및 트랜잭션 로그 리소스를 덜 사용합니다.

DELETE 문은 행을 한 번에 하나씩 제거하고 각 삭제된 행에 대해 트랜잭션 로그에 항목을 기록합니다. TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용된 데이터 페이지를 할당 취소하여 데이터를 제거하며 페이지 할당 취소만을 트랜잭션 로그에 기록합니다.

TRUNCATE TABLE은 테이블에서 모든 행을 제거하지만 테이블 구조와 그 열, 제약 조건, 인덱스 등은 그대로 남습니다. 새로운 행에 ID로 사용된 카운터는 열에 대한 시드로 재설정됩니다. ID 카운터를 보존하려면 DELETE를 대신 사용하십시오. 테이블 정의 및 그 데이터를 제거하려면 DROP TABLE 문을 사용하십시오.

FOREIGN KEY 제약 조건에 참조되는 테이블에서는 TRUNCATE TABLE을 사용할 수 없으며 대신 WHERE 절 없는 DELETE 문을 사용합니다. TRUNCATE TABLE은 로그되지 않으므로 트리거를 활성화할 수 없습니다.

TRUNCATE TABLE은 인덱스된 뷰에 참여 중인 테이블에서는 사용할 수 없습니다.

예제

다음은 authors 테이블에서 모든 데이터를 제거하는 예제입니다.

TRUNCATE TABLE authors
사용 권한

TRUNCATE TABLE은 테이블 소유자, sysadmin 고정 서버 역할 및 db_ownerdb_ddladmin 고정 데이터베이스 역할에 대한 권한 기본값이며 전송할 수 없습니다.

truncate table EEMTB_AssociationMember
insert INTO EEMTB_AssociationMember Select * FROM dbo.EEMTB_AssociationMember_031918
Select * FROM dbo.EEMTB_AssociationMember

'Dev & Mng' 카테고리의 다른 글

Hotfix 설치 하지 않고 압축만 풀기  (0) 2007.03.27
TRUNCATE TABLE  (0) 2007.03.20
scrollTop 값이 0 으로면 나온다면??  (0) 2007.03.14
WebDevHelper  (0) 2007.03.14

Comment +0

<%
   Dim objRs, strSql, j

   strSql = "SELECT * FROM buscompany WHERE sigunname = ?"

   With oCmd
       .ActiveConnection = dbcon
       .CommandType = adCmdText
       .CommandText = strSql
       .Parameters.Append .CreateParameter("sigunname", 200, &H0001, 20, "서울특별시")
       Set objRs = .Execute
   End With

   Do Until objRs.EOF
       Write(objRs("name"))
       objRs.MoveNext
   Loop

   Set objRs = Nothing
   Response.End
%>

'Dev & Mng' 카테고리의 다른 글

PowerBand 2.1.0.1  (0) 2006.11.09
use oracle parametered query in asp  (0) 2006.10.26
ADODB Command  (0) 2006.10.25
ADODB Type Library  (0) 2006.10.25

Comment +0