posted by 2016. 8. 8. 23:22

MSSQL Server 2008 에서 백업 스케쥴 생성 하는 법이다..

1. Management Studio 에서 관리 -> 유지관리계획 -> 오른클릭 -> 새 유지 관리 계획 선택
  - 새로 만들 스케쥴의 이름을 적고 확인

사용자 삽입 이미지



2. 왼쪽 하단의 도구 상자에서 "데이터베이스 백업 태스크" 와 "유지관리 정리 태스크" 를 오른쪽으로 드래그 해서 가져온다

사용자 삽입 이미지


3. 가져온 데이터베이스 백업 태스크의 글씨가 없는 부분을 더블클릭하면 아래와 같은 창이 뜬다
 - 글씨 부분 더블 클릭하면 text수정 모드가 되므로 빈 공간을 찾아서 더블 클릭하세요
 - 데이터 베이스를 선택해보면 자신이 직접 선택할 수도 있고 기본은 전체 DB로 되어있다.
 - 전체 데이터 베이스를 백업 할거라서 모든 데이터 베이스 백업을 선택했음.. 기본값은 bak 이며  .bak 이아니라 bak 임을 잊지 말자

사용자 삽입 이미지




4. 유지 관리 정리 태스크를 더블 클릭 하면 아래와 같은 창이뜬다.
 - "확장명에 따라 폴더 검색 및 파일 삭제 " 를 선택하고 폴더는 위에 백업 대상 폴더와 동일하게 설정해준다.
 - 파일 확장명은 txt에서 bak으로 바꿔준다  .bak 이 아니라 bak 임을 잊지 말자.
 - 기간은 적당히 3일로 잡았다.
  ( 파일이 계속 쌓이면 하드 용량이 부족하므로 일정 기간이 지나면 삭제 하는 기능임)

사용자 삽입 이미지




5. 다시 유지 관리 계획에서 빨간 표시의 일정관리를 선택한다.
 - 백업이 진행되는 일정을 설정하는 곳이다
 - 매일 새벽 1시에 하루 한번 백업 되도록 설정 했다.
 

사용자 삽입 이미지




위와 같이 하고 Ctrl+S 로 저장.하면 이제적용 된다.!!

 

출처 : http://sadtear.tistory.com/137

posted by 2010. 7. 14. 09:15

Ms-Sql의 컬럼을 암호화하기 위한 내장함수가 있다.

-PwdEncrypt : 컬럼의 데이터를 암호화한다. ex. PwdEncrypt('암호화할 데이터')
-PwdCompare : 암호화한 데이터를 비교해서 확인한다. ex. PwdCompare('데이터', 암호화컬럼)

간단 예제

create table TEST (
--password varchar(100) varbinary(500)
password varbinary(500) -- varbinary 타입으로 하자

);

테이블을 만든 후

insert into TEST values (PwdEncrypt('1111'));

데이터를 암호화하여 넣은 후 select해보자

select PwdCompare('1111', password) from TEST
결과 : 1

select PwdCompare('2222', password) from TEST
결과 : 0

PwdCompare의 결과는 1이나 0으로 리턴된다. 1이면 맞는거고 0이면 틀린것이다.
 

 MySQL 에서는 password()

 

1. PwdEncrypt - 암호화

PwdEncrypt('암호화문자')

ex) INSERT INTO members(user_id, password) VALUES('myid', PwdEncrypt('mypwd'))

 

2. PwdCompare - 비교

PwdCompare('비교대상문자', '암호화 된 문자')
->양쪽이 같으면 1을 리턴 다르면 0 리턴, 둘중하나가 NULL 이면 NULL 을 리턴

ex) SELECT PwdCompare('1234', password) FROM members WHERE user_id = 'myid'

posted by 2010. 7. 7. 15:34

MS-SQL Server 날짜에 대한 함수

 

함수

매개변수

내용

Getdate

()

현재 날짜와 시간

DateADD

(datepart, number, date)

Datepart 부분에 number 값을 더한다.

DateDiff

(datepart, date1, date2)

두 날짜 사이의 datepart

DateName

(datepart, date)

Date에 대한 datepart를 이르믕로 돌려준다.

DatePart

(datepart, date)

Date에 대해 지정된 datepart 를 돌려준다.

Day

(date)

Datepart(day,date)와 같다.

Month

(date)

Datepart(Month, date)와 같다.

Year

(date)

Datepart(Year, date)와 같다.

 

시스템의 현재의 시간과 날짜를 가져온다.

 

Select Getdate()

Go

 

Style 유형

유형

유형

의미

나타나는 형식

-

0 or 100

Default

Mon dd yyyy hh:mi AM(or PM)

1

101

USA

Mm/dd/yy

2

102

ANSI

yy.mm.dd

3

103

British / French

Dd/mm/yy

4

104

German

dd.mm.yy

5

105

Ltalian

Dd=mm-yy

6

106

-

Dd mon yy

7

107

-

Mon dd, yy

8

108

-

Hh:mi:ss

-

9 or 109

Defautl

+ Milliseconds

Mon dd, yyyy hh:mi:ss:ms AM

(or PM)

10

110

USA

mm-dd-yy

11

111

Japan

Yy/mm/dd

12

112

ISO

yy.mm.dd

-

13 or 113

Europe Default

Dd mon yyyy hh:mi:ss:ms(24h)

14

114

-

Hh:mi:ss:ms(24h)

 

위의 style형태를 이용하여,

 

Ms(밀리 세컨드)까지 데이터를 가져오고 싶다면 다음과 같이 해야한다.

 

Select Convert(Varchar(30), Getdate(), 9)

go

 

또는 우리가 친숙한 yy.mm.dd 형식으로 표현하고 싶다면 그에 해당하는 유형 변호만 주면 된다.

 

Select Convert(Varchar(30), Getdate(), 2)

Go

 

Select Convert(Varchar(30), Getdate(), 102)

Go

 

첫번째 유형과 두번째 유형과의 차이는 직접해보면 아시겠지만, 년도 펴시에서 세기가 붙는지 않붙는지가 틀리다.

 

DatePart 내용

Datepart

약어

범위

Year

Yy

1753 9999

Quarter

Qq

1-4

Month

Mm

1-12

Day of year

Dy

1-366

Day

Dd

1-31

Week

Wk

0-51

Weekday

Dw

1-7(1이 일요일)

Hour

Hh

0-23

Minute

Mi

0-59

Second

Ss

0-59

Millisecond

ms

0-999

 

 

위의 표를 참고하여, 원하는 ‘월’만 가져오려면 다음과 같이 하면 된다.

 

Select Datepart(mm, Getdate())

Go

 

MS-SQL Server Version7.0 이후부터는 위의 방법 말고도 더 쉬운 방법이 생겼다.

 

Select Month(Getdate())

Go

 

오늘부터 20개월 후는 언제인지 알려면 다음과 같이 하면 된다.

 

Select Dateadd(mm, 20, Getdate())

Go

 

오늘부터 100일 후에는 언제일까 ?

 

Select  Dateadd(dd, 100, Getdate())

Go

 

역시 7.0 이후에서는 이 방법 말고도 더 쉬운 방법이 생겼다.

 

Select Getdate() + 100

Go

 

그럼 3000년까지는 몇 일이나 남았을까 ?

 

Select Datediff(dd, Getdate(), 3000.1.1)

go

 

다음 예제도 한번 보자. 한글 요일명이 출력된다.

 

Select DateName(dw, Getdate()), Datename(nm, Getdate())

Go

 

이상으로 쿼리문에서 자주 사용되는 날짜 관련 함수에 대해서 알아봤다.


posted by 2009. 3. 6. 01:41

1. 가능한 윈도우 인증을 사용한다.
Windows Authentication if you Can

 

2. sa계정 사용을 주의한다.
Watch your SA Account Usage

 

3. BUILTIN/Administrators 그룹을 제거한다.
Remove BUILTIN/Administrators

 

4. 서비스 시작 계정을 변경한다.
Change the Startup Account

 

5. 실패한 로그인과 거부된 로그인을 감사한다.
Auditing of Failed Logins and Denied Access

 

6. 최신 서비스팩과 핫픽스를 적용하고 유지한다.
Stay Up on Service Packs and Hot Fixes

 

7. 확장 저장 프로시져를 보호한다.
Protect Your Extended Stored Procedures

 

8. SQL서버 포트를 변경하고 보호한다.
Change the SQL Server Port and Block it

 

9. 저장 프로시져를 통한 접근을 제어한다.
Control Access Through Stored Procedures

 

10. OS를 보호한다.
Protect Your OS

posted by 2009. 3. 6. 01:40

좋은 테이블 설계의 4가지 규칙

 

1. 테이블의 각 필드는 고유한 종류의 정보를 나타내야 한다.

 

2. 각 테이블은 테이블에서 하나나 여러개의 필드로 구성된 고유 식별자나 기본키를 갖고 있어야 한다.

 

3. 각 고유한 기본키 값에 대해 데이터 열의 값은 테이블의 주제와 관련이 있어야 하고 그 주제를 완전히 설명할 수 있어야 한다.

 

4. 어떤 필드(기본키로 지정한 필드)의 데이터를 바꿀 때 다른 필드의 데이터에 영향을 끼치지 않고 바꿀 수 있어야 한다.

posted by 2009. 3. 6. 01:39

1. 로그 파일들의 크기를 확인한다.
DBCC SQLPERF(LOGSPACE)

2. 로그파일을 지운다.
BACKUP LOG 디비명 WITH NO_LOG

3. 로그파일 크기를 설정한다. M단위로.. (아래꺼는 10메가)
USE weddingra DBCC SHRINKFILE(디비명_LOG, 10)

4. 로그 파일들의 크기를 다시 확인한다.
DBCC SQLPERF(LOGSPACE)

5. 조금씩 반복적으로...

http://www.devbank.co.kr/skyoh_board/board.php?start=0&idx=13&mode=view&num=66&t_search=&code=tip_db

======================================================================================

 

SQL 쿼리 분석기에서 아래의 명령어를 실행 시킨다.

--데이터베이스의 로그 비우기
backup log 디비명 With TRUNCATE_ONLY

--DB 정보보기
sp_helpdb 디비명

--요기의 논리적인 로그 화일을 아래에서 사용합니다.

--DB의 로그데이터베이스 크기를 5M로 줄인다.
DBCC SHRINKFILE (로그화일이름, 5)
ex) ==> DBCC SHRINKFILE(ITZONE_LOG, 5)


또는


로그 파일을 줄이는 방법입니다.

1. backup log db_name with no_log 로 로그내용을 지워줍니다.

2. 엔터프라이즈 관리자 - 보기 - 작업창으로 해당 데이터베이스의 사용중인 공간을 확인합니다.

3. 아래 온라인 설명서의 dbcc shrinkfile 명령을 이용하여 ldf 파일의 크기를 줄이시면 됩니다.

다음은 UserDB 사용자 데이터베이스에서 DataFil1이라는 파일의 크기를 7MB로
줄이는 예제 입니다.

USE UserDB
GO
DBCC SHRINKFILE (DataFil1, 7)
GO


또는


우선 만약을 위해 DB를 풀백업 받으세요.

그후.

EXEC sp_detach_db 'pubs', 'true'

식으로 DB를 detach 하세요.

그후

잠시 ldf화일을 rename 시키시고

mdf 화일만 가지고 첨부 시키시는 겁니다.

EXEC sp_attach_single_file_db @dbname = 'pubs',
@physname = 'c:\Program Files\Microsoft SQL Server\MSSQL\Data\pubs.mdf'

식으로요.
http://misokorea.co.kr/miso/board4/view.php?mode=view&sidit=D101&sn=176

posted by 2009. 3. 6. 01:38

EXEC  sp_addlinkedserver 
@server        = N'서버명',
@srvproduct = N'',
@provider     = N'SQLOLEDB',
@provstr       = N'SERVER=아이피;Integrated Security=True'

EXEC sp_addlinkedsrvlogin '서버명', 'false', NULL, '아이디', '비번'

posted by 2009. 3. 6. 01:38

개발자를 위한 튜닝 가이드 - 쿼리 디자인

 

쿼리 디자인

번호 수칙 체크
1 SELECT는 필요한 결과값만을 요구하는가?
2 적절한 WHERE조건을 사용하는가?
3 COUNT(컬럼명) 대신 COUNT(*)을 사용하는가?
4 커서 및 임시 테이블의 내용을 최대한 자제하는가?  
5 VIEW의 총 사용을 줄였는가?  
6 저장 프로시저를 사용하는가?  
7 저장 프로시저를 적절하게 리컴 파일 하며 사용하는가 ?  
8 작명 된 저장 프로시저 SP외의 접두어를 사용하는가 ?  
9 모든 개체의 소유자는 DBO로 지정하며 생성했는가 ?  
10 데드락이 발생하는 부분을 라이브락 형태로 변경했는가?  
11 SET NOCOUNT ON을 사용하는가?  
12 실무 사례: 저장 프로시저 관리 방법  

 

스티브 맥코넬이 이런 말을 했습니다.
뛰어난 디자이너는 습득한 지식을 사용하지 않는 것과 그 지식을 처음부터 확보하지 못한 것을 동일하게 봅니다.
이말 뜻을 다음과 같이 해석하고 싶습니다. 여러분은 쿼리 분석기의 기능들이 어떤 것이 있고, 단축키가 메뉴우측에 작게 표시되어 있다는 것을 대부분 알고 있습니다. 하지만 잘 사용하지는 않고 있을 것입니다. 라고 말입니다. 그래서 먼저 단축키와 그 사용법에 대해 안내하는 시간을 우선 가지도록 하겠습니다.
다음을 실습해보고 자세한 것은 표를 참조합시다

 

-- CTRL + E , F5

-- 실행하기
----------------------------------------------------------------
use pubs
go

select * from titles

-- CTRL + T => 결과 Text로 보기

select * from titles

-- CTRL + D => 결과 Text로 보기

select * from titles

-- CTRL + K => 실행계획 보기

select * from titles

-- F8 => 개체브라우저 보이기/감추기

-- CTRL + R => 결과창 보이기/감추기

-- 그외 CTRL + C , CTRL + V , CTRL + X

-- CTRL + SHIFT + C => 주석달기

select * from titles


 

다음의 표를 참조합시다.

  없음 Shift + Ctrl+ Alt+ Shift+Ctrl+
A     전체 선택    
B     중간 구분선 선택    
C     복사   주석 달기
D     표 형태로 결과 표시 데이터베이스 선택  
E     실행    
F     찾기   파일로 결과 저장
G          
H     교체    
I     인덱스 튜닝마법사    
J          
K     실행 계획 보기    
L     예상 실행 계획 보기   선택 내용을 소문자로
M          
N     새 쿼리 윈도우    
O     연결    
P          
Q          
R     결과창 보이기/감추기   주석제거
S     저장    
T     텍스트로 결과 표시    
U         선택 내용을 대문자로
U     선택 내용을 대문자로    
V     붙여넣기    
W          
X     자르기    
Y     다시하기    
Z     취소    
F1 도움말 선택 내용을 도움말로 보기      
F8 객체 브라우저보이기감추기        

주요 단축키 사용 안내 입니다.

 

수칙1.SELECT는 필요한 결과값만을 요구하는가?

 

select title , price from titles where title_id = 'BU1032'

 

Select 하는 내용도 필요한 항목만을 가지고 오도록 되어 있어서 리소스가 전혀 낭비되지 않고 있습니다.

 

select title , price from titles

 

필요한 칼럼을 가져오기는 하지만 불필요한 전체 행(Row)들을 가져오고 있습니다.

 

select * from titles

 

불필요한 칼럼정보, 행(Row) 데이터를 가져오고 있습니다.

 

따라 하기 - 3개의 쿼리를 한번에 실행하기

1.3개의 쿼리를 한 Session에서 실행하여 결과3개를 동시에 살펴봅니다.



2.결과 값으로 출력되는 데이터량의 차이를 확인합니다. 어느 쿼리가 가장 간결한 결과를 반환합니까?
( 반드시 꼭 필요한 결과만 반환하게 하는 것이 좋습니다.
select title , price from titles where title_id = 'BU1032' 가 적절합니다.)

 

수칙2.적절한 WHERE 조건을 사용하는가?

 

인덱스란 데이터를 빨리 찾기 위해서 사용됩니다. 인덱스가 없다면 특정데이터를 찾기 위해서 모든 데이터페이지를 검색(Table Scan)해야만 합니다 그에 비해 인덱스가 존재하고 그 인덱스가 사용되는 것이 효과적이라면 SQL서버는 해당 인덱스 페이지를 사용하여 쉽게 데이터를 가져올 수 있는데 이를 인덱스 검색(Index Seek)이라 합니다.


그러나 이렇게 인덱스가 있더라도 이를 사용 불가능하게 하는 나쁜 쿼리가 있으니 이는 검색조건에서 불필요하게 칼럼이 변형된 경우입니다. 다음의 여러 나쁜 예를 좋은 예와 비교해 봅시다.


SARG(Search Argument)란 쿼리가 반환하는 결과를 제한하기 위하여 옵티마이저가 인덱스와 결합해서 사용할 수 있는 쿼리 내의 조건절을 말하는데 다음의 형태를 가집니다.

 

컬럼 연산자/변수

 

옵티마이저가 쓸모 있게 변환하는 것은 CTRL+K 실행 계획 상부 표시에서 관찰할 수 있습니다.

 

set showplan_all on

select * from authors
where au_lname like 'Ma%'

-- OBJECT:([pubs].[dbo].[authors].[aunmind]), SEEK:([authors].[au_lname] >= 'Ma' AND
[authors].[au_lname] < 'MB'), WHERE:(like([authors].[au_lname], 'Ma%', NULL))
ORDERED FORWARD

-- set showplan_all off

 

따라 하기

1.인덱스 찾기(Index Seek)를 확인합니다.



2.다음과 같이 약간의 조건절(where) 변형만으로 인덱스페이지가 사용되지 않음을 확인합니다.



3.그렇다면 조건절(where) 변형하고 싶을 땐 어떻게 해야 할까요?



4.다음 예제도 복습해 봅시다.





5.항상 실행 계획을 참조하여 재차 쿼리를 확인해야 합니다.

 

[참고] 쿼리 계획 은 다음의 몇 가지 단계로 이뤄집니다.

1. 평범한 계획을 식별
2. 획을 단순화 - having를 where로 != @param을 < @param OR > @param으로 변환하는 것 같은 작업을 수행합니다
3. 로드 한다 - 쿼리 옵티마이저가 인덱스와 컬럼 통계, 다른 지원정보를 로드한다
4. 근거하여 계획들을 평가한다 - 실행하는 비용이 충분히 저렴하다고 생각될 때 그 계획을 실행하도록 내놓는다
5. 병렬화를 위해 최적화한다 - SMP

 

수칙3.COUNT(컬럼명) 대신 COUNT(*)을 사용하는가?

 

COUNT(*) 와 COUNT(컬럼명)의 차이는 중요합니다. COUNT 하는 해당 테이블 컬럼에 NULL 값을 포함하고 있다면 이 두 예제는 서로 다른 결과를 반환합니다. COUNT(컬럼명)은 그룹에 포함된 각 행을 평가하여 NULL이 아닌 값의 개수를 반환합니다. COUNT(*)는 NULL 값과 중복된 값을 포함한 그룹의 항목 개수를 반환합니다.


일반적으로, COUNT(컬럼명)을 사용하여 특정한 컬럼의 행 개수를 세는 것보다 COUNT(*)을 사용하여 옵티마이저가 행의 개수를 반환하는 최상의 방법을 선택하도록 해주는 것을 더 선호하는 방식이다.

 



[참고] NULL을 처리하는 방법

use pubs
go

-- 돈 받고 파는 책을 출력하세요

select * from titles where price is not null

-- 비매품인 책을 출력하세요

select * from titles where price is null

-- 비매품책을 제외한 모든 책의 평균가격?

select avg(price) from titles

-- 비매품책을 0원으로 두고 계산한 평균가격?

select avg(isnull(price,0)) from titles

 

[유용한 관용구]


칼럼의 중복 행의 수를 찾아봅시다

use pubs
go

-- 중복 칼럼이 각각 몇 개 항목인지를 찾아보자
-- type별로 몇 개의 책이 있을까?

select type,count(*) as [중복 행의 수]
from titles group by type having count(*)> 1

 

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

 

결론부터 말씀 드리자면 커서보다는 임시테이블이 임시테이블보다는 테이블 변수를 사용하는 것이 성능에 보탬이 됩니다. 단 SQL2000에서만 테이블 변수가 가능합니다.


커서는 내부적으로 임시 테이블을 사용하기 때문에 임시테이블을 쓴다고 부하가 더 발생하진 않습니다. 오히려 커서의 부가적 기능 때문에 서버 자원을 더 낭비하게 됩니다. (커서로 할 수 있는 건 임시테이블이나 테이블 변수로도 모두 처리가 가능합니다.)

 

따라 하기 - 다음은 테이블 변수를 사용하여 기존 커서를 대체하는 것을 구현했습니다.

1.훌륭하게 커서를 대신하는 문장입니다.



CTRL + K로 확인하면 테이블 변수로 사용할 경우 실제 테이블에 잠금을 전혀 걸지않는 것을 알 수 있습니다(중요) 그와 반대로 커서를 사용할 경우 프로시저 시작부터 끝까지 지속적으로 사용 부분을 계속해서 잠그고 있어서 다른 작업들이 대기해야 되는 문제가 생깁니다.

 

수칙5.VIEW의 총사용을 줄였는가?

 

VIEW는 보안과 편리성에 관련된 이슈를 다루는 데 있어 최고입니다,
그러나, 일반적으로 보안상에 이슈를 제외한 경우에는 불필요한 부하가 가중될 수 있고 많은 경우에 더 불필요한 데이터를 반환합니다 예를 들면 VIEW에서 10개를 가져오고 거기에 WHERE 조건을 붙여서 7개만 가져오는 경우가 그렇습니다.

 



select lastname,firstname from employees VS select * from EmployeesView 중간 단계가 있는 쪽이 효율이 떨어집니다.

 

수칙6.저장 프로시저를 사용하는가?

 

저장 프로시저는 복잡한 SQL문을 단순화 시켜주고, 보안 문제를 해결해주며 더 나아가 빠른 성능에 매개변수,출력매개변수,리턴 값을 사용할 수 있습니다.

 

저장 프로시저의 역할 7가지

1. 데이터 무결성의 시행
2. 복잡한 비즈니스 규칙과 제약의 강화
3. 캡슐형 설계
4. 유지보수
5. 네트워크 트래픽 감소(오고 가는 긴SQL 구문을 축소)
6. 보다 빠른 실행(컴파일을 하지 않습니다)
7. 보안강화

 

저장 프로시저의 생성과 반복사용 시 발생하는 일

 

제작
1. 구문분석
2. 표준화
3. 보안 점검(프로시저 생성권한)
4. 저장(syscomments)
첫 번째 실행 시
1. 보안 점검(프로시저 실행 권한)
2. 최적화
3. 컴파일과 이에 따른 실행계획을 캐쉬에 저장
4. 실행
반복해서 실행 시
1. 캐쉬에 실행 계획 있을 때는 그대로 실행
2. 캐쉬에 실행 계획이 없을 때는 첫 번째로 저장 프로시저 실행하는 것과 동일

 

쿼리는 한번만 실행할 때는 일반 SQL이 훨씬 간단합니다. 그러나 반복적으로 실행되면 저장 프로시저가 월등히 빠르고 편리합니다.

 

수칙7.저장 프로시저를 적절하게 리컴 파일 하는가?

 

데이터가 변화하면(인덱스를 추가하거나 인덱스된 열의 데이터를 변경하는 등의 작업 수행 시) 그에 걸맞게 실행계획도 변화해 갑니다. 그에 대처하기 위해서 다음과 같은 리컴파일 방법를 제공합니다.

저장 프로시저 리컴 파일 모드에는 다음의 3가지가 있습니다.

 

CREATE PROCEDURE [WITH RECOMPILE]
EXECUTE [WITH RECOMPILE]
sp_recompile

 

CREATE PROCEDURE [WITH RECOMPILE]

는 SQL SERVER가 이 저장 프로시저의 계획을 캐시하지 않기 때문에 이 저장 프로시저가 실행 할 때 마다 다시 컴파일 됩니다(실행 속도가 느려짐).

 

EXECUTE [WITH RECOMPILE]

는 지금 이순간만 리컴파일 하고 다시 저장 프로시저 실행하면 예전 실행 계획대로 작동하는 것입니다. 제공하는 매개 변수가 불규칙하거나 저장 프로시저를 만든 다음 데이터가 많이 변경되었을 경우 이 옵션을 사용합니다.

 

sp_recompile

는 저장 프로시저가 다음에 실행될 때 첫 실행처럼 컴파일되고 실행되도록 하는 것입니다.

 

[문서화되지 않은 DBCC 명령어]

-- pubs 데이터베이스의 모든 저장 프로시저를 재컴파일 해보자

select db_id('pubs')

dbcc flushprocindb(5)

-- 모든 인덱스를 재구축한다
-- 관리자가 사용할 경우 엄청난 시간이 소요될 수 있습니다

dbcc dbreindexall('pubs')


 

수칙8. 저장 프로시저 작명 시 SP외의 접두어를 사용한다.

 

시스템 저장 프로시저는 master 데이터베이스내에서 sp_라는 접두어로 시작하는 것이 좋으며 모든 데이터베이스에서 실행될 수 있습니다. 각 사용자 데이터베이스에서는 다른 접두어를 사용하는 것이 보기에도 좋고 알아보기에도 수월합니다.


또한 시스템 저장 프로시저는 어느 데이터베이스에서 수행하건 해당 데이터베이스의 내용을 참조합니다.

 

따라하기
일반sp_ 저장 프로시저를 시스템sp_ 저장 프로시저로 만들어 봅니다.

1. 사용자 정의 저장 프로시저는 master데이터베이스에 존재하더라도 master내용만 참고합니다.



2.그러나 다음과 같이 시스템 저장 프로시저화 한다면



3.부연하자면 모든 데이터베이스에서 사용하는 프로시저의 경우 sp_로 시작하게 작성한후 sp_MS_marksystemobject로 시스템 프로시저화 작업을 하는게 필요합니다. 이 내용은 엄격하게 구분되서 실행되는 것이 혼란을 줄일 수 있습니다.

 

수칙9. 모든 개체의 소유자는 DBO 이다

 

소유자가 다르면 복잡한 소유권 체인문제가 발생합니다.



lucia가 테이블의 소유자 입니다. lucia는 뷰를 만들었는데 maria에게 뷰를 볼 수 있게 했습니다. maria는 이를 Pierre가 볼 수 있게 했는데 Pierre는 Maria가 만든 뷰를 select권한을 받았음에도 불구하고 실행이 안됩니다. 이는 소유권 체인이 중간에 분실 됐기 때문입니다. 불필요한 이런 시스템은 시스템의 성능저하를 가져다 줍니다. 모든 소유자는 dbo로 통일하는 것을 권장합니다.

 

따라 하기 - 소유자를 dbo로 바꿔보자

1.소유자를 dbo로 바꿀 때는 다음의 저장 프로시저를 사용하면 됩니다.



2.추가로 시스템테이블을 업데이트하는 방법을 통해 데이터베이스 차원에서 소유자를 바꾸는 방법도 있으며 커서를 사용하는 방법도 존재합니다.

 

[참고] 소유자가 dbo가 아닌 객체를 출력해봅시다.

select name from sysobjects
where uid <> user_id('dbo')

 

수칙10. 데드락이 발생하는 부분을 라이브락 형태로 변경했는가?

 

데드락이란 라이브락과 반대되는 개념입니다. 둘 이상의 트랜잭션이 서로가 실행해야 될 내용을 이미 잠그고 있어 마치 교차로에서 서로 엉켜 꼼짝할 수 없는 상황을 의미 합니다. 이를 해결하기 위한 SQL서버의 노력은 한쪽을 일방적으로 취소 시키는 것인데 이는 시스템의 성능저하로 나타납니다. 이를 해결하기 위한 가장 좋은 방법은 일방통행 방식으로 변경하는 것입니다. 이것이 라이브락 입니다.

 

따라 하기

1.우선 준비를 위해 테이블을 만들고 데이터를 넣습니다.



2.창을 두 개 열어서 동시에 실행합니다. CTRL+TAB으로 잽싸게 창을 바꿔서 실행해 봅니다.



3.위의 데드락의 가장 바른 해결방법은 순차적인 라이브락 형태로 변경하는 것입니다.



수칙11. SET NOCOUNT ON을 사용하는가?

 

불필요한 메시지가 네트워크 트래픽을 낭비하고 있습니다. 특히'몇 개 행이 적용 되었습니다' 같은 메시지가 그런 대표적인 예입니다.

 

따라 하기

1. set nocount on을 실행하고 쿼리를 실행합니다.



프로시저를 작성할 때도 set nocount on과 같은 환경설정은 먼저 실행해 두고 프로시저를 작성하면 환경이 저장된 채로 프로시저가 제작되므로 편리합니다.

 

수칙12.실무 사례: 저장 프로시저 관리 방법

 

저장 프로시저 관리방법



---------------------------
-- 객체이름 :
-- 파라미터 :
-- 제작자 :
-- 이메일 :
-- 버젼 :
-- 제작일 :
-- 변경일 :
-- 그외 :
---------------------------

use 데이터베이스명
-- 저장 프로시저는 use 데이터베이스명 문과 같이 써두어야 어디 소속인지 명확히 파악이 가능합니다.
go

-- 소스

create proc dbo.저장 프로시저명
-- 소유자가 명확하게 dbo로 지정 되 있어야 성능 향상이 이뤄집니다. 컴파일 잠금 시간 대폭 감소
as
begin
-- 가장 바깥쪽의 begin end 및 불필요한 begin end문은 과감히 생략합니다.(소스만 길어짐)

end

-- 실행예제

exec 데이터베이스명.dbo.저장 프로시저명
-- 데이터베이스 이름까지 명시해야 오브젝트 참조에서 발생할 수 있는 불 명확성을 줄여줌으로 바람직합니다.

 

출처명 : 한국마이크로소프트
 
 
posted by 2008. 11. 3. 15:43

[MS SQL 2005]

출처 : Julian Kuiters

참고 : MSDN::fn_listextendedproperty (Transact-SQL)

         MSDN::Transact-SQL Forum       .Net Heaven

 

SELECT OBJECT_NAME(EXP.major_id) AS TableName,
       C.name                    AS ColumnName,
       EXP.name                  AS PropertyName,
       EXP.value                 AS PropertyValue
FROM   sys.extended_properties AS EXP
LEFT OUTER JOIN sys.columns AS C
ON    C.object_id = EXP.major_id
AND   C.column_id = EXP.minor_id
WHERE EXP.class_desc = 'OBJECT_OR_COLUMN';

 

SELECT *
FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 'MUXX1', default, default);

SELECT *
FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 'MUXX2', 'column', default);

 

[Oracle]

출처: Oracle SQL

 

SELECT table_name, comments FROM user_tab_comments;
SELECT table_name, column_name, comments FROM user_col_comments;