'SQLServer'에 해당되는 글 16건

  1. 2011.08.11 [SQLServer] 소수점자리 절삭하기
  2. 2010.10.10 SQL Server 튜닝 원리와 해법 [2010. 정재우]
  3. 2010.09.29 [SQLServer] 특정문자가 포함된 StoredProcedure 찾기
  4. 2010.09.01 [SQLServer] 동적 쿼리의 해결사 sp_executesql vs. exec
  5. 2010.08.31 [SQLServer] TRY..CATCH를 이용한 중첩 트랜잭션 예외처리.
  6. 2010.06.27 [SQLServer] DB프로그램 개발자들을 위한 지침
  7. 2010.03.16 [SQLServer] 데이터베이스 용량관리
  8. 2009.12.21 [SQLServer] 데이터의 길이 가져오기
  9. 2009.08.27 [SQLServer] Unix_timestamp 형식의 데이터를 일반시간으로 변환
  10. 2009.07.14 [SQLServer] SQLServer2005설치 후 확인하기

[SQLServer] 소수점자리 절삭하기

DATABASE/SQLServer 2011. 8. 11. 13:45

오라클에서는 TRUNC함수로 소수점 이하 자리 절삭을 하는데,
SQLServer에서는 TRUNC함수가 없다.

그러면 어떻게 해야하는가?
이렇게 하면 된다.

SELECT ROUND(150.75665, 2, 1)
> 150.75000

SELECT ROUND(150.75665, 2, 0)
> 150.76000

정리하면...

ROUND ( numeric_expression, length [ , function ] )


numeric_expression
정확한 숫자 데이터 형식 또는 근사 숫자 데이터 형식이나 암시적으로 float로 변환할 수 있는 형식의 식입니다.

length
numeric_expression을 반올림할 전체 자릿수입니다. length가 양수이면 numeric_expression은 length에 지정한 소수 자릿수로 반올림됩니다. length가 음수이면 numeric_expression은 length에서 지정한 대로 소수점 왼쪽이 반올림됩니다.

함수
수행할 연산 유형입니다. function를 생략하거나 그 값이 0(기본값)이면 numeric_expression이 반올림됩니다. 0 이외의 값을 지정하면 numeric_expression이 잘립니다.



 

tags : SQLServer, 절삭
Trackbacks 0 : Comments 0

Write a comment


SQL Server 튜닝 원리와 해법 [2010. 정재우]

책이야기 2010. 10. 10. 00:24
사용자 삽입 이미지
비투엔컨설팅의 프로마스터(ProMaster) 시리즈 3번째 이고,
우연히 "괜찮은 책 나온게 있나?"하고 서점 웹사이트를 보다 발견한 책이다.

Oracle관련 괜찮은 책은 국내에 많이 있지만 MicroSoft사의 SQLServer관련
좋은 서적은(특히 번역본이 아닌 순수 국내서로는) 찾아보기 힘들다.
가뭄속 단비라 할 정도로 이 책은 보기드문 수작이다.
거의 모든 설명이 실습예제와 함께있기에 좋다는 생각이 든다.
단순한 예제가 아닌 저자의 고민이 담긴 훌륭한 예제라 더욱...

근 1년 사이에 비투엔에서 나온 3권의 책은 꽤 오랜기간 이 분야의 필독서가
될 듯 하다. 내 주관심 분야인 모델링 책도 출간할 예정이라 들었는데,
많이 기대가 된다. 반면에 데이터베이스 분야의 베스트 셀러를 줄줄이 출간했던
엔코아는 가장 최근에 출간한 책이 2005년에 나온 '새로쓴 대용량 데이터베이스 솔루션'이다.
이화식 대표님이 많이 바쁜건 아는데, 그래도 독자들과의 약속을 너무 쉽게 생각하시는건 아니신지? ^^;

비투엔컨설팅 서적과 엔코아의 책의 가장 큰 차이중 하나는 설명하는 방법에 있다.
이화식 대표님이 쓰신 책들은 설명에 비유가 상당히 많은 편이다. 혹자는 이 부분을 아주 마음에 들지 않는다고
하기도 하고...하지만 비투엔 컨설팅의 서적들은 설명이 간결하고, 군더더기가 없기에 앞으로 나올 서적이
더욱 기대된다.

★★★★★
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] 특정문자가 포함된 StoredProcedure 찾기

DATABASE/SQLServer 2010. 9. 29. 16:52
1. 특정 문자가 포함된 SP 검색

SELECT A.NAME
FROM SYSOBJECTS A, SYSCOMMENTS B
WHERE A.ID = B.ID
   AND B.TEXT LIKE '%' + '김승태' + '%'

2. 특정 이름의 SP 검색

SELECT A.NAME
FROM SYSOBJECTS A, SYSCOMMENTS B
WHERE A.ID = B.ID
   AND A.NAME LIKE '%' + @sp_name + '%'

tags : SQLServer
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] 동적 쿼리의 해결사 sp_executesql vs. exec

DATABASE/SQLServer 2010. 9. 1. 00:07
/*
 동적 쿼리의 해결사 sp_executesql vs. exec


소개.
  Visual Basic, ASP, VB.NET에서 ADO, ADO.NET을 이용한
 Database 프로그램을 개발하는 경우    프로그램내에 SQL 구문을 문자열로
 연결한 후, 실행하도록 구성한 코드를 많이 보게 된다.

   이러한 코드 구성을 일반적으로 '동적 쿼리', '하드 코딩된 쿼리'라고
 부른다.

 ex. vb의 경우
 Dim strSQL As String

 strSQL="select orderid, orderdate, employeeid from orders"
 strSQL=strSQL+" where orderid=" & txtOrderID

 cnn.Execute strSQL

 그러나, 이러한 동적 쿼리의 사용은 가능한 배제하는 것이 권장 사항이다.
대신 SQL Server의 저장 프로시저를 이용해서, 처리 용량과 응답 속도의
향상 및 유지 보수 등, 저장 프로시저의 특징을 활용하는 것이다.

 그러나, 설계상의 문제나 또는 고객의 다양한 요구 구현 방법상의 이질적
문제로 인해서 동적 쿼리를 써야된 되는 상황이 자주 발생한다.
Q/A를 보면 질문의 유형 중에 이러 동적 쿼리 작성법에 대한 내용이 상당
 부분을 차지하고 있다는 사실을 통해서도 알 수가 있다.
 
 저장 프로시저를 통해서 코드를 구성하더라도, 저장 프로시저 내에서 다시
 동적 쿼리를 사용하게 되는 경우도 발생한다.
 -온라인 설명서에는 이를 '런타임 시 명령문 작성'이라고 주제를 붙여놨다-
 이 경우, SQL Server에서는 두 가지 명령을 사용할 수 있다.
 바로 sp_executesql, exec() 두 가지이다.
   
  클라이언트나 서버 사이드에서 동적 쿼리를 사용해야 하는
 상황이 되었을 때, 즉, 저장 프로시저를 직접 사용할 수 없는 상황에서는
 또 다른 해결 방법을 이용할 수 있다.

  다음 두 가지 상황에서의 해결 방법이다.

  - 클라인트 사이드에서 동적 쿼리가 필요한 경우
   ADO, ADO.NET에서는 파라미터를 가진 동적 쿼리를 지정할 수 있으며,
   일반적으로 아래와 코드 구성을 가진다.
           
   1. ADO, ODBC, Command 오브젝트 연동
     Dim strSQL As String

     strSQL="select orderid, orderdate, employeeid from orders"
     strSQL=strSQL+" where orderid = ?"

   2. ADO.NET, SqlClient 네임스페이스, SqlCommand 오브젝트와 연동
     Dim strSQL As String

     strSQL="select orderid, orderdate, employeeid from orders"
     strSQL=strSQL+" where orderid = @orderid"

  위에 코드를 실행하면 실제 SQL Server에서는 sp_executesql 시스템
 프로시저를 통해서 실행이 된다.
 특히 ADO.NET의 경우는 디자인 타임에 'SqlDataAdapter Configuration
 Wizard'를 사용하게 되면 위와 같은 코드를 작성해 준다.


  - SQL Server, 저장 프로시저에서 동적 쿼리가 필요한 경우
   exec() 아니라 sp_executesql 시스템 프로시저를 이용한다.

 결국, 클라이언트 사이드건 서버 사이드건 sp_executesql 이 사용되는 것을
알 수 있다.
 exec()를 쓴 경우와 sp_executesql를 사용한 경우의 성능과 SQL Server의
Cache 매니저의 상황 비교에 대한 내용을 마지막에 추가해 두었다.

 일반적으로 sp_executesql은 exec() 비해 몇 가지 추가 장점을 제공한다.

  - 쿼리문안에 매개변수(입력/출력)를 정의할 수 있다.
  - 매개변수 사용으로 인해 쿼리 최적화 프로그램이 컴파일된 실행 플랜을
   재 사용할 확률이 높아진다.

 실제로, exec()와 sp_executesql은 Cache 매니저의 처리 방법 및 활동 상태가
다르다는 것을 마지막에 추가한 성능 모니터링을 통해서 알 수가 있을 것이다.

 이번 기회의 sp_executesql 시스템 프로시저 다양한 사용법과 관련 지식을 얻는데
미력하나마 도움이 되었으면 한다.
 그럼, 구문부터 살펴보자.    


구문.

 sp_executesql [@stmt =] stmt
 [
   {, [@params =] N'@parameter_name  data_type [,...n]' }
   {, [@param1 =] 'value1' [,...n] }
 ]

 인수설명.
  @stmt: T-SQL문 또는 배치 명령. ntext 형으로 변환될 수 있는
      변수 또는 유니코드 상수 문자열.
      내부에 @name 형식의 파라미터를 포함할 수 있다.

   @params: @stmt에 포함된 모든 파라미터의 이름과 데이터 타입을 정의한다.
   @param1: @params 파라미터에서 첫번째 파라미터에 할당할 값
   n : 각 파라미터에 대한 값을 할당한다.


참고.
  - UNICODE 문자열 상수를 지정할 때는 N'...'형식을 사용한다.
 sp_executesql 프로시저에 선언되어 있는 파라미터가 ntext형이기 때문에 문자열을
 직접 지정하실 때는 위와 같은 형태를 사용하시면 됩니다.

  - sp_executesql은 sql로 구성된 시스템 프로시저가 아니라, 확장 프로시저이다.
*/



/*
기본 예제.  
    TOP 절의 값을 동적으로 지정하고자 하는 경우
    (아래 구문은 set rowcount n 세션 옵션으로 대치할 수도 있다.)
*/
    declare @cnt as nvarchar(5)
    declare @stmt as nvarchar(100)
    set @cnt = '5'
    set @stmt = 'select top ' + @cnt + ' * from northwind.dbo.orders'
   
    exec sp_executesql @stmt



/*
기본 예제.  
    단순히 SQL을 동적으로 작성하고자 하는 경우로, @db의 값이 실행 시마다
    다른 데이터베이스명이 올 수 있다고 가정한다. 테이블명은 동일한다.
*/
    declare @db as nvarchar(20)
    declare @stmt as nvarchar(100)
    set @db = 'northwind'
    set @stmt = 'select * from '+ @db +'.dbo.orders'
   
    exec sp_executesql @stmt



/*
기본 예제.  
    하나 이상의 명령을, 배치로 실행
*/
    declare @stmt as nvarchar(500)
    set @stmt = 'use northwind; '
    set @stmt = @stmt + 'select top 5 * from dbo.orders where
orderid=10248; '
    set @stmt = @stmt + 'select top 5 * from dbo.[order details] where
orderid=10248'
   
    exec sp_executesql @stmt


/*
입력 파라미터를 적용한 예제.  

    @orderid 입력 파라미터를 이용해서 해당 주문 번호를 가진
 [order details] 테이블의 주문 제품 정보를 출력
*/
    use northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
    set @params = '@orderid int'
   
    exec sp_executesql @stmt, @params, @orderid=10248


/*
입력 파라미터를 적용한 예제.  

    위 예제를 실제로 저장 프로시저 안에서 연동한 경우.
*/
    use northwind

    create proc upOrderDetailsSel
        @porderid    int
    as
        declare @stmt as nvarchar(100)
        declare @params as nvarchar(100)
        set @stmt = 'select productid, quantity, unitprice from '
      set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
        set @params = '@orderid int'
       
        exec sp_executesql @stmt, @params, @orderid=@porderid
    go
    exec upOrderDetailsSel @porderid = 10248



/*
input 파라미터를 적용한 예제.  

    @table을 입력 파라미터를 이용해서 실제 입력할 대상 테이블을 결정,
    입력될 컬럼값들 또한 입력 파라미터로 처리한 예제.

*/
    -- 아래 테스트용 테이블을 우선 작성할 것.
    create table northwind.dbo.table1 (
        a    int
    ,    b int
    , c int
    )

    use northwind

    declare @table as nvarchar(20)
    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)

    set @table = 'dbo.table1'
    set @stmt = 'insert into ' + @table + ' '
  set @stmt = @stmt + 'values (@a, @b, @c)'
    set @params = '@a int, @b int, @c int'
   
    exec sp_executesql @stmt, @params, @a=1, @b=2, @c=3

    -- 확인    
    select * from table1



/*
output 파라미터를 적용한 예제.  

     동적 SQL문 내에도 출력(OUTPUT) 파라미터를 선언하고
    결과 값을 리턴 받을 수 있다. 저장 프로시저에서 출력 파라미터를
    사용하는 것과 동일하게, 선언부와 호출부에 반드시 OUTPUT 키워드를
    지정한다.
*/
    use northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    declare @orderret as int

    set @stmt = 'select @ordercnt = count(*) from dbo.orders'
    set @params = '@ordercnt as int OUTPUT' -- OUTPUT 키워드에 주의

    -- 여기도 OUTPUT 키워드를 지정한다.
    exec sp_executesql @stmt, @params, @ordercnt = @orderret OUTPUT

    -- 확인    
    select @orderret




/*
이런 것은 지원이 안된다.

 *. sp_executesql은 배치, 저장 프로시저, 트리거처럼 한 배치로 실행된다.

 1. 동적 SQL문에서는 RETURN 문을 사용할 수 없다.

 2. 로컬 변수를 액세스 할 수 없다.
    declare @chr char(3)
    set @chr = 'abc'
   
    sp_executesql N'PRINT @CharVariable'
    GO

 3. 현재 데이터베이스가 변경되지 않는다.
    use pubs
    go
    sp_executesql N'use northwind'
    select * from shippers    -- shippers 테이블은 northwind에 있다.
    go

*/


/*
전문 개발자및 관리자를 위한 추가 정보

성능 비교.
    만일, 여러분이 Windows NT/2000의 성능 모니터의 사용법을 알고 있다면,
 아래 3가지 사용 예에 대한 모니터를 수행하고 각각 Cache Manager상의
 활동이 어떻게 다른지를 비교 해 보면 많은 도움이 될 것이다.
   
  아래에 성능 모니터에 모니터링할 관련 오브젝트 및 카운트을 적어 두었다.
        성능 개체
            SQL Server:Cache Manager
                - 모든 카운터
                - 다음 목록에서 인스턴스 선택
                    _Total
                    Adhoc Sql Plans
                    Execution Context
                    Procedure Plans
                    기타... (관심이 있다면)    
               

    참고.
        3개의 방법을 개별적으로 테스트할 때, Procedure Cache상에 동일한
    플랜이 재 사용되는 것을 방지하기 위해

        DBCC FREEPROCCACHE

     명령을 사용할 수 있다.
    이 명령은 프로시저 캐시에서 모든 요소를 제거한다.
  이 작업을 해 주어야, Cache Object Counter가 늘어나는 것을 볼 수 있다.

        그리고, 현재 Cache된 Object에 대한 정보를 보고자 하는 경우 아래

    쿼리를 이용하면 된다.
       
        select * from master..syscacheobjects
            where dbid = db_id('northwind')



1. 저장 프로시저 테스트용
    -- DROP PROC dbo.upOrderDetailsQuery
    CREATE PROC dbo.upOrderDetailsQuery
    @orderid int
    AS
        select productid, quantity, unitprice from dbo.[order details]
        where orderid = @orderid
    go

    EXEC dbo.upOrderDetailsQuery @orderid = 10248



2. sp_executesql

    USE Northwind

    declare @stmt as nvarchar(100)
    declare @params as nvarchar(100)
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid=@orderid'
    set @params = '@orderid int'
   
    exec sp_executesql @stmt, @params, @orderid=10248
    go
       


3. EXEC() 사용

    USE Northwind

    declare @stmt as nvarchar(100)
    declare @orderid varchar(10)
    set @orderid = '10248'
    set @stmt = 'select productid, quantity, unitprice from '
  set @stmt = @stmt + 'dbo.[order details] where orderid = '+ @orderid
       
    EXEC (@stmt)

*/

출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=39&MAEULNo=16&no=384&ref=201

Trackbacks 0 : Comments 0

Write a comment


[SQLServer] TRY..CATCH를 이용한 중첩 트랜잭션 예외처리.

DATABASE/SQLServer 2010. 8. 31. 10:17
TRY..CATCH를 이용한 중첩 트랜잭션 예외처리.  

개요.

TRY .. CATCH 구문 내에서의 트랙잭션 처리에 대해 어떻게 구현되는지 알아보는 것과 트랜잭션으로 처리하는 프로시저 내에서

다시 트랜잭션으로 처리하는 프로시저를 호출 시 제대로 작동하는지 확인하는 것이 이 문서의 목적입니다.


테스트 샘플.


테스트 샘플은 분모를 파라미터로 받아서 0을 제외한 값은 에러가 나지 않고 0인 값은 에러가 나는 예제입니다.



1. 테스트 테이블 생성

CREATE TABLE TryTest
(
       id1 int,
       id2 int
)

2. 부모 프로시저 작성.

CREATE PROCEDURE ParentTest

(
       @bunmo int
)
AS

BEGIN
SET NOCOUNT ON;

       BEGIN TRY

             BEGIN TRAN ParentTest1

                    INSERT INTO TryTest VALUES(2,1)

                    EXEC ChildTest @bunmo

                    PRINT('ParentTest')

                    INSERT INTO TryTest VALUES(2,2)

             COMMIT TRAN ParentTest1

       END TRY
       BEGIN CATCH

             ROLLBACK TRAN ParentTest1
             PRINT('Parent ERROR')

       END CATCH

       SET NOCOUNT OFF;

END 

3. 자식 프로시저 작성.

CREATE PROCEDURE ChildTest ( 
       @bunmo int
)

AS

BEGIN

SET NOCOUNT ON;

       BEGIN TRY

             BEGIN TRAN ChildTest1
                    INSERT INTO TryTest VALUES(1,1)
                    PRINT(1/@bunmo)
                    INSERT INTO TryTest VALUES(1,2)
                    COMMIT TRAN ChildTest1
       END TRY

       BEGIN CATCH
             ROLLBACK TRAN ChildTest1
             PRINT('Child ERROR')
       END CATCH

       SET NOCOUNT OFF;

END

4. 실행.

4.1. 에러 발생 시

EXEC ParentTest 0

실행 결과 : Parent ERROR
데이터 결과 : 데이터 쌓이지 않음.

흐름.

ParentTest
프로시저에 2,1 데이터를 등록 ChildTest 프로시저를 실행합니다.
ChildTest 내에서 1,1 인서트 0으로 나누려 했기 때문에 CATCH 구문으로 이동하여 롤백합니다.
'Child ERROR'
출력하지 않는 이유는 ROLLBACK TRAN ChildTest1 시점에 프로시저를 벗어나기 때문입니다.
다시 ParentTest으로 넘어온 ParentTest 출력하지 않고
부모에서 ROLLBACK 되었기 때문에
바로 CATCH 구문으로 이동합니다.
롤백 처리한 'Parent ERROR' 출력합니다.
결국 Parent, Child 모두 롤백되므로 인서트된 데이터들은 없습니다.

4.2. 정상 실행 시

EXEC ParentTest 1

실행 결과 :

1

ParentTest

데이터 결과 : 4건 등록됨.
2         1
1         1
1         2
2         2


흐름.
ParentTest 프로시저에 2,1 데이터를 등록 ChildTest 프로시저를 실행합니다.
ChildTest 내에서 1,1 인서트 1 나누려 했기 때문에 CATCH 구문으로 이동하지 않고 1,2 인서트 합니다.
트랜잭션을 COMMIT 시킨 Parent 돌아와서 ParentTest’ 출력 2,2 인서트하고 COMMIT 시킵니다.
 

5. 결론

TRY..CATCH 이용하여 중첩 프로시저 호출로 인한 트랜잭션 처리는 데이터 무결성을 보장합니다.

출처 : http://www.mobilepro.pe.kr/trackback_post_122.aspx

tags : SQLServer
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] DB프로그램 개발자들을 위한 지침

카테고리 없음 2010. 6. 27. 19:48

1. DB 생성시 주의사항
1) DB 명칭은 해당 서비스를 파악할 수 있도록 명명한다.

2. USER 생성시 주의사항
1) USER ID는 유관 서비스를 파악할 수 있도록 명명한다.
2) Password는 운용팀 DBA의 생성규칙을 따른다.


3. 테이블 생성시 주의사항
1) Table Column 길이의 합이 8K를 넘지 않도록 할 것
2) Table 및 Column 이름은 일관성 있게 줄 것 (예: TB_, str_)
3) PK / FK Column은 고정길이 형식을 사용할 것 (예: CHAR Type)
4) Trigger의 사용을 자제
5) Table의 소유자는 항상 ‘DBO’가 되도록 한다


4. 인덱스 생성시 주의사항
1) Where 절에서 많이 사용하는 경우 생성
2) Covered Index인 경우 선택도가 좋은 조건(10%이하) 부터 순서대로 생성
3) 구간별 선택이 많은 컬럼인 경우 클러스터 인덱스 추전
4) PK정의시 넌클러스터 인덱스로 정의하되 3)항 조건이 만족하면 클러스터 인덱스로 생성


5. 쿼리
1) SELECT 시 주의 사항들
- 꼭 필요한 컬럼만 선택하여 정의되었는지
- Count(컬럼명)대신 Count(*)를 사용하는가
- 각 종 연산문(+,-,*,/) 자제요망
- 원하는 결과 값을 찾는 적절한 WHERE절을 사용 하는가?
- WHERE절에서 인덱스를 사용 할 수 있게 했는가?
- 단순 SELECT면 with NOLOCK옵션을 주었는가?
 예: SELECT au_lname FROM authors WITH (NOLOCK))</CODE></PRE>

 
2) WHERE 절 작성시 주의 사항들
- 테이블 컬럼의 DATA가 가공되는 함수 및 연산자 사용금지
 (EX: LIKE ‘L%’ 이것을 사용하지 않고 LIKE ‘%L%’를 사용하는 것은 아닌가?)
(SELECT * FROM ST WHERE Qty + 1  20 권장
 SELECT * FROM ST WHERE Qty  20 -1 )
- 조건식의 순서는 선택도가 좋은 컬럼부터 기술한다.


3) Index Seek을 하는지 반드시 점검
 - Index scan, table scan은 서버 및 서비스에 악영향을 미침

6. Procedure 생성시 주의사항
- Table Column 길이의 합이 8K를 넘지 않도록 할 것
- Table 및 Column 이름은 일관성 있게 줄 것 (예: TB_, str_)
- PK / FK Column은 고정길이 형식을 사용할 것 (예: CHAR Type)
- cursor사용시 주의 사항들
- 항상 주석처리할 것 (최초만든자,수정일,수정자,사용예등..)_차후 SP 수정시에도 주석수정


7. 커서 및 임시 테이블의 내용을 최대한 자제 하는가?


8. view의 총 사용을 줄였는가?


9. 저장프로시져를 사용하는가?
- 저장프로시져를 적절하게 리컴파일 하면서 사용하는가?
- 프로시저의명칭에 적당한 접두어 규칙을 사용하는가?
(EX:사용자 프로시져는 up_로 시작하는가? 테이블은 tb_로 시작하는가 등)
- 프로시져나 뷰등을 생성 할 때 소유자를 DBO로 지정해 주고 있는가?
- 모든 소유자는 dbo로 통일하는 것을 권장합니다.(소유권 체인 문제 발생 예방)
- SP를 만들 때도 항상 CREATE PROC DBO.SP이름 형식으로 만드는가?
 

10. 잠금관련 권고사항
- 트랜잭션은 가능한 짧게 만들었는가?
- 데드락을 피하기 위해 같은 방향으로 트랜잭션을 진행하는가?
- 잠금수준을 내려서 불필요한 잠금을 없애고 있는가?.(read uncommitted)
- 트리거를 사용하지 않습니다.
- 대규모 데이터 변경시에만 커서를 사용합니다.
 

11. SET NOCOUNT ON 을 사용하는가?
- 프로시저를 작성할 때 SET NOCOUNT ON과 같은 환경설정은 먼저 실행해 두고 프로시저를 작성하는가
 

12. 임시 테이블 대신 테이블 변수 사용하는가?
 

13. ANSI SQL문법을 사용하고 있는가?

- 다음과 같이 T-SQL로 구성 된 것을 ANSI-SQL구문으로 변경
SELECT t.title_id, qty, title
FROM titles t , sales s
WHERE t.title_id *=s.title_id
이 구문은 T-SQL구문을 사용 해서 표현한 방식인데 추후 변경 가능 성이나 가독성을 위해서 ANSI-SQL문법을 사용 할 것을 권장
SELECT t.title_id, qty, title
FROM titles t LEFT OUTER JOIN sales s
  ON t.title_id = s.title_id
 

14. 만든 구문을 SET statistics time, SET statistics IO를 ON으로 하고 각 쿼리들이 얼마의 시간
이 소용되는지 체크 해 보았는가?


15. 쿼리가 인덱스를 사용하고 있는지 확인 하였는가?
- 많이 사용 하는 쿼리가 밑의 방식대로 확인을 했는데 Index Scan라고 인덱스를 생성 해야 한다.
- 확인 방법 : 쿼리를 작성 후 CTRL + L를 클릭 하여 실행 계획을 인덱스를 사용 하고
있는지를 확인 한다. Clustered Index Seek이나 index Seek은 인덱스를 정상적으로
사용 하는 것이지만 Scan으로 되어 있다면 인덱스를 사용 하지 않는 것이다.
 

16. 사용량이 많은 쿼리에서 사용하는 컬럼에 인덱스가 없다면 신청 하였는가?
 

17. 현재 프로그램에 하드코딩된 쿼리를 SP로 만들어 사용 할 수는 없는 것들인가?
- 생각 중?  사용 할 수 없다면 그 이유는 무엇인가? - DBA와 협의

 
18. 동적 쿼리를 사용시 EXEC (@str)이 아니고 EXEC sp_executesql을 사용 하고 있는가?
- EXEC (@str)이 것은 한번 사용한 실행계획을 계속 사용 할 수가 없고 매번 다시 만들게
되므로 성능 저하의 원인이 된다. 그러므로 실행 계획을 재 사용 할 수 있는
EXEC sp_executesql을 사용 할 것을 권장 한다.


19. 변수 사용해서 값을 비교 시 WHERE 절에서 문자열 함수를 사용하고 있는 것은 아닌가?
(예: convert(varchar(10),date1,120) = @층, Left(date1,1,8))
 

20. 다른 서버에서 정보를 가져 올 때 연결된 서버를 이용할 때 4Part name방식 말고
OPENQUERY를 사용하고 있는가?
(예 : SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=192.168.168.1;User ID=sa;Password=password').PUBS.DBO.titles )


21. 임시 테이블 보다는 인라인 뷰를 사용하자.
 

22. 서브쿼리 사용시 주의 사항들
- 서브쿼리보다는 조인을 사용하자


23. cursor사용시 주의 사항들
- 클라이언트 측 커서를 사용하자 (커서를 자제 해야 하지만 사용해야 한다면)
: 서버의 커서를 사용할 때에는 가능한 작은 결과 셋을 가져오도록 한다
: 커서를 다 사용한 후에는 그냥 닫지만 말고(close) 말고 반드시 해제(deallocate) 시켜
야 한다.


24. select 성능향상지침 <BR>- Distinct, Order by 를 사용 할 때는 주의 해야 한다.
- 중복 값을 제거하지 않아도 된다면 UNION대신 UNION ALL을 사용하자.


25. insert 성능향상지침
- SELECT … INTO 는 각 로우들의 입력 과정이 로그로 기록 되지 않으므로 로그로 기록
되는 INSERT보다는 가끔 몇 배나 빨리 처리 된다. 그렇지만 이 명령은 시스템 테이블에
락을 걸어 둘 수 있으므로 주의 하여 사용해야 한다.


26. DATA Type의 정의
- 컬럼에 필요한 데이터를 저장할 수 있는 데이터 타입 가운데 항상 가장 작은 데이터 타입
 을 선택한다.
- 컬럼에 저장되는 텍스트 데이터의 길이가 매우 가변적이라면 CHAR 대신 VARCHAR 데이
터 타입을 사용하는 것이 좋다.
- 16비트 문자(유니코드) 데이터를 저장할 계획이 아니라면 NVARCHAR 또는 NCHAR 데이터
타입을 사용하지 않는 것이 좋다.
- 긴 문자열을 저장할 때, 문자열의 길이가 8000자 이하라면 TEXT 대신 VARCHAR 데이터 타입을 사용하는 편이 좋다.
- 숫자만을 저장하는 컬럼은 VARCHAR 또는 CHAR 대신 INTEGER와 같은 숫자 데이터 타입을 사용하는 것이 좋다.

 

tags : SQLServer
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] 데이터베이스 용량관리

카테고리 없음 2010. 3. 16. 11:00

USE AdventureWorks
GO

EXEC sp_helpfile                    -------- 1)

EXEC sp_spaceused                -------- 2)

DBCC sqlperf(logspace)          -------- 3)

ALTER DATABASE AdventureWorks
MODIFY FILE
(
NAME = AdventureWorks_Data,
SIZE = 500
)
EXEC sp_helpfile                    -------- 4)


ALTER DATABASE AdventureWorks
MODIFY FILE
(
NAME = AdventureWorks_Data,
FILEGROWTH = 100,
MAXSIZE = 500
)
GO                                     -------- 5)

ALTER DATABASE AdventureWorks
MODIFY FILE
(
NAME = AdventureWorks_Log,
FILEGROWTH = 10,
MAXSIZE = 200
)
GO                                     -------- 6)

EXEC sp_helpfile                   -------- 7)


DBCC SHRINKFILE(AdventureWorks_Data,200)  -------- 8)


1) 데이터 파일 공통 정보 확인
아래와 같이 데이터 파일의 논리적 이름과 트랜잭션 로그 파일의 논리적 이름을 알 수 있다.

사용자 삽입 이미지





- filename : 파일의 경로와 실제이름
- filegroup
- size : 현재 파일 크기
- maxsize : 파일의 최대크기
- growth : 파일의 증가설정


2) 데이터 파일 사용량 확인

사용자 삽입 이미지








- database size : 데이터 파일과 트랜젝션 로그파일의 용량을 합한 값
- unallocated space : 데이터 파일의 남아있는 용량
- data size, index size : 데이터 파일 내에서 data와 index별 사용량
- unused : 운영상 데이터베이스의 개체에 예약되었지만 아직 사용되지 않은 공간

3) 트랙잭션 로그 파일 사용량 확인

사용자 삽입 이미지











AdventureWorks의 경우 약 1.99MB의 현재 파일 크기를 가지고 있으며 약 39%가 사용 중인 것을 알 수 있다.


4) 데이터 베이스 용량 늘리기
300 -> 500으로 변경
스크립트 실행 후, EXEC sp_helpfile로 변경 내역 확인


5) 데이터 파일 최대 크기와 자동 증가 설정 변경

6) 로그파일 최대 크기돠 자동 증가 설정 변경

7) 변경 내역 확인

사용자 삽입 이미지






8) 데이터베이스 용량 줄이기






Trackbacks 0 : Comments 0

Write a comment


[SQLServer] 데이터의 길이 가져오기

DATABASE/SQLServer 2009. 12. 21. 16:26

SQL Server에서 컬럼 값의 길이를 가져와야 할 경우, 크게
- 그냥 길이
- byte수
로 구분할 수 있다.

오라클에서는

1) SELECT LENGTH('모델링월드')   FROM DUAL;
2) SELECT LENGTHB('모델링월드') FROM DUAL;
일 경우


1)은 5, 2)는 10을 리턴한다.

이건 이전 부터 알고있었는데, 요걸 SQLServer에서 사용할 일이 생겼다.
열심히 찾아 보았다. ^^;
역시 있었다.

문법도 오라클과 동일하다.

DATALENGTH ( expression )


-인수
expression
임의 데이터 형식의 식입니다.

-반환 값
int

1) SELECT LEN('모델링월드')
2) SELECT DATALENGTH('모델링월드')
일 경우
1)은 5, 2)는 10을 리턴한다.

여기서 주의할 것은 오라클은 문자열 뒤의 공백을 길이 또는 바이트수에 포함시키는 반면
SQLServer는 문자열 뒤의 공백은 포함하지 않는다.

1) SELECT LEN('모델링월드 ')
2) SELECT DATALENGTH('모델링월드 ')

1)일 경우 6이 아닌 5를 리턴한다.(DATALENGTH는 데이터 길이 그대로 11을 리턴한다)

tags : SQLServer, 길이
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] Unix_timestamp 형식의 데이터를 일반시간으로 변환

DATABASE/SQLServer 2009. 8. 27. 20:03

DATEADD(hh, 9, DATEADD(s, regdate, '1970-01-01'))

tags : SQLServer
Trackbacks 0 : Comments 0

Write a comment


[SQLServer] SQLServer2005설치 후 확인하기

DATABASE/SQLServer 2009. 7. 14. 10:46
SQLServer2005설치 후 잘 설치가 되었는지 확인해보자.

1. 실행 에서services.msc입력 후 확인



2. 서비스 창에
- SQL Server(ADMIN1)
- SQL Server Agent(ADMIN1)
- SQL Server Analysis Services(ADMIN1)
- SQL Server FullText Search(ADMIN1)
등 의 서비스가 "시작됨"으로 되어있으면 정상적으로 설치된것이다.
"ADMIN1"은 명명된 인스턴스로 설치했을 경우 입력한 이름입니다.




혹! 틀린부분이 있다면 의견 바랍니다~^^
tags : 2005, SQLServer
Trackbacks 0 : Comments 0

Write a comment