Hyun Soo, Lim

SQL Server 2012 (Denali)에서 추가된 날짜 함수 중 유용한 함수 2개를 소개드립니다.

1. EOMONTH 함수 (해당월의 마지막 날짜를 반환)

  -- 날짜변수 선언/할당 (윤달로 테스트 진행)

  declare @SampleDate datetime = '2012-02-14'

    
  -- SQL Server 2008 이하 버전에서는 다음달을 구한 뒤 -1일을 해서 찾음

  SELECT cast(convert(varchar(7), dateadd(month, 1, @SampleDate), 120) + '-01' as datetime) -1 AS LastDayOfMonth

 

  -- SQL Server 2011 (Denali)

  SELECT EOMONTH(@SampleDate) AS LastDayOfMonth


  -- 결과


2. FORMAT 함수 (날짜/시간, 숫자값을 원하는 문자열 포맷으로 보여줌) 

  -- 날짜변수 선언/할당 (오늘로 할당)

  declare @CurrentDay datetime = getdate()

 
  -- SQL Server 2008 이하 버전에서 날짜,시간을 붙여서 보여주고 싶은 경우 replace 함수를 활용하여 구현
  select replace(replace(replace(convert(varchar(16), @CurrentDay, 120), '-', ''), ':', ''), ' ', '') as CurrentDay

 

  -- SQL Server 2011 (Denali)

  select format(@CurrentDay, 'yyyyMMddHHmm', 'ko-kr') as CurrentDay

 

  -- 결과


  -- 의견

   오라클에서는 날짜를 내가 원하는 포맷으로 변형하기가 쉬웠는데, mssql로 오면서 제한된 format 내에서 사용하려고 하니 
   약간 번거로운 면이 있었습니다. 이번에 format 함수가 나와서 한결 편하게 개발이 가능할 것 같네요.
 

*. 참고문헌
  1. SQL Server 2011 날짜함수 도움말
  2. EndOfMonth Function Article
  3. Format Function Article

 


1. 개요
운영 중인 DB 서버 중 CPU 사용률이 높은 서버가 보여서 확인해보니 최근에 업데이트 쿼리가 추가되었더군요.
문제가 된 프로시져는 단순히 한 테이블에 업데이트하는 쿼리만 있었습니다. 단, 변경되는 컬럼수가 많다는 점이
눈의 띄였습니다. 쿼리의 실행수도 높기도 했지만 컬럼수가 많아서 CPU 사용량이 높아진 것은 아닌지 궁금해졌습니다.
그래서~ 아래와 같이 테스트를 진행해보았습니다.

2. 테스트 시나리오
 > 10만개의 데이터를 100개의 세션에서 1000개씩 처리하는 동안 CPU 사용률과 처리시간 비교 (SQLQueryStress를 사용)
 > 실제 사례와 유사하게 Insert/Update 대상 컬럼은 int 타입으로만 구성
 > Insert/Update 대상 테이블의 컬럼수는 1, 10, 50, 100, 150, 200, 300개로 변화를 줌
 > 각 테스트 종료 후 Checkpoint, DBCC DROPCLEANBUFFERS 수행을 통하여 다음 테스트에 영향을 안주도록 함

3. 테스트 내용
3-1. SQLQueryStress 실행 화면 (Insert/Update 에 대해서 컬럼별로 수행)
     

3-2. Update 테스트 결과
   

3-3. Insert 테스트 결과
   

4. 결론/의견
 > [L님] Insert/Update 쿼리는 변경대상 컬럼수에 큰 차이 없이 CPU 사용을 많이 사용함. CPU 사용률을 줄이고 싶을 경우, 
    업데이트 등 DML 쿼리의 호출수르 줄여야 함. 테이블 분할로는 큰 개선을 보기 힘듦.
 > [K님] 대상 컬럼수가 큰 영향을 안주는 이유는 레코드가 한 페이지내에 있기 때문에 컬럼수가 적거나 많은 것이 크게 영향을
    안주는 것으로 보임.

5. 참고
 > 고정형 컬럼인 int 만으로 테스트를 진행하였기 때문에 가변형 컬럼을 가지고 할 경우 다른 결과가 나올 수 있음
 > 테스트 스크립트

 

SQL Server 부하 테스트를 할 때 ostress를 많이 사용했는데, 이번에 비슷한 Tool을 알게 되어 소개드립니다. Ostress에 비해서 편리합니다.

그냥 소개만 하면 재미 없을 듯 하여 간단히 사용을 어떻게 하면 되는지 정리해보았습니다. 해당 프로그램은 하단에 있는 출처 사이트에 방문하면 구할 수 있습니다. 사용법도 친절하게(?) 영어로 설명되어 있습니다.

그럼 이제 간단히 테스트 진행해보도록 하겠습니다.
1. 테스트 내용
  - Tbl_param 테이블에 7000개의 데이터를 넣어놓는다.
  - 100개의 세션에서 70번씩 tbl_Result 테이블에 tbl_param 테이블의 값을 조회하여 입력한다.
  - 파라미터 테이블에서 개별적인 값이 한번씩만 호출되어지는지 확인한다. (테스트시 중복 발생이 안되는지 궁금했음)

2. Sqlquerystress를 설치한다.

3. 임시 테이블과 데이터를 생성한다.
  -- 데이터베이스 생성
 
create database NX_WORK
 
 
-- 파라미터 테이블 생성
 
create table tbl_param (
 
   seqNo int identity(1,1)
 
,  comment varchar(100)) 
  
 create unique clustered index idx_tbl_param_seqNo on tbl_param  (seqNo)

 
-- 7000개의 데이터 입력
 
declare @i int
 
 
set @i = 1

 
while (@i <= 7000 )
 begin
  
insert into tbl_param (comment) values ('11111')
  
set @i = @i + 1
 
end

 
-- 잘 만들어졌는지 확인
  select count(*) from tbl_param

 
-- 결과 테이블 생성
 create table tbl_result(comment varchar(100))

4. 실행창 띄우기
     

5. 준비 / 시작
5-1. Database 셋팅 (셋팅 후, Test connection 클릭해서 정상 연결되는지 확인)
     

5-2. 테스트할 쿼리를 Query 창에 입력 (파라미터값이 들어갈 부분은 변수 처리. 예> @comment)
     

5-3. 파라미터 셋팅
  - 파라미터로 사용할 값을 가지고 오는 쿼리 입력
  - Get Columns 버튼 클릭
  - Column에서 선택을 하면 데이터 타입이 자동 매핑
     

5-4. 메인창으로 와서 Go 버튼을 클릭 (테스트 시작!!!)
     

6. 결과 확인
  - 7000 개의 유니크한 값이 고르게 사용되었는지 확인
     

7. 예외 발생 건수는 우측 하단에 버튼을 눌러서 확인 가능


@@ 출처 :  http://www.datamanipulation.net/sqlquerystress/