Maystyle :
Admin : New post
Guestbook
Local
media
Catergories
Recent Articles
Recent Comments
Recent Trackbacks
Calendar
Tag
Archive
Link
Search
 
  Audit Logout spends long time 
작성일시 : 2010. 2. 24. 16:22 | 분류 : SQL Server/Development

아래에서 확인 할 수 있듯이 실제 쿼리 수행 시간은 0.1 초 입니다. (단위 : 마이크로 세컨드)
image

하지만 Audit Logout 에는 엄청난 시간이 걸리는 군요.
image

솔직히 왜 이렇게 오래 걸리는 지 확인은 모두 못했습니다.
다만 이 시간은 해당 Connection이 연결된 시점부터 종료된 시점을 의미한다는 것을 확인 했습니다.
중요한 것은 Applicaiton 입장에서 언제 Response 결과는 받느냐 입니다.
결론은 16시 22분 11초 593에 실행 되어 16시 22분 11초 603 에 실행이 종료가 되며 해당 결과는 Application 에 전달 된다는 점 입니다.

즉 Database 입장 에서 자신은 이미 데이터를 모두 전달했기 때문에 Application의 느림 현상은 It’s not my fault 가 됩니다. 아래는 위의 경우 Application에서 측정한 실행 결과 입니다.
image

Audit Logout 과 관계 없이 2.6초가 소요 되었습니다.

그렇다면 Audit Logout이 Application의 성능에 영향을 미치는 경우는 어떤 것이 있을까요?
먼저 Network 성능 이슈를 생각 할 수 있습니다.
그리고 다음으로 Application 성능 이슈를 생각 할 수 있습니다.

아래는 간단하게 만들어 본 OLEDB 연결 프로그램 입니다.
보시는 것 처럼 객체 선언 이후에 ReadLine () 함수를 호출 하여 대기 하도록 했습니다.

string source = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=TEST;" +
            "UID=sa;PWD=12345;" +
            "OLE DB Services = -1;";
            OleDbConnection conn = new OleDbConnection(source);
            try
            {
               conn.Open();
               Console.WriteLine("DB Connection OK");
               string myInsertQuery = "Select * from T1";
               OleDbCommand myCommand = new OleDbCommand(myInsertQuery);
               myCommand.Connection = conn;
               myCommand.ExecuteNonQuery();
                            }
            catch(Exception ex)
            {
              Console.WriteLine("DB Connection Fail");
              Console.WriteLine(ex);
            }
            finally
            {
               if(conn !=null)
                {

                    conn.Close();
                }
            }
            Console.ReadLine();

결론은 정확하게 아래와 같이 Readline() 에서 대기했던 시간이 Audit Logout에 반영 되는군요.
image
 

이번에는 좀 더 오래 대기 시켜 보겠습니다.
역시 바로 반영됨을 확인 할 수 있었습니다.
image 

결론을 말씀 드리자면 객체가 생성된 범위 내에 있을 경우 쿼리 실행은 종료 및 연결 종료가 진행 됐더라도 객체 선업의 외부로 나갈 때 혹은 프로세스 종료 그리고 연결 대기 시간의 Timeout 까지는 연결이 지속 되고, 이는 바로 Audit Logout의 Duration으로 표현 되게 됩니다.

마찬 가지로 아래와 같이 쿼리를 실행 하기 직전에 대기 시간을 갖게 만들었다면, Audit Logout이 늘어나는 것은 물론 쿼리 실행 즉 SQL:BatchStarting 이 늦어지게 됩니다. 이것은 고스란이 Audit Logout에 반영이 되게 되고, 이는 성능 문제로 비춰 질 수 도 있겠죠…^^

               conn.Open();
               Console.WriteLine("DB Connection OK");
               string myInsertQuery = "Select * from T1";
               OleDbCommand myCommand = new OleDbCommand(myInsertQuery);
               myCommand.Connection = conn;
               Console.ReadLine();

한 마디로 다양한 원인에 의해 해당 시간은 지속될 수 있다는 것이고, 전 그 한 예로 개발 코드의 문제를 예시로 보여드렸으며, DB 성능과는 그다지 관계가 없음도 알 수 있습니다.

앞으로 더 확인해야 할 내용들이 있다면 차차 업데이트를 하겠지만, 저는 Audit Logout 과 실제 Database의 성능과의 관계는 확인 하지 못했습니다. 물론 SQL Server 2000 에서는 관련 이슈가 있었던 것은 사실 입니다. Fix도 됐습니다. 하지만 SQL Server 2005에서는 음… 아직은 확인을 못했습니다.

확인 된 사항이 있으면 공유 좀 부탁드리면서 글을 마치겠습니다.

|