컴퓨터과학/Database 2013.09.18 00:15

SELECT TOP 20

 [Average CPU used] = total_worker_time / qs.execution_count

,[Total CPU used] = total_worker_time

,[Execution count] = qs.execution_count

,[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 

         (CASE WHEN qs.statement_end_offset = -1 

            THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 

          ELSE qs.statement_end_offset END - 

qs.statement_start_offset)/2)

,[Parent Query] = qt.text

,DatabaseName = DB_NAME(qt.dbid)

FROM sys.dm_exec_query_stats qs

CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt

ORDER BY [Total CPU used] DESC, [Average CPU used] DESC;

posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.09.17 23:31
응용 프로그램 성능 최적화를 위한 숨겨진 데이터 찾기 by Ian Stirk

http://msdn.microsoft.com/ko-kr/magazine/cc135978.aspx



쿼리 튜닝 MSDN

http://msdn.microsoft.com/ko-kr/library/ms176005(v=sql.100).aspx



posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.09.17 22:27

누락된 인덱스를 확인하고 생성해줌으로써 DB 성능을 개선시킬 수 있다.


-- 누락된 인덱스 확인 쿼리

SELECT  TOP 30

        [Index Advantage] = ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0) 

        , avg_user_impact

        , TableName = statement

        , [EqualityUsage] = equality_columns 

        , [InequalityUsage] = inequality_columns

        , [Include Cloumns] = included_columns

        , [Unique Compiles] = unique_compiles

        , user_seeks

FROM        sys.dm_db_missing_index_groups g WITH (NOLOCK)

INNER JOIN    sys.dm_db_missing_index_group_stats s WITH (NOLOCK)

       ON s.group_handle = g.index_group_handle 

INNER JOIN    sys.dm_db_missing_index_details d WITH (NOLOCK)

       ON d.index_handle = g.index_handle

ORDER BY [Index Advantage] DESC;

equality_columns : WHERE절에 같음(=) 조건으로 사용되는 컬럼

inequality_columns : WHERE절에 같지 않은(<,>) 조건으로 사용되는 컬럼

included_columns : SELECT 절에 나오는 컬럼


나온 결과를 토대로 equality_columns와 inequality_columns의 컬럼들로 인덱스 생성, included_columns의 컬럼들은 포괄열에 포함시켜줌(확인중)


쿼리의 컬럼 설명


sys.dm_db_missing_index_group_stats

열 이름

데이터 형식

설명

group_handle

int

누락된 인덱스 그룹을 식별합니다. 이 식별자는 서버에서 고유합니다.

다른 열은 그룹의 인덱스가 누락된 것으로 간주되는 모든 쿼리에 대한 정보를 제공합니다.

인덱스 그룹에는 인덱스가 하나만 포함되어 있습니다.

unique_compiles

bigint

이 누락된 인덱스 그룹에 적합한 컴파일 및 다시 컴파일 수입니다. 서로 다른 많은 쿼리의 컴파일 및 다시 컴파일이 이 열 값에 영향을 줄 수 있습니다.

user_seeks

bigint

그룹의 권장 인덱스가 사용되었을 수 있는 사용자 쿼리에 의해 수행된 검색(Seek) 수입니다.

user_scans

bigint

그룹의 권장 인덱스가 사용되었을 수 있는 사용자 쿼리에 의해 수행된 검색(Scan) 수입니다.

last_user_seek

datetime

그룹의 권장 인덱스가 사용되었을 수 있는 사용자 쿼리에 의해 수행된 마지막 검색(Seek)의 날짜와 시간입니다.

last_user_scan

datetime

그룹의 권장 인덱스가 사용되었을 수 있는 사용자 쿼리에 의해 수행된 마지막 검색(Scan)의 날짜와 시간입니다.

avg_total_user_cost

float

그룹의 인덱스로 줄일 수 있는 사용자 쿼리의 평균 비용입니다.

avg_user_impact

float

누락된 인덱스 그룹을 구현할 경우 사용자 쿼리에서 얻을 수 있는 적합한 평균 백분율입니다. 즉, 이 누락된 인덱스 그룹을 구현할 경우 쿼리 비용이 평균적으로 이 백분율만큼 감소합니다.

system_seeks

bigint

그룹의 권장 인덱스가 사용되었을 수 있는 auto stats 쿼리와 같은 시스템 쿼리에 의해 수행된 검색(Seek) 수입니다. 자세한 내용은 Auto Stats 이벤트 클래스를 참조하십시오.

system_scans

bigint

그룹의 권장 인덱스가 사용되었을 수 있는 시스템 쿼리에 의해 수행된 검색(Scan) 수입니다.

last_system_seek

datetime

그룹의 권장 인덱스가 사용되었을 수 있는 시스템 쿼리에 의해 수행된 마지막 시스템 검색(Seek)의 날짜와 시간입니다.

last_system_scan

datetime

그룹의 권장 인덱스가 사용되었을 수 있는 시스템 쿼리에 의해 수행된 마지막 시스템 검색(Scan)의 날짜와 시간입니다.

avg_total_system_cost

float

그룹의 인덱스로 줄일 수 있는 시스템 쿼리의 평균 비용입니다.

avg_system_impact

float

누락된 인덱스 그룹을 구현할 경우 시스템 쿼리에서 얻을 수 있는 적합한 평균 백분율입니다. 즉, 이 누락된 인덱스 그룹을 구현할 경우 쿼리 비용이 평균적으로 이 백분율만큼 감소합니다.



sys.dm_db_missing_index_details

열 이름

데이터 형식

설명

index_handle

int

특정 누락된 인덱스를 식별합니다. 이 식별자는 서버에서 고유합니다. index_handle은 이 테이블의 키입니다.

database_id

smallint

누락된 인덱스가 있는 테이블이 위치한 데이터베이스를 식별합니다.

object_id

int

인덱스가 없는 테이블을 식별합니다.

equality_columns

nvarchar(4000)

다음 형식의 같음 조건자에 적용되는 쉼표로 구분된 열 목록입니다.

table.column =constant_value

inequality_columns

nvarchar(4000)

다음 형식의 같지 않음 조건자에 적용되는 쉼표로 구분된 열 목록입니다.

table.column > constant_value

"="가 아닌 모든 비교 연산자는 같지 않음을 표시합니다. 전체 비교 연산자 목록은 비교 연산자(데이터베이스 엔진)를 참조하십시오.

included_columns

nvarchar(4000)

쿼리에 대한 포함 열로서 필요한 쉼표로 구분된 열 목록입니다. 포함 열 또는 포괄 열에 대한 자세한 내용은 포괄 열을 사용하여 인덱스 만들기를 참조하십시오.

statement

nvarchar(4000)

인덱스가 없는 테이블의 이름입니다.


참고로 SQL서버 재시작시 통계 초기화 됨.


자세한 내용은 아래 링크 참조

http://technet.microsoft.com/ko-kr/library/ms345417(v=sql.105).aspx

http://msdn.microsoft.com/ko-kr/library/ms187974(v=sql.100).aspx


posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.09.04 16:04

하이픈(-)은 일반적으로 빼기 연산자로 사용되지만..

간혹 하이픈이 포함된 컬럼명을 사용하는 경우가 있다.

e-mail 같은...?


SELECT e-mail, e, mail FROM tablename


위와같은 tablename이라는 테이블에 e-mail, e, mail이라는 세 개의 필드가 있다고 가정할 때에 e-mail은 e 빼기 mail로 연산하게 된다.


그럼 e-mail필드를 참조하고 싶을때에는 아래와 같이 쌍따옴표 혹은 []로 묶어준다.


SELECT "e-mail", e, mail FROM tablename 

SELECT [e-mail], e, mail FROM tablename 



posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.09.04 15:44

1. 백업을 원하는 데이터베이스 백업 (bak파일 생성)

BACKUP DATABASE Car0904

TO DISK = 'D:\backup\car_0904.bak'


2. 복구를 원하는 DB의 디스크에 bak 파일 복사


3. DB 생성


4. 데이터베이스 복구

RESTORE DATABASE Car_0904
FROM DISK = 'D:\backup\car_0904.bak'
WITH REPLACE


DB를 생성하며 복구하는 방법도 있지만..

복잡한 MDF와 LOG의 파일 경로를 모두 적어줘야해서(귀찮아서)

DB를 SSMS를 통해 미리 생성하고 복구한다.


posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.08.09 21:11

동적쿼리로 OUTPUT값 출력


DECLARE @outVal INT

DECLARE @stmt NVARCHAR(MAX), @params NVARCHAR(MAX)


SET @stmt = 'SELECT @inVal = 1234'
SET @params = '@inVal INT OUTPUT'


EXEC sp_executesql @stmt, @params, @inVal = @outVal OUTPUT


--확인

print @outVal


동적쿼리 호출시 파라미터 부분에서는 특이하게 = 연산자가 의미가 반대가 된 느낌이다.

단순히 연결시킨다는 의미 정도로 보면 될거 같다.

@inVal = @outVal OUTPUT

[동적쿼리내부변수] = [로컬변수] 

posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.08.08 14:07

컬럼 타입 변경

ALTER COLUMN [테이블명] ALTER COLUMN [컬럼명] 타입

1. 해당 컬럼에 제약조건이 있는 경우 불가능

2. 기존 값이 변경될 타입에 포맷이 맞지 않는 경우 불가능


불가능한 경우 원하는 타입의 컬럼을 미리 만들고 데이터 복사 후 이름 변경

1. 새로운 컬럼 생성

ALTER TABLE [테이블명] ADD [컬럼명] 타입

2. 값 복사

UPDATE [테이블명] SET [새컬럼명] = [옛컬럼명]

3. 기존 컬럼 이름 변경

SP_RENAME '테이블명.[옛컬럼명]', '옛컬럼명_old', 'COLUMN'

4. 새로운 컬럼을 기존 이름으로 변경

SP_RENAME '테이블명.[새컬럼명]', '옛컬럼명', 'COLUMN'


'컴퓨터과학 > Database' 카테고리의 다른 글

[MSSQL] identity 초기값 변경하기  (0) 2013.08.20
[MSSQL] 동적쿼리 OUTPUT  (0) 2013.08.09
[MSSQL] 컬럼 타입변경  (0) 2013.08.08
[MSSQL] 테이블에서 없는것만 INSERT  (0) 2013.08.07
[MSSQL] UPDATE with SELECT Statement  (0) 2013.08.07
JOIN의 종류와 이해  (0) 2012.03.27
posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.08.07 15:18

INSERT INTO TB_Test1 phone )

SELECT B.phone FROM TB_Test1 A

RIGHT OUTER JOIN 

(

SELECT phone FROM TB_Test2

) AS B ON A.phone = B.phone 

WHERE A.phone IS NULL

'컴퓨터과학 > Database' 카테고리의 다른 글

[MSSQL] 동적쿼리 OUTPUT  (0) 2013.08.09
[MSSQL] 컬럼 타입변경  (0) 2013.08.08
[MSSQL] 테이블에서 없는것만 INSERT  (0) 2013.08.07
[MSSQL] UPDATE with SELECT Statement  (0) 2013.08.07
JOIN의 종류와 이해  (0) 2012.03.27
[SQL Server] Windows 인증 연결 문자열  (0) 2012.03.23
posted by 연식킴

댓글을 달아 주세요

컴퓨터과학/Database 2013.08.07 14:07

자꾸 까먹어서 남겨둠...


UPDATE A

SET A.value = B.value

FROM TB_test1 AS A

INNER JOIN TB_test2 AS B ON A.key = B.key

WHERE절


정도가 되겠다...

'컴퓨터과학 > Database' 카테고리의 다른 글

[MSSQL] 동적쿼리 OUTPUT  (0) 2013.08.09
[MSSQL] 컬럼 타입변경  (0) 2013.08.08
[MSSQL] 테이블에서 없는것만 INSERT  (0) 2013.08.07
[MSSQL] UPDATE with SELECT Statement  (0) 2013.08.07
JOIN의 종류와 이해  (0) 2012.03.27
[SQL Server] Windows 인증 연결 문자열  (0) 2012.03.23
posted by 연식킴

댓글을 달아 주세요