728x90

SELECT 컬럼1,컬럼2,컬럼3

FROM     테이블
GROUP BY 컬럼1,컬럼2,컬럼3

HAVING COUNT(*) > 1

728x90
728x90

서버쿼데이터를 비교하여, 결과값을 보고자하는 경우.

 

ex) A 테이블과 B 테이블을 비교하여 다른 내용이 있는경우 해당 칼럼을 출력.

 

select * from A where not exists
(select * from B where A.aa = B.aa)

 

A 테이블의 aa와 B 테이블의 aa가 다른 값인 경우, 데이터가 틀린 칼럼만 select문이 수행되어 보여진다.

728x90
728x90

SET LANGUAGE KOREAN --//한국어로 설정

GO

SELECT 1/0 --//0으로 나누기 에러 발생

GO


SET LANGUAGE ENGLISH --// 영어로 설정

GO

SELECT 1/0 --//0으로 나누기 에러 발생

GO


설정할 수 언어의 종류는.. 아래 테이블에 저장이 되어 있습니다. 


SELECT * FROM master.dbo.syslanguages


또한 SET LANGUAGE는 기본 적으로 모든 유저가 설정할 수 있도록 되어있습니다.(= 권한 제약이 없음)


SET LANGUAGE {name | alias}

 

http://msdn.microsoft.com/en-us/library/aa259215(v=sql.80).aspx

728x90
728x90

[MSSQL Data Type 참고]

https://docs.microsoft.com/ko-kr/sql/t-sql/data-types/data-types-transact-sql?view=sql-server-2017

Site 참고

 

Data Definition Language

 1. 데이터베이스 객체 생성(CREATE)

CREATE TABLE Company_CODE

(

Company_CODE INT

, CompanyID VARCHAR(10)

, ComapnyName VARCHAR(20)

, ComapnySite VARCHAR(20)

, CreateDate DATETIME

) 

  

 2. 데이터베이스 객체 수정(ALTER)

ALTER TABLE Company_CODE
ALTER COLUMN Company_CODE INT NOT NULL
GO 

 

ALTER TABLE Company_CODE
ADD Local VARCHAR(50)
GO
SELECT * FROM Company_CODE
GO 

 

ALTER TABLE Company_CODE
ADD TotalMemberCount INT  DEFAULT 0 NOT NULL
GO 

 

sp_rename 'Member.TotalMemberCount ,TotalMemberCnt ,'COLUMN'

--// sp_rename '테이블명.컬럼명','컬럼명','COLUMN'

 sp_rename(Transact-SQL): http://msdn.microsoft.com/ko-kr/library/ms188351.aspx

 

 3. 데이터베이스 객체 삭제(DROP) 

ALTER TABLE Company_CODE
DROP COLUMN Local
GO 

 

 

ALTER TABLE Company_CODE
DROP COLUMN TotalMemberCnt
GO

개체 'DF__Company__TotalMemberCnt __124B482B'은(는) 열 'TotalMemberCnt'에 종속되어 있습니다.

-- default 제약 조건에 포함이 되어있기 때문에 먼저 삭제를 해야 삭제가 가능

 

ALTER TABLE Company_CODE
DROP CONSTRAINT DF__Company__TotalMemberCnt __124B482B

GO

 

ALTER TABLE Company_CODE
DROP COLUMN TotalMemberCnt
GO

 

 4. 데이터베이스 이름 변경(RENAME)

sp_renamedb [ @dbname = ] 'old_name' , [ @newname = ] 'new_name'

USE master; 
GO 
CREATE DATABASE Accounting; 
GO 
EXEC sp_renamedb N'Accounting', N'Financial'; 
GO 
SELECT name, database_id, modified_date 
FROM sys.databases 
WHERE name = N'Financial'; 
GO

 

sp_renamedb(Transact-SQL): https://docs.microsoft.com/ko-kr/sql/relational-databases/system-stored-procedures/sp-renamedb-transact-sql?view=sql-server-2017

 

 5. 테이블 초기화(TRUNCATE)

TRUNCATE TABLE Company_CODE

TRUNCATE :

https://docs.microsoft.com/ko-kr/sql/t-sql/statements/truncate-table-transact-sql?view=sql-server-2017

728x90
728x90

Database 생성하는 방법

 

- Logical Name: 논리적인 이름

- File Type: Rows Data(MDF 파일), Log(LDF 파일)

- Filegroup: 파일 그룹(기본값 PRIMARY)

- Initial Size (MB): 기본적인 파일 사이즈(단위: MB)

- Autogrowth / Maxsize: 자동 증가 설정 및 최대 사이즈 설정 값

- Enable Autogrowth: 자동증가 활성 여부

   File Growth: 파일 증가 방법

     1. In Percent: 퍼센트

     2. In Megabytes: MB 량으로 늘리기


   Maximun File Size: 최대 파일 사이즈

     1. Limited to (MB): 지정된 파일 사이즈

     2. Unlimited: 제한 없음

 

 

- Path: 실제 파일이 위치할 경로

- File Name: 실제 파일 이름

 

명령으로 생성 방법

CREATE DATABASE TestDB ON

(

NAME = N'TestDB'

, FILENAME = 'C:\TestDB_DATA.MDF'

, SIZE = 1024MB

, MAXSIZE = UNLIMITED

, FILEGROWTH = 1MB

)

LOG ON

(

NAME = N'TestDB_log'

, FILENAME = 'C:\TestDB_LOG.LDF'

, SIZE = 1024MB

, MAXSIZE = 2048GB

, FILEGROWTH = 10%

); 

 

 

 

728x90
728x90

트랜잭션 로그의 관리

 

 

트랜잭션 로그를 자동증가 옵션으로 사용할 경우 무한적으로 증가할 수 있음.

Disk full을 막기 위하여 트랜잭션 로그의 관리가 필요함.


1. 트랜잭션 로그 삭제
- 트랜잭션 로그의 중요도가 낮아서 백업할 필요가 없는 경우 그냥 삭제

BACKUP LOG DB명 WITH {NO_LOG|TRUNCATE_ONLY}


2. 트랜잭션 로그 백업
- 트랜잭션 로그를 백업하면 자동으로 기존 로그 내용이 정리된다.
단, 이미 늘어나 있는 트랜잭션로그 파일(?.LDF)의 사이즈가 줄어드는건 아니고,
로그의 내용만 삭제된다.

BACKUP LOG DB명 TO DISK = <백업파일명>


3. 트랜잭션 로그 파일 사이즈 줄이기
- ?.LDF 파일의 실제 사이즈를 줄이고 싶을 경우

DBCC SHRINKDATABASE(DB명,TRUNCATEONLY)

or

BACKUP LOG DB명 WITH TRUNCATE_ONLY

트랜잭션 로그 내용이 있는 만큼의 사이즈로 줄어든다.

 


* 트랜잭션 로그의 MAX 사이즈 제한
- 특정 용량 이상으로 늘어나길 원치 않을 경우 사이즈를 제한한다.
제한사이즈를 넘어설 경우 옛 데이터부터 자동 삭제된다.

DBCC SHRINKDATABASE(DB명,1024)

DB명 뒤의 단위는 MB.

 

 

4. 확인 방법

MS-SQL Server Management Studio 등에서 SQL명령어로

 

Use <DB명>;

DBCC LOGINFO;             /* 로그파일 정보 보기 */

EXEC SP_HELPFILE;       /* 데이터파일,로그파일 정보 보기 */

select * from sysfiles          /* 데이터파일,로그파일 정보 보기 */

dbcc sqlperf(logspace);      /* 로그파일 사용량(%) 보기 */

 

 

참고(SQL 2008 이상 버젼)

TEMP DB 로그 축소 방법

방법1. DB Log를 TRUNCATEONLY 하는 방법(로그가 최소 사이즈 부터 시작)

         DBCC SHRINkFILE(templog)

         설명

         DBCC SHRINkFILE(DB로그명)

 

방법2.  DB Log 초기 크기를 지정하여 줄이는 방법

          -- Templog 사이즈를 300Gb로 초기 사이징 하여 시작하게 설정

          ALTER DATABASE tempdb MODIFY FILE  (NAME = 'templog', SIZE = 307200)  

         설명

          ALTER DATABASE DB명 MODIFY FILE  (NAME = 'file_log Name', SIZE = Mb단위 크기)

728x90
728x90

서버 이전작업시 master DB를 그대로 이전한다고 했을때
MS-SQL 2000에서는 대상서버로 master DB를 이전하려면 master DB의 백업본을 가지고 단일 사용자 모드에서 복원하던지
대상서버의 MSSQL 서비스를 중지시킨 다음 원본 서버의 mdf 파일을 복사해 서비스를 시작시키면 기존의 master DB를 사용할 수 있었다.

하지만 이때 master DB에 저장되어 있는 연결된 서버 정보를 그대로 사용할 수 있으므로
이런 정보를 이용하여 다른 서버에 특정 권한으로 접근할 수 있게 된다.
이러한 문제 때문인지 MS-SQL 2005에서 보안이 강화되어 master DB를 사용하기 위한 추가적인 작업이 필요해졌다.

MS-SQL 2005에서는 "서비스 마스터 키" 라는 개념이 도입되었다.
BOL을 보면 "서비스 마스터 키"는 다음과 같이 설명되어 있다.

서비스 마스터 키는 연결된 서버 암호, 인증서 또는 데이터베이스 마스터 키를 처음으로 암호화할 필요가 있을 자동으로 생성됩니다. 서비스 마스터 키는 로컬 시스템 또는 Windows 데이터 보호 API 사용하여 암호화됩니다. API SQL Server 서비스 계정의 Windows 자격 증명으로부터 파생된 키를 사용합니다.

서비스 마스터 키의 암호는 해당 키가 만들어진 서비스 계정이나 해당 서비스 계정의 Windows 자격 증명에 대한 액세스 권한이 있는 보안 주체 의해서만 해독될 있습니다. 따라서 SQL Server 서비스를 실행 중인 Windows 계정을 변경하면 서비스 마스터 키의 암호 해독도 계정으로 활성화해야 합니다.

만일 master DB를 복사해 오거나 복원을 했다면 서비스를 시작했을 때 sp_readerrorlog를 통해 다음과 같은 오류 메시지를 확인할 수 있다.
(사용자 DB도 모두 정상적으로 시작되고 언뜻 보기엔 정상으로 보일 수 있다.)

    2008-06-06 12:08:08.680 spid4s 오류: 15466, 심각도: 16, 상태: 1.
   
2008-06-06 12:08:08.680 spid4s An error occurred during decryption.

그리고 연결된 서버를 읽거나 추가/수정/삭제 하려고 하면 다음과 같은 화면을 만나게 된다.
"암호화 해독 중에 오류가 발생했습니다."

이때는 원본 서버에서 서비스 마스터키를 파일로 백업해서 대상 서버에서 복원시키면 정상적으로 암호화된 정보를 이용할 수 있다.
     BACKUP SERVICE MASTER KEY TO FILE = 'c:\service_master_key' ENCRYPTION BY PASSWORD = 'password'
    
RESTORE SERVICE MASTER KEY FROM FILE = 'c:\service_master_key' DECRYPTION BY PASSWORD = 'password' -- [FORCE]

RESTORE시 FORCE 옵션은 서비스 마스터 키 복구로 인해 기존에 생성된 정보가 손실될 수 있는 경우 오류 메시지가 발생하게 되는데 이를 무시하고 적용하겠다는 옵션이다.

이렇게 서비스 마스터 키를 복원하고 나서 MS-SQL 2005 서비스를 재시작하면 sp_readerrorlog에서 오류 메시지가 사라진 것을 확인할 수 있다.

이런 이유로 master DB를 백업할 때 서비스 마스터 키도 함께 백업을 해 두어야
나중에 복구할 이슈가 발생했을 때 master DB의 암호화된 정보를 사용할 수 있을 것 같다.


[별첨] BOL에서 설명하고 있는 보안수준.
SQL Server 수준에서의 최상위 정보가 서비스 마스터 키 이며,
데이터베이스 암호화시도 이 서비스 마스터 키를 이용하여 암호화를 한다고 한다.

728x90
728x90

DB서버를 신규 장비로 교체하거나 2대를 1대로 합치는 작업을 종종하는데요, 자주하는 작업이 아니라서, 조금씩 놓치는 부분이 발생하게 됩니다.
팀에서 DB서버 이전시 챙겨야 하는 작업에 대해서 함께 정리해 보았습니다.

      구분                                     항목    체크
사전 작업 SQLIOSim 테스트를 통하여 신규 장비에 물리적인 결함이 없는지 확인(신규장비로 이전시)  
작업 대상서버에서 이전 작업시 수행되는 배치나 백업 작업이 있는지 확인(부하 / 잠금 등)  
데이터를 이전 받는 서버의 디스크 공간은 충분한지 확인 필요 (백업본 보관도 고려 필요)  
통계 시스템 등 해당서버에서 데이터를 가지고 가는 부분이 있다면 해당 담당자에게 공유  
이전 준비 작업
(이전해야 할 내용
확인/이관,
신규 장비일 경우
추가 설정 내용)
DTS 또는 SSIS 작업 이관  
hosts 파일에 등록된 내용 확인 및 이관  
서버/클라이언트 네트워크 (alias 등록하여 사용중인 내용) 내용 확인 및 이관  
연결된 서버 설정 확인 및 이관  
DB 계정 설정 확인 및 이관  
윈도우 예약작업 확인 및 이관  
MSDTC 설정 (분산 트랜잭션 사용중인 경우) 확인 및 이관  
execute 로 실행되는 동적쿼리가 있을 경우 그에 대한 실행권한 확인  
IPSec 확인 및 이관  
64bit 장비의 경우 플랜캐시가 커지는 현상이 있어 adhoc 지우는 Job 추가  
서비스팩 현재 서비스중인 서버까지 올려놓을 것  
Default 정렬셋이 동일한지 확인 (사용자 DB만 이관할 경우 문제가 되어질 수 있음.)  
임의쿼리에 대한 변경을 할 경우 확인 및 변경
(확인 방법 : 프로필러 + 메모리 내의 Ad-Hoc 플랜캐시영역 확인)
 
이전 작업
(작업 당일 진행
순서)
(현업 또는 관련팀) 서비스 점검 상태 확인  
(복제가 있었다면) 복제 정지 / 삭제  
예약된 작업 정지 (이 서버 및 이 서버와 연결된 타 서버)  
(현업 또는 관련팀) DB에 더 이상 데이터 변경이 없을 때까지 대기,
sp_who2 등으로 접속자 확인
 
풀 백업 후 장비간 복사  
(시스템담당자) (기존 장비 대체인 경우) 호스트 이름 및 IP 변경 요청   
리스토어 및 DB 액세스 계정 등 확인 & 설정  
(복제가 있었다면) 재구성  
SQL Agent 실행여부 확인, 설정 점검('자동 실행') 및 예약된 작업 시작  
접속 테스트, Application 테스트 진행  
(현업 또는 관련팀) 서비스 오픈 확인  
작업 후 체크 모니터링 설정하기 (개별적으로 모니터링 툴이 있는 경우)  
DB 및 트랜잭션 백업 설정 확인  
OS 예약 작업은 이전되었으며 동작하고 있는가?  
DB 모드 (특히 로그) 및 호환성 모드 등의 설정은 적절한가? 로그 파일 크기는 적절한가?  
2차 백업 구성 확인: 백업 폴더가 있는 드라이브 체크, 백업용 공유 폴더 설정 체크,   
IP / 호스트명이 변경되었다면 백업 서버 설정도 확인 후 변경이 필요함  
작업 후 모니터링 성능상의 이슈가 없는지 체크(profiler로 duration, cpu, pagelookup으로 모니터링)  
perfmon로 주요지표에 대해서 실시간으로 모니터링
(pagelookup, cpu, batchrequest, lock, latch, disk 사용량 등)
 
시스템 관련 작업 64bit 장비의 경우 원격에서 파일 복사시 메모리 뺏김 현상이 있으니 이 부분에 대한 확인
(동적 캐시 관리 서비스 설치, 또는 2차 백업을 끌어가기가 아닌 밀어넣기로 변경)
 

 

728x90
728x90

글을 보다가 재미난 테스트 내용이 있어 공유드립니다.

테스트 내용은 연결된 서버를 통해서 데이터를 가지고 올 때 Pull/Push(땡겨오는/밀어넣는) 방식에 따른
성능 차이가 얼마나 발생하는지 비교한 내용입니다.

1. 테스트 스크립트 (5만건의 데이터 이관할 때 사용한 스크립트)

-- Push Script

insert openquery(SQL02, 'select * from testDB.dbo.target_table') select * from source_table;

 

-- Pull Script

insert target_table select * from openquery(SQL01, 'select * from testDB.dbo.test')

2. 테스트 결과



3. 결과에 대한 의견
  > Pull 방식이 Push 방식에 비해서 성능이 매우 좋은 것을 볼 수 있습니다. (약 120배)
  > 대량 데이터 이관시 Pull 방식을 사용하시기를 권장합니다.
  > 단순한 쿼리를 사용한 테스트이므로 모든 경우에 Push 방식이 더 빠르다고 이야기하기는 힘들 것 같습니다.
     (Join이나 subquery가 있는 경우 결과가 달라질 수 있지 않을까 생각해봅니다.)

4. 연결된 서버 사용에 대한 개인적인 의견
  > 서비스 프로시져 내에서 연결된 서버를 사용하는 것은 권장하고 싶지 않습니다.
     이유는 1대의 DB서버 장애시 다른 DB서버까지 장애가 확대되어지기 때문입니다.
  > 필요한 부분이나 상황에 맞추어 사용할 필요는 있지만 가능한 서비스 프로시져 내에서 여러 "연결된 서버"에
     접근하는 것은 제거 또는 최소화하는 것이 좋지 않을까합니다.


출처. Linked servers and performance impact: Direction matters!

728x90
728x90

올해초에 SSMS Tools Pack을 소개시켜드린 적이 있었는데, 신규 버젼이 나와서 공유드립니다.

신규 버전의 가장 큰 특징은 아래와 같습니다.
  1. Tab Sessions : 종료된 세션에 대한 기록 조회 가능     



  2. Execution Plan Analyzer : 쿼리 실행계획 분석, 실행계획을 이미지로 바로 캡쳐
     - 왼쪽 상단에 있는 3개의 아이콘이 비용/개선 중요도가 높은 작업을 찾아서 보여주는 기능을 가지고 있습니다. (검색도 포함)
     



한번 더 소개를 드린 이유는 Execution Plan Analyzer 기능이 추가되어서 입니다. 실행계획을 분석할 때 도움이 될 것 같네요.

출처 : http://www.ssmstoolspack.com/

728x90

+ Recent posts