블로그 이미지
불쥐의 눈으로 본세상 ㏈ª ☞ β┖υΕJini.κR

카테고리

분류 전체보기 (234)
By β┖υΕJini (131)
㏈ª By β┖υΕJini (103)
Total302,468
Today16
Yesterday15
사용자 삽입 이미지

1. 조회 속도성능을
높이기 위해서

해당 범위의 Row들에 대해서 Dirty Read를 하여도 괜찮은 경우에 사용합니다.

with (nolock)

2. 자기가 조회한 로우를
다른 트랜잭션이 변경할 수
없게 하기 위해

업데이트 목적을 갖지 않는 다른 트랜잭션의 읽기(nolock 또는 힌트가 없는 Select)는 허용하지만 Select한 로우에 대한 업데이트를 방지합니다.
업데이트 목적을 갖는 다른 트랜잭션의 읽기(updlock 힌트를 사용하는 Select)를 허용하지 않습니다.
updlock 2이상 사용될 경우 후속 트랜잭션에서 대기 상태에 들어갑니다.

with (updlock)

3. 자기가 조회한 로우를
다른 트랜잭션에서 읽어갈
수 없게 하기 위해

nolock 힌트를 제외한 다른 트랜잭션에서의 모든 읽기가 방지됩니다.
해당 로우에 대해서 다른 트랜잭션에서 업데이트를 할 수 없습니다.
해당 로우에 접근하는 후속 트랜잭션은 대기 상태에 들어갑니다.

with (rowlock xlock)

4. 읽기 잠금을 제외한
로우를 조회하고자 할 때

rowlock xlock 힌트에서 잠근 행을 제외한 행들을 읽어 갈 수 있습니다.
xlock
힌트와 함께 사용하면 읽어온 행들에 대해서 읽기 잠금이 발생하여 시나리오#3과 동일한 효과를 가집니다.
xlock이 함께 사용되는 경우 해당 로우에 접근하는 후속 트랜잭션은 대기 상태에 들어갑니다.

with (readpast)
with (readpast xlock)

5. 자기가 조회한 로우를
다른 트랜잭션이 변경할 수
없게 하기 위해
자기가 조회하는 테이블에
다른 트랜잭션에서 인서트를 할 수 없게 하기 위해

업데이트 목적을 갖지 않는 다른 트랜잭션의 읽기(nolock 또는 힌트가 없는 Select)는 허용하지만 Table 전체에 업데이트를 방지하고자 할 때
업데이트 목적을 갖는 다른 트랜잭션의 읽기(updlock 힌트를 사용하는 Select)를 허용하지 않으려고 할 때
인서트를 방지하면서 조회하는 로우만 업데이트 방지를 할 수 있는 힌트는 없습니다.
인서트 방지 목적을 갖는 다른 트랜잭션의 읽기(holdlock tablock 힌트를 사용하는 Select)가 허용되므로 Deadlock이 발생할 가능성이 있습니다.

with (holdlock tablock)

6. 시나리오 5. 에 대한 Deadlock을 방지하고자
할 때

다른 트랜잭션에서 해당 테이블에 대한 모든 select, update, insert 구문의 실행을 방지하고자 할 때
쿼리의 유형과 관계 없이 이 테이블에 접근하는 다른 트랜잭션은 대기 상태에 들어갑니다.

with (tablockx

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요


사용자 삽입 이미지
 해외쪽 DB 관리자에게 사용 프로시져 실행 권한만 주시기 바랍니다.
 라고 요청을 하면 EM 이나 SSMS 에서 마우스로 열심히 클릭질 하고 계신다.
 그 많은 프로시져를 언제 클릭질 하실껀가요.
 이런 분들을 위해~~~~~~~~~~~~


CREATE
PROCEDURE spGrantExectoStoredProcs

 @user sysname,

 @PROC_SEARCH varchar(10) = '' -- 특정프로시져 LIKE 검색조건자

AS

/*----------------------------------------------------------------------------

-- Object Name: spGrantExectoAllStoredProcs

-- Author: Edgewood Solutions

-- Development Date: 03.19.2007

-- Called By: TBD

-- Description: Issue GRANT EXEC statement for all stored procedures

-- based on the user name that is passed in to this stored procedure

-- Project: SQL Server Security

-- Database: User defined databases

-- Business Process: SQL Server Security

--

----------------------------------------------------------------------------

-- Num | CRF ID | Date Modified | Developer | Description

----------------------------------------------------------------------------

-- 001 | N\A      | 03.15.2007    | Edgewood | Original code for the GRANT

-- 002 Bluejini | Modify code for the GRANT ADD @PROC_SEARCH

-- EXEC process

--

*/

SET NOCOUNT ON

 

-- 1 - 변수선언

DECLARE @CMD1 varchar(8000)

DECLARE @MAXOID int

DECLARE @OwnerName varchar(128)

DECLARE @ObjectName varchar(128)

 

-- 2 - 임시테이블생성

CREATE TABLE #StoredProcedures

(OID int IDENTITY (1,1),

StoredProcOwner varchar(128) NOT NULL,

StoredProcName varchar(128) NOT NULL)

 

-- 3 - 임시테이블에프로시져리스트추가

INSERT INTO #StoredProcedures (StoredProcOwner, StoredProcName)

SELECT ROUTINE_SCHEMA, ROUTINE_NAME

FROM INFORMATION_SCHEMA.ROUTINES

WHERE ROUTINE_NAME NOT LIKE 'dt_%'

AND ROUTINE_TYPE = 'PROCEDURE' AND ROUTINE_NAME like @PROC_SEARCH

 

-- 4 - 임시테이블MAX

SELECT @MAXOID = MAX(OID) FROM #StoredProcedures

 

-- 5 - 루프

WHILE @MAXOID > 0

BEGIN

 

-- 6 - 변수정의

SELECT @OwnerName = StoredProcOwner,

@ObjectName = StoredProcName

FROM #StoredProcedures

WHERE OID = @MAXOID

 

-- 7 - Build the string

SELECT @CMD1 = 'GRANT EXEC ON ' + '[' + @OwnerName + ']' + '.' + '[' + @ObjectName + ']' + ' TO ' + @user

 

-- 8 - Execute the string

 

EXEC(@CMD1)

 

-- 9 - Decrement @MAXOID

SET @MAXOID = @MAXOID - 1

END

 

-- 10 - 임시테이블삭제

DROP TABLE #StoredProcedures

 

SET NOCOUNT OFF

GO

 

 

EXEC spGrantExectoStoredProcs 'Login1','Usp_%'

창고 사이트 : http://snippets.dzone.com/posts/show/4688

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지



[ WITH <common_table_expression> [ ,...n ] ]

<common_table_expression>::=
        expression_name [ ( column_name [ ,...n ] ) ]
    AS
        ( CTE_query_definition )

SQL 온라인 설명서를 보면 위와 같은 방식으고 구문 형식을 사용 하면 된다고 나온다.
하지만 이런 구문에 나오는 기호들을 통해서 어떻게 사용하는걸 찾는게 아니라
보통 예제 데이터를 가지고 사용하면서 알게 되는  경우가 많이 있다.
구문에서 나오는 기호의 설명을 정리해 보았다.
 


::=

왼쪽의 항목은 오른쪽과 같이 정의

<element>

다른곳에 정의되어 있는 항목

[]

생략가능

{…|…}

여러항목중에 하나를 선택

…n

여러 번 반복 가능

Name,

Expression

이름 , 연산식등으로 대치시킬곳


Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2009.10.15 17:31 Favicon of http://ddoung2.tistory.com BlogIcon 건방진연이  댓글주소  수정/삭제  댓글쓰기

    ㅋㅋ 이런건 어디서 찾았을까 ? ㅋㅋ

사용자 삽입 이미지


Multiple Insert Rows

SQL Server 2008 supports the option of inserting multiple records in one statement. Each row of data is followed by a comma until reaching the last row where the INSERT command is completed like normal.


CREATE TABLE Customers
( CustID VARCHAR(20), CustName VARCHAR(20)
)





INSERT INTO Customers (CustID, CustName) VALUES ('Cust1', 'Smith Company'), ('Cust2', 'Perform Company'), ('Cust3', 'Test Inc');

Other version of SQL Server require a separate statement to be executed for each record insert.

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지
 

1. RESTORE 계정 불일치 확인 처리

 

 

/*

A_SERVER

LOGIN_A - USERA

LOGIN_B - USERB

 

B_SERVER

LOGIN_C

*/

 

 

USE TESTDB

GO

--계정확인

EXEC SP_CHANGE_USERS_LOGIN @ACTION = 'REPORT'

/*

USER_A ..

USER_B ..

*/

 

--로그인생성

CREATE LOGIN LOGINA

CREATE LOGIN LOGINB

 

--불일치계정연결

EXEC SP_CHANGE_USERS_LOGIN @ACTION = 'UPDATE_ONE'

                    , @USERNAMEPATTERN = 'USERA'

                    , @LOGINNAME = 'LOGINA'

EXEC SP_CHANGE_USERS_LOGIN @ACTION = 'UPDATE_ONE'

                    , @USERNAMEPATTERN = 'USERB'

                    , @LOGINNAME = 'LOGINB'

GO

 

EXEC SP_CHANGE_USERS_LOGIN @ACTION = 'REPORT'

GO

 

참고 : ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.ko/s10de_6tsql/html/1554b39f-274b-4ef8-898e-9e246b474333.htm

 

 

 

2.잠긴 계정 풀어주기: SQL 2005

 

 

--잠긴계정확인

SELECT NAME

FROM SYS.SQL_LOGINS

WHERE LOGINPROPERTY(NAME, 'ISLOCKED') = 1

GO

 

 

--잠긴계정풀어주기

ALTER LOGIN LOGINNAME

WITH PASSWORD='BLUEJINI' UNLOCK

GO

 

3. 4G 이상 메모리 설정

 

 

--1. NOTEPAD C:\BOOT.INI에서/PAE 옵션추가

 

--2. AWE 옵션설정

EXEC SP_CONFIGURE 'SHOW ADVANCED OPTION', 1

RECONFIGURE WITH OVERRIDE

 

 

 

--3.1 SQL 2000 AWE 옵션설정

EXEC SP_CONFIGURE 'AWE ENABLED', 1

RECONFIGURE

 

--3.2 SQL 2005 AWE 옵션설정

--LOCK PAGES IN MEMORY에시작계정추가후재부팅

EXEC SP_CONFIGURE 'AWE ENABLED', 1

RECONFIGURE

 

 

/*

WINDOWS 메모리설정

4      /3GB

8      /PAE /3GB

16     /PAE /3GB

16초과/PAE

*/

 

 

4. 메모리 크기 고정

 

EXEC SP_CONFIGURE 'MAX SERVER MEMORY (MB)', 14336

EXEC SP_CONFIGURE 'MIN SERVER MEMORY (MB)', 14336

RECONFIGURE WITH OVERRIDE

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지

얼마전 친구가 쪽지를 보내 왔다. 보내준 쿼리에는 이상이 없는듯 한데 데이터가 하나도 안나온단다. 그래서 원격으로 확인해 주었다. 별로 복잡한 쿼리도 아닌데 Blocking 계속 당하고 있었다. 그래서 한번 정리해 보았다.
 

CREATE DATABASE ReadCommittedSnapshotTest 

GO

 

USE ReadCommittedSnapshotTest

GO

 

CREATE TABLE Inventory (

      ItemID int NOT NULL

    , LocationID int NOT NULL

    , Qty int

    , PRIMARY KEY (ItemID, LocationID)

)

CREATE NONCLUSTERED INDEX ncixLocationItem ON Inventory(LocationID, ItemID)

GONext, well insert some data.

 

SET NOCOUNT ON

INSERT INTO Inventory (ItemID, LocationID, Qty)

VALUES(rand() * 1000 + 1, 1, rand() * 40 + 1)

INSERT INTO Inventory (ItemID, LocationID, Qty)

VALUES(rand() * 1000 + 1, 2, rand() * 40 + 1)

INSERT INTO Inventory (ItemID, LocationID, Qty)

VALUES(rand() * 1000 + 1, 3, rand() * 40 + 1)

GO 2000

 

1. SQL 2000 Blocking TEST

--세션1

BEGIN TRAN

       UPDATE Inventory

       SET Qty = 5

       WHERE ItemID = 796 AND LocationID = 1

--ROLLBACK TRAN

COMMIT TRAN

 

--세션2

SELECT * FROM Inventory WHERE ItemID = 796

SELECT * FROM Inventory WITH(NOLOCK) WHERE ItemID = 796

SELECT * FROM Inventory WITH(READUNCOMMITTED) WHERE ItemID = 796

 

2. SQL 2005 새로운기능(RCSI)

-- (Read committed snapshot isolation) 설정

 

--RCSI 설정/해제(주의점다른세션에서아래DB 접근해제후실행)

ALTER DATABASE ReadCommittedSnapshotTest

    SET READ_COMMITTED_SNAPSHOT ON/OFF;

go

 

 

 

3. Linked Server whth(nolock) 사용

보통 개발시 four-part name 이용하여 접근하여 많이 사용한다.

하지만 이럴 경우 원격 쿼리로 인하여 Lock 발생하는 경우가 있다.

 

이를 방지 하기 위해 OPENQUERY 사용 해야 한다.

 

Four-part name

 

SELECT * FROM

       [LINKEDSERVER].[ReadCommittedSnapshotTest].DBO.Inventory 

WHERE ItemID = 796

 

--OPENQUERY 이용 With(Nolock) 사용

SELECT * FROM

OPENQUERY([LINKEDSERVER], 'SELECT * FROM dbo.Inventory WITH(NOLOCK) WHERE ItemID = 796')

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2009.09.22 11:06 Favicon of http://www.ddoung2.com BlogIcon 건방진연이  댓글주소  수정/삭제  댓글쓰기

    오홋 굳 잡 ~ ! 이쁜 그림도 넣어주면 좋으련만 *^^* 이거 모르는 사람 많지 *^^* 귀찮아 하는 사람도 많고 *^^*

  관리도구에 있는 데이터 원본 (ODBC)을 통해 연결 확인 테스트 해볼수도 있지만
  ODBCPING 이란 실행 파일을 통해 확인도 가능 하다.


사용자 삽입 이미지
Posted by ㏈ª ☞ β┖υΕJini.κR
TAG ODBCPING

댓글을 달아 주세요

사용자 삽입 이미지
SQL Server의 각 서비스를 시작하고 실행하려면 설치 중에 구성된 계정이 있어야 합니다. SQL Server를 시작하고 실행하는 데 사용되는 시작 계정은 기본 제공 시스템 계정, 로컬 사용자 계정 또는 도메인 사용자 계정일 수 있습니다.

도메인 사용자 계정

서비스가 네트워크 서비스, 파일 공유와 같은 액세스 도메인 리소스와 상호 작용해야 하는 경우 또는 SQL Server를 실행하는 다른 컴퓨터에 대한 연결된 서버 연결을 사용하는 경우 최소 권한이 부여된 도메인 계정을 사용하는 것이 좋습니다. 서버 간 작업은 많은 경우 도메인 사용자 계정으로만 수행할 수 있습니다. 이 계정은 해당 환경에서 도메인 관리자가 미리 만들어 놓아야 합니다.

로컬 사용자 계정

컴퓨터가 도메인에 속하지 않은 경우에는 Windows 관리자 권한이 없는 로컬 사용자 계정을 사용하는 것이 좋습니다.

로컬 서비스 계정

로컬 서비스 계정은 리소스 및 개체에 대한 액세스 권한 수준이 Users 그룹 멤버와 동일한 기본 제공 계정입니다. 이러한 액세스 제한을 통해 개별 서비스나 프로세스의 보안이 침해될 때 시스템을 보호할 수 있습니다. 로컬 서비스 계정으로 실행되는 서비스는 자격 증명이 없는 Null 세션으로 네트워크 리소스에 액세스합니다. SQL Server 또는 SQL Server 에이전트 서비스에 대해서는 로컬 서비스 계정이 지원되지 않습니다. 계정의 실제 이름은 "NT AUTHORITY\Local Service 계정"입니다.

네트워크 서비스 계정

네트워크 서비스 계정은 리소스 및 개체에 대한 액세스 권한 수준이 Users 그룹 멤버보다 높은 기본 제공 계정입니다. 네트워크 서비스 계정으로 실행되는 서비스는 컴퓨터 계정의 자격 증명을 사용하여 네트워크 리소스에 액세스합니다. 계정의 실제 이름은 "NT AUTHORITY\NetworkService"입니다.

로컬 시스템 계정

로컬 시스템은 매우 높은 권한이 설정된 기본 계정입니다. 이 계정은 로컬 컴퓨터에 대한 확장된 권한을 가지며 네트워크에서 컴퓨터 역할을 합니다. 계정의 실제 이름은 NT AUTHORITY\System입니다.

모든 서비스에는 사용자 계정 외에 다음과 같이 사용자가 제어할 수 있는 3가지 시작 상태가 있습니다.

  • 사용 안 함 서비스가 설치되어 있지만 현재 실행되지 않습니다.
  • 수동 서비스가 설치되어 있지만 다른 서비스 또는 응용 프로그램이 해당 기능을 필요로 하는 경우에만 시작됩니다.
  • 자동   운영 체제에서 서비스를 자동으로 시작합니다.
Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2009.08.10 09:56 Favicon of http://www.ddoung2.com BlogIcon 건방진연이  댓글주소  수정/삭제  댓글쓰기

    ##MS_SQLResourceSigningCertificate##
    ##MS_SQLReplicationSigningCertificate##
    ##MS_SQLAuthenticatorCertificate##
    ##MS_AgentSigningCertificate##

    SQLServer2005MSSQLUser$ComputerName$MSSQLSERVER
    SQLServer2005SQLAgentUser$ComputerName$MSSQLSERVER
    SQLServer2005MSFTEUser$ComputerName$MSSQLSERVER
    SQLServer2005MSOLAPUser$ComputerName$MSSQLSERVER
    SQLServer2005ReportServerUser$ComputerName$MSSQLSERVER
    SQLServer2005NotificationServicesUser$ComputerName
    SQLServer2005DTSUser$ComputerName
    SQLServer2005SQLBrowserUser$ComputerName
    SQLServer2005MSSQLServerADHelperUser$ComputerName

    ^^~~!!

사용자 삽입 이미지
Set the FDHOST Launcher (MSSQLFDLauncher) Service Account for Full-Text Search (SQL Server Configuration Manager)


Full Text 기능 사용할려고 하니 이런 오류 발생

Msg 30046, Level 16, State 1, Procedure sp_fulltext_service, Line 163 SQL Server encountered error 0x80070218 while communicating with full-text filter daemon host (FDHost) process. Make sure that the FDHost process is running. To re-start the FDHost process, run the sp_fulltext_service 'restart_all_fdhosts' command or restart the SQL Server instance.

해결 방법
 
사용자 삽입 이미지

계정이 지정되어 있을 경우 로컬 시스템으로 변경

참고 MSDN
http://technet.microsoft.com/en-us/library/ms345189.aspx
Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지

SQL 에 대해서 자신감을 가지고 있던 나에게 난 아무것도
모르는 하수 였구나라고 느끼게 만들어 주신분 들중 한분
강사님 잘 계시죠..^^

김정선의 좋은 글을 찾아서……
Minimal Logging changes in SQL Server 2008

 

 

사용자 삽입 이미지

김정선(jskim@sqlroad.com)

㈜씨퀄로(전 필라넷 DB사업부), 수석컨설턴트

SQLServer 아카데미 강사


Microsoft SQL Server MVP

MCT/MCITP/MCDBA   

  

 

저자: Sunil Agarwal, SQL Server Storage Engine

원문: http://blogs.msdn.com/sqlserverstorageengine/archive/2008/03/06/minimal-logging-changes-in-sql-server-2008-part-1.aspx

 

 

김정선의 의견

오랜 만에 "좋을 글을 찾아서"입니다^^

이번 글 역시 아주 흥미로운 내용입니다! SQL Server Transaction Logging 아키텍처에 관련된 아주 작지만 유용한 내용이 포함되어 있습니다.

 

대량 데이터 Insert 작업에 성능 부분은 관리자 혹은 사용자에게 있어서 늘 큰 이슈가 됩니다. Insert와 같은 트랜잭션 작업 성능에 영향을 미치는 부분이 바로 Logging 데이터의 크기인데요, SQL Server 2008은 이러한 작업에 Logging을 최소화하는데 더욱 노력을 기울인 듯 합니다.

 

이번 글을 통해서 Insert 작업에 Logging이 어떻게 발생하는지, 특히 TABLOCK 힌트를 사용한 경우에 Logging이 어떻게 달라지는지, 또한 Transaction Log를 확인하는데 사용하는 쿼리는 어떤 것이면 그 내용은 무엇을 담고 있는지 분석하는데 작지만 유용한 내용들이 포함되어 있습니다.

 

원문을 그대로 해석해서 올리려 했으나, 직접 테스트를 해 보니 예제 따라 하기 및 설명이 너무 생략되어 불편하실 것 같아, 제 나름대로 바꾸어 작성했습니다.

테스트하고 이해하시는데 도움이 되셨으면 하는 바램입니다.

 

늘 그렇듯, 제 마음대로 번역/수정/추가한 것이니 부족한 번역에도 양해 바랍니다 ^^

 

 

본문 시작

최소 로깅을 위한 기반 지식들에 대해서는 이전 글을 참조하세요. SQL Server 2008을 시작으로 최소 로깅이 향상되었습니다. 이러한 향상은 TSQL Insert에서도 가능합니다. 중요 고객 시나리오 중의 하나는 Staging 테이블에서 Target 테이블로 데이터를 전송하는 것입니다. 최소 로깅을 원한 경우에 고객의 선택은 SELECT * INTO <target> FROM <staging-table> 이었습니다. 그러나 이 방법은 대상 테이블 측면에서 DDL에 대한 제어권이 없다는 제한이 있었습니다. 이제 새로운 향상 능력으로 이러한 제한이 없어집니다.

 

우선 로그 레코드의 내용을 확인하기 위해 다음과 같은 쿼리를 사용할 것이며, 아래 code-2, -3에서 사용됩니다.


-- code-1)

SELECT operation,context, [log record fixed length], [log record length]

, AllocUnitId, AllocUnitName, [Lock Information]

FROM fn_dblog(null, null)

WHERE allocunitname='dbo.t_heap'

ORDER BY [Log Record Length] DESC



예제 준비
혹시 AdventureWorks DB의 복구 모델이 단순(simple)”으로 되어 있으면 전체(full) 모델로 바꾸어서 작업해 보세요.

 

USE AdventureWorks

GO

 

-- source 테이블 생성

CREATE TABLE dbo.t_source (

       c1 int

,      c2 int

, c3 char(100)

, c4 char(1000)

)

GO

 

DECLARE @i int

SELECT @i = 1

WHILE (@i < 1000)

BEGIN

       INSERT INTO dbo.t_source VALUES (@i, @i+10000, 'indexkey', 'hello')

       SELECT @i = @i + 1

END

GO

 

-- target Heap 테이블 생성

CREATE TABLE dbo.t_heap (

       c1 int

, c2 int

, c3 char(100)

, c4 char(1000)

)

GO

 

 

시나리오-1

우선 Insert 작업에 TABLOCK 힌트를 사용하지 않은 경우에, Log 레코드가 어떻게 발생하고 기록되는지를 확인해 보고 이를 이후 TABLOCK 힌트를 사용한 시나리오가 비교를 해 봅니다.

 

BEGIN TRAN

      

       -- code-3)

       -- 아래가 완전 로깅의 경우

       INSERT INTO t_heap

       SELECT * FROM t_source

      

      

       -- 위의 code-1) Log 레코드 검색 쿼리를 사용한 결과

       -- 999건의 INSERT ROWS 레코드가 발생한 것을 있다.

사용자 삽입 이미지

 

ROLLBACK

GO

 

-- 이전 Log 레코드 데이터를 제거하기 위해

CHECKPOINT

GO

 

-- 정리

DROP TABLE t_heap, t_source

GO

 

 

시나리오-2

HEAP에 대한 Insert에서는 TABLOCK 힌트로 작업할 때 최소 로깅이 됩니다. 이것은 고객이 계속 문의해 오던 기능 중의 하나입니다. 그런데, 한 가지 단점은 Bulk Insert BU 잠금을 요구하는 반면에 상대적으로 이것은 X 잠금을 요구한다는 것입니다. 그로 인해 다중 스레드(Thread)를 사용한 입력이 어렵게 됩니다.

BEGIN TRAN

 

       -- code-2)

       -- 최소 로깅이 된다

       -- LOCK: 테이블에 X 잠금

       -- 이는't_heap' 비어 있지 않은 경우에도 동일합니다.

       INSERT INTO dbo.t_heap WITH (TABLOCK)

       SELECT * FROM dbo.t_source

             

       -- 위의 code-1) Log 레코드 검색 쿼리를 사용한 결과

       -- 999건의 INSERT ROWS 레코드가 없다

사용자 삽입 이미지

ROLLBACK

GO

 

-- 정리

DROP TABLE t_heap, t_source

GO

 

 

정리

SQL Server 2008에서 대량 Insert에 대한 작업 편이성 및 최소 Logging으로 인한 성능 향상을 알 수 있는 부분입니다.

 

위의 각 시나리오에서 sp_lock을 수행해 보면, 잠금이 어떻게 발생하는지를 알 수 있고 이를 통해 내부 동작을 이해하는데 도움을 얻을 수 있겠습니다.

 

어떠세요? 재미있죠?

원문 블로그에 가시면 2, 3편이 올라와 있습니다. 관심 있는 분들은 해당 내용을 살펴보시면 더 흥미로울 겁니다.

 

감사합니다.

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2009.08.28 15:35 Favicon of http://blog.naver.com/visualdb BlogIcon 김정선  댓글주소  수정/삭제  댓글쓰기

    네, 잘 지내고 있습니다.
    잘 지내시죠? ^^

    제 글 소개해 주셔서 감사합니다~

  2. 2009.08.31 09:47 Favicon of http://bluejini.co.kr BlogIcon ㏈ª β┖υΕJini  댓글주소  수정/삭제  댓글쓰기

    강사님... ㅎㅎ 방가 워요..ㅎㅎ 앞으로 강사님 좋은글 많이 많이 가져 갈생각..ㅎㅎ

사용자 삽입 이미지


MS-SQL 2005 에서 적용된 부분백업에 대한 내용 ^^
부분 백업은 전체 데이터베이스 백업과 유사하지만 부분 백업에 모든 파일 그룹이 포함되지는 않습니다.

대신 부분 백업은 파일 그룹, 모든 읽기/쓰기 파일 그룹, 선택적으로 지정된 읽기 전용 파일의 모든 데이터를 포함합니다. 부분 백업은 읽기 전용 파일 그룹을 제외할 때마다 유용하게 사용할 있습니다. 읽기 전용 데이터베이스의 부분 백업에는 파일 그룹만 포함됩니다.

 

l  구문 예제
 BACKUP DATABASE database_name READ_WRITE_FILEGROUPS [ , <file_filegroup_list> ] TO <backup_device>

 

 

USE MASTER

GO

 

-- BackupTest FileGroup DB CREATE

CREATE DATABASE BAKTEST

ON PRIMARY

(NAME = 'BAKTEST', FILENAME = 'D:\DBTEST\BAKTEST.MDF'),

FILEGROUP SECONDGROUP

(NAME = 'BAKTEST2', FILENAME = 'D:\DBTEST\BAKTEST2.NDF'),

FILEGROUP THIRDGROUP

(NAME = 'BAKTEST3', FILENAME = 'D:\DBTEST\BAKTEST3.NDF'),

FILEGROUP FOURTHGROUP

(NAME = 'BAKTEST4', FILENAME = 'D:\DBTEST\BAKTEST4.NDF')

LOG ON

(NAME = 'BAKTEST_LOG', FILENAME = 'D:\DBTEST\BAKTEST_LOG.LDF')

GO

 

--부분 백업 (전체백업과 비슷하지만  읽기 전용파일그룹은 백업하지 않음)

BACKUP DATABASE BAKTEST READ_WRITE_FILEGROUPS

       TO DISK = 'D:\DBTEST\BAKTEST0.BAK' WITH INIT

GO

/*

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST'에대해176개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST2'에대해8개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST3'에대해8개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST4'에대해8개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST_LOG'에대해3개의페이지를처리했습니다.

BACKUP DATABASE...FILE=<name>() 203개의페이지를0.350초동안처리했습니다(4.527MB/).

*/

 

-- THIRDGROUP 그룹 데이터 베이스를 읽어 전용으로 변경

ALTER DATABASE BAKTEST MODIFY FILEGROUP THIRDGROUP READ_ONLY

GO

 

USE BAKTEST

GO

 

 

SELECT * FROM SYS.FILEGROUPS

GO

 

BACKUP DATABASE BAKTEST READ_WRITE_FILEGROUPS TO DISK = 'D:\DBTEST\BAKTEST0.BAK' WITH INIT

GO

/*

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST'에대해176개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST2'에대해8개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST4'에대해8개의페이지를처리했습니다.

파일1에서데이터베이스'BAKTEST', 파일'BAKTEST_LOG'에대해2개의페이지를처리했습니다.

BACKUP DATABASE...FILE=<name>() 194개의페이지를0.254초동안처리했습니다(5.963MB/).

*/

 

 

-- 복원테스트

-- SQL SERVER를정지하고D:\DBTEST\BAKTEST2.NDF를삭제한후SQL SERVER를실행시킨다.

USE MASTER

GO

 

--우선최근로그까지백업(NO_TRUNCATE를사용)을받는다.

BACKUP LOG BAKTEST TO DISK = 'D:\DBTEST\BACKUP\BAKTEST_LOG1.BAK' WITH NO_TRUNCATE, INIT

GO

 

--복원시작

RESTORE DATABASE BAKTEST FILEGROUP = 'SECONDGROUP'

       FROM DISK = 'D:\DBTEST\BACKUP\BAKTEST0.BAK' WITH NORECOVERY

GO

RESTORE LOG BAKTEST

       FROM DISK = 'D:\DBTEST\BACKUP\BAKTEST_LOG1.BAK' WITH RECOVERY

GO


Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지

사용자 삽입 이미지

관계형 DBMS와 트랜적션 기능

트랜잭션의 개념

비즈니스적 측면 데이터베이스는 실제 비즈니스에서 발생하는 정보들을 저장 하고 관리한다. 그렇다면 비즈니스에서 트랜잭션은 무엇인가? 학교에서 수강신청, 은행 계좌이체, 온라인 쇼핑몰에서 구매 등이 모두 트랜잭션에 해당한다. 이와 같은 실제 비즈니 스 상에서 일어나는 트랜잭션 관련 데이터를 저장하고 기록하 는 것이 데이터베이스의 역할이다. 이제 비즈니스 트랜잭션의 특징에 대해 좀더 자세히 알아보 자. 예를 들어, 계좌이체의 경우 A라는 구좌에서 B구좌로 50 만원을 이체한다고 하자(A 구좌는 100만원 이상 예금되어 있 다고 가정). 이 계좌이체는 다음과 같이 두 가지 중요한 일을 수행한다.

. A 구좌에서 50만원을 빼고,

. B 구좌에 50만원을 더한다.

이 계좌이체 트랜잭션 과정은 50만원이 성공적으로 A 구좌 에서 B 구좌로 이동하든지, 아니면 아예 계좌이체가 일어나 지 않은 상태로 되어야 한다. 즉 트랜잭션을 이루는 두 가지일이 모두 성공적으로 발생하든지, 또는 하나도 발생하지 않 아야(all-or-nothing) 정상이다. 다시 말해 은행도 개인도 손 해를 보지 않아야 한다. 만일 A 구좌 고객이 ATM 단말기에 서 계좌이체를 수행하다 문제가 발생해서 첫 번째 일만 수행 하고, 두 번째 일을 수행하지 못했다면 은행만 50만원을 벌게 되는 결과가 된다. 따라서 트랜잭션은‘하나의 정상적인 상태 (이 예의 경우 A, B 두 구좌 모두 정확한 잔고가 남아 있는 상 태)에서 또 다른 정상적인 상태(A-50, B+50)로 전이하는 논 리적인 일의 단위(a logical unit of works)이다. 논리적으로 정상적인 상태에서 다른 정상적인 상태로 바꾸는 논리적인 일 의 단위가 바로 비즈니스 측면에서의 트랜잭션을 의미한다.

기술적인 측면

실제 비즈니스 트랜잭션의 전후 데이터 값을 저장/관리하는 것이 데이터베이스의 역할이다. 그렇다면 이와 같은 비즈니스 트랜잭션을 제대로 지원하기 위해 S/W 기술적인 측면에서 트랜잭션 기술은 어떤 특징을 가져야 할 것인가? 이를 위해 기술적으로 데이터베이스의 트랜잭션 기능은 다음과 같은 네 가지의 중요한 성질을 제공할 수 있어야 한다. 이 네 가지 성 질을 줄여서(기술적인 측면에서) 트랜잭션이 만족해야 할 ACID 속성이라고 한다.

◆ 원자성(Atomicity) :
이 성질은 비즈니스 측면에서 트랜잭션의‘all-ornothing" 성질을 기술적으로 보장하기 위해 필요하다. 즉 데이터베이스 값은 하나의 트랜잭션을 이루는 개별 작업들이 모두 다 성공적으로 끝나든 지, 아니면 하나도 발생하지 않은 상태로 복원돼야 한다. 앞의 계좌이체를 예로 들면, 데이터베이스는 어떤 경우든지 A 구좌에서 100만원이 빠지고, B에는 변동이 없는 경우는 없어야 한다. 만일 계좌이체 중간에 데이터베 이스 시스템의 전원이 나가는 경우에도 다시 복구(recovery)를 수행하면, 데이터베이스 내의 A 구좌와 B 구좌는 해당 트랜잭션이 발생하기 전의 상 태로 돌려져 있어야 한다.

◆ 일관성(Consistency) :
이 성질은 비즈니스 측면의 트랜잭션 개념이 데이 터베이스를 하나의 정상적인 상태에서 또 다른 정상적인 상태로 바꾸는 것 과 관계가 있다. 기술적인 측면에서 트랜잭션의 일관성에 대한 책임은 비 즈니스 측면의 계좌이체를 정확히 응용 프로그램으로 구현하는 프로그래 머에게 있다. 예를 들어, 계좌이체의 경우 트랜잭션 수행 전의 A, B 구좌 의 잔액의 합이 수행 후에도 동일하도록 프로그램을 작성해야 한다.

◆ 지속성(Durability) :
이 성질은 일단 트랜잭션의 처리가 정상적으로 끝나 고 나면, 이후에 시스템 오류가 발생하는 경우에도 해당 트랜잭션의 결과 가 데이터베이스에 보장돼야 한다는 것이다. 예를 들어, 계좌이체의 경우 ATM 단말기에서 A가 성공적으로 계좌이체가 끝났다는 전표를 받아든 이후에, 비록 데이터베이스 시스템의 전원이 나가는 경우에라도 반드시 복구 해서 계좌이체가 끝난 후의 상태를 보장해야 한다는 것이다.


동시성 접근에 따른 이상 현상

◆ 독립성(Isolation) :
데이터베이스는 기본적으로 여러 사용자가 동시에 데 이터를 접근해서 사용할 수 있다. 각 트랜잭션에 대해 기술적으로 원자성, 일관성 그리고 지속성이 보장된다 하더라도, 이러한 동시 사용 (concurrent access)으로 인해 여러 사용자가 동시에 같은 데이터를 접 근하면 예기치 않은 결과가 나올 수 있다. 예를 들어, A구좌에서 B 구좌로 의 계좌이체 트랜잭션 T1의 중간에(좀더 정확히는 A 구좌에서는 50만원 이 빠져나가고, B에 50만원을 더하기 전에), 다른 트랜잭션 T2가 은행 전 체 구좌의 잔고 합을 구하기 위해 A 구좌와 B 구좌의 잔고 값을 읽는다면, T2는 50만원이 부족한 결과를 얻게 된다. 이는 T2가 T1의 중간 상태의 값을 읽었기 때문에 나타나는 현상이다. 그렇다면 T2가 정상적인 결과 값 을 구하기 위해 기술적으로 데이터베이스에서 보장해야 할 일은 무엇인 가? T2가 T1의 시작 전 상태의 A, B 구좌 값을 읽거나, T1이 종료된 후 의 A, B 구좌 값을 읽도록 해야 한다. 마치 T2-T1 또는 T1-T2의 순서로 트랜잭션이 동시가 아니라 순차적으로 수행된 것처럼 데이터베이스 상태 를 보장해야 한다. 네 가지 트랜잭션의 기술적인 성질을 보장하기 위해 상용 관계형 DBMS들은 트랜잭션 관리자 모듈을 포함하고 있다. 트랜잭션 관리자는 크게 동시성 제어 모듈과 회복 모듈을 갖 고 있다. 동시성 제어 모듈은 같은 데이터에 대한 동시 접근으 로 인해 발생할 수 있는 문제를 방지하기 위한 모듈(다시 말 해, 주로 독립성을 보장)이고, 회복 모듈은 시스템의 오류로 부터 원자성과 지속성을 보장하는 역할을 한다.


Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지

SQL Server 2005, SQL Server 2008를 설치할 때 "C:\Windows\Microsoft.NET\Framework\Meaningless_string\mscorlib.tlb 파일을 로드할 수 없습니다." 오류 메시지가 나타난다.


경고 레지스트리 편집기나 다른 방법을 사용하여 레지스트리를 잘못 수정하면 심각한 문제가 발생할 수 있습니다. 이 문제를 해결하려면 운영 체제를 다시 설치해야 할 수도 있습니다. Microsoft는 이러한 문제의 해결을 보증하지 않습니다. 레지스트리 수정에 따른 모든 책임은 사용자에게 있습니다.

이 문제를 해결하려면 레지스트리에서 Mscorlib.tlb 파일의 올바른 경로를 수동으로 지정해야 합니다. 이렇게 하려면 다음과 같이 하십시오.
  1. 시작, 실행을 차례로 누르고 regedit를 입력한 다음 확인을 누릅니다.
  2. 다음 레지스트리 하위 키를 찾습니다.
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\Shell\TlbAutoRepair\mscorlib.tlb
    참고
    • 64비트 운영 체제에 SQL Server 2005를 설치하는 경우 다음 레지스트리 하위 키를 찾습니다.
      HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\90\Tools\Shell\TlbAutoRepair\mscorlib.tlb
    • SQL Server 2005 Express Edition with Advanced Services를 설치하는 경우 다음 레지스트리 하위 키를 찾습니다.
      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\Tools\ShellSEM\TlbAutoRepair\mscorlib.tlb
  3. 오른쪽 창에서 TlbPath 레지스트리 항목을 두 번 누릅니다. 문자열 편집 대화 상자가 나타납니다.
  4. 값 데이터 상자에서 %CLRVERSION%를 다음 값으로 대체합니다.
    v2.0.50727
    참고 값 v2.0.50727은 최초 릴리스 버전의 SQL Server 2005가 사용하는 .NET Framework의 버전을 나타냅니다.
  5. 확인을 누른 다음 레지스트리 편집기를 종료합니다.
중요 SQL Server 2005 서비스 팩 또는 핫픽스를 설치하면 4단계에서 대체한 값이 다시 %CLRVERSION%으로 변경됩니다. 서비스 팩이나 핫픽스를 설치한 후 이 문서에서 설명하는 문제가 다시 발생하면 위의 단계를 다시 수행하여 문제를 해결해야 합니다.

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지LG CYON | SU100 | Normal program | Unknown | 2009:06:09 15:24:19

2009년 이루어야할 목표중 하나인

MCITP 자격 인증 시험 오늘 드디어 쳤다.

1시간 30분 가량  시험 치면서 한숨만...

덤프를 보고는 갔지만... 덤프와 비슷한 문제는 몇문제 밖에 안되고

영어로 된 문제를 해석하면 풀어야 하는 상황...

대략 난감.... 문제 푸는 내내 떨어 질꺼 같은 느낌...

한글로 문제가 되어 있으면 얼마나 좋을까...

하이튼 결과는 PASS

전형료 10만원 날리는줄 알았는데 다행히.. 붙어서..ㅎㅎ

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2009.06.09 16:30 Favicon of http://www.ddoung2.com BlogIcon 연이  댓글주소  수정/삭제  댓글쓰기

    음.. 금새 올렸네.. 합격 축하 ㅋㅋ

  2. 2009.06.09 16:32 Favicon of http://bluejini.kr BlogIcon ㏈ª ☞ β┖υΕJini.κR  댓글주소  수정/삭제  댓글쓰기

    형도 합격 ㅊ ㅋ ㅎㅎ

사용자 삽입 이미지
  


Certifications:

Microsoft Certified Technology Specialist (MCTS):SQL Server 2008, Implementation
and Maintenance

You need to pass one exam 70-432 focusing on installing, configuring and maintaining SQL Server
2008.
Skills measured include:

Microsoft Certified Technology Specialist - SQL Server 2008 Implementation and Maintenance

  • Installing and configuring SQL Server 2008
  • Maintaining SQL Server instances
  • Managing SQL Server security
  • Maintaining a SQL Server database
  • Performing data management tasks
  • Monitoring and troubleshooting SQL Server
  • Optimising SQL Server performance
  • Implementing high availability

Exam 70-432: TS: Microsoft SQL Server 2008, Implementation and MaintenanceYou
need to pass one exam 70-432 focusing on installing, configuring and maintaining
SQL Server 2008.

Exam 70-432 also forms a credit towards: MCITP: Database Administrator 2008

 

MCTS: SQL Server 2008, Database Development

Microsoft Certified Technology Specialist - SQL Server 2008 Database Development

You need to pass one exam 70-433 covering the following areas:

  • Implementing tables and views
  • Implementing programming object
  • Working with query fundamentals
  • Applying additional query techniques
  • Working with additional SQL Server components
  • Working with XML data
  • Gathering performance information

Exam 70-433: TS: Microsoft SQL Server 2008, Database Development

Exam 70-433 also forms a credit towards: MCITP: Database Developer 2008
 


MCTS: SQL Server 2008, Business Intelligence Development and Maintenance

This certification is for candidates who work with SQL Server 2008 and work with the business intelligence technologies, including Reporting Services, Analysis Services and Integration Services.

Microsoft Certified IT Professional - SQL Server 2008 Business Intelligence Development and Maintenance

You need to pass one exam 70-448 covering the following areas:

  • Implementing a SQL Server Integration Services (SSIS) solution
  • Configuring, deploying and maintaining SSIS
  • Implementing a SQL Server Analysis Services (SSAS) solution
  • Configuring, deploying and maintaining SSAS
  • Implementing a SQL Server Reporting Services (SSRS) solution
  • Configuring, deploying and maintaining SSRS

Exam 70-448: TS: Microsoft SQL Server 2008, Business Intelligence Development and Maintenance

Exam 70-448 also forms a credit towards: MCITP: Business Intelligence Developer
2008


 

MCITP: Database Administrator 2008

This certification is targeted at the professional level SQL Server 2008 Database Administrator. It tests your ability to make appropriate design and technology choice considerations for your SQL Server 2008 installations.

Microsoft Certified IT Professional - Database Administrator 2008

You need to pass two exams – 70-432 (mentioned above) and 70-450 covering the following areas:

  • Designing a SQL Server instance and a database solution
  • Designing a database server security solution
  • Designing a database solution for high availability
  • Designing a backup and recovery solution
  • Designing a monitoring strategy
  • Designing a strategy to maintain and manage databases
  • Designing a strategy for data distribution

Exam 70-450: TS: PRO: Designing, Optimizing and Maintaining a Database
Administrative Solution Using Microsoft SQL Server 2008
 


 

Upgrade Path:


If you hold the MCITP: Database Administrator certification on SQL Server 2005,
you can earn MCITP: Database Administrator 2008 by passing the following exam:

Exam 70-453: Upgrade: Transition Your MCITP SQL Server 2005 DBA to MCITP SQL Server 2008


This is an upgrade exam that is designed to assess candidates’ knowledge of installing, configuring and maintaining a SQL Server 2008 system.




MCITP: Database Developer 2008

Microsoft Certified IT Professional - Database Developer 2008

You need to pass two exams – 70-433 (mentioned above) and 70-451 covering the following areas:

  • Designing a database strategy
  • Designing database tables
  • Designing programming objects
  • Designing a transaction and concurrency strategy
  • Designing an XML strategy
  • Designing queries for performance
  • Designing a database for optimal performance

Exam 70-451: PRO: Designing Database Solutions and Data Access Using Microsoft
SQL Server 2008



Upgrade Path:


If you hold the MCITP: Database Developer certification on SQL Server 2005,
you can earn MCITP: Database Developer 2008 by passing the following exam:

Exam 70-454: Upgrade: Transition your MCITP Database Developer Skills to MCITP Database Developer 2008




MCITP: Business Intelligence Developer 2008

This certification validates your ability to design, develop, deploy and maintain
business intelligence solutions by using SQL Server Integration Services,
Reporting Services and Analysis Services in SQL Server 2008.

Microsoft Certified IT Professional - Business Intelligence Developer 2008

You need to pass two exams – 70-428 (mentioned above) and 70-452 covering the following areas:

  • Designing and managing reports
  • Designing data mining models
  • Administering a Business Intelligence (BI) solution
  • Designing the BI architecture
  • Designing and deploying SSIS packages
  • Designing an analysis services database

Exam 70-452: PRO: Designing a Business Intelligence Infrastructure Using Microsoft SQL Server 2008



Upgrade Path:


If you hold the MCITP: Business Intelligence Developer certification on SQL Server
2005, you can earn MCITP: Business Intelligence Developer 2008 by passing the following exam:

Exam 70-455: Upgrade: Transition Your MCITP SQL Server 2005 BI Developer to MCITP SQL Server 2008 BI Developer

Posted by ㏈ª ☞ β┖υΕJini.κR
TAG MCDBA, MCITP, MCTS

댓글을 달아 주세요


사용자 삽입 이미지
네이트온으로 친구가 날짜 형식 관련해서 궁금한게 있단다.

기존의 날짜 형식이 '2001102' 으로 넘어 오는 값을 '10-11 일' 연도를 제거 할려는데

좋은 방법 없냐고... 기존에 친구가 작성한 쿼리는  SUBSTRING 함수CASE문

이용하여 작성된 쿼리였다.

SELECT SUBSTRING(월추출) + '-' + SUBSTRING(일추출) +

CASE 문을 이용 1,2,3,4,5,6,7 조건에 따라 월,화,수,목,금,토,일

로 작성한 쿼리를 나한테 보내 주었다.

간단하게 CONVERT문과 DATENAME 문을 이용하여 변경해 보았다.

DECLARE @SDATE DATETIME
SET @SDATE = '20091011'

SELECT Convert(VARCHAR(5),@SDATE,110) +

' '+  LEFT(DATENAME(dw,@SDATE),1)

특정한 결과를 나타내기 위해서는 많은 방법이 있다. 하지만 가장 효율적으로

가져 올수 있는 방법.... 항상 생각 하게 된다.

이번에 날짜 함수와 MSSQL 의 날짜 형식에 대해서 한번 정리해 보았다.

날짜 함수 관련 DATE구분
DATE구분 구분약자 DATE구분 구분약자
year yy week wk
quarter qq hour hh
month mm minute mi
day of year dy second ss
day dd millisecond ms
항목 내용
GETDATE() 시스템에서 제공하는 날짜와 시간 값
산술연산 -- date + NUMBER
-- date - NUMBER


1 . GETDATE() 함수  ~~ System 의 현재 설정된 날짜값 반환

        SELECT GETDATE()
        2009-02-17 11:48:53.873

        SELECT GETDATE()+100
        2009-05-28 11:49:00.670

2 . CONVERT() 함수  ~~  결과값의 데이타 타입을 변환
 
        SELECT CONVERT(varchar(30), GETDATE(),100)
        02 17 2009 11:49AM

        SELECT CONVERT(varchar(30), GETDATE(),101)
        02/17/2009

        SELECT CONVERT(varchar(30), GETDATE(),102)
        2009.02.17

        SELECT CONVERT(varchar(30), GETDATE(),103)
        17/02/2009

        SELECT CONVERT(varchar(30), GETDATE(),104)
        17.02.2009

        SELECT CONVERT(varchar(30), GETDATE(),105)
        17-02-2009

        SELECT CONVERT(varchar(30), GETDATE(),106)
        17 02 2009

        SELECT CONVERT(varchar(30), GETDATE(),107)
        02 17, 2009

        SELECT CONVERT(varchar(30), GETDATE(),108)
        11:49:49

        SELECT CONVERT(varchar(30), GETDATE(),109)
        02 17 2009 11:49:54:437AM

        SELECT CONVERT(varchar(30), GETDATE(),110)
        02-17-2009

        SELECT CONVERT(varchar(30), GETDATE(),111)
        2009/02/17

        SELECT CONVERT(varchar(30), GETDATE(),112)
        20090217

        SELECT CONVERT(varchar(30), GETDATE(),113)
        17 02 2009 11:50:24:857

        SELECT CONVERT(varchar(30), GETDATE(),114)
        11:50:32:217


3 . DATEPART() 함수  ~~ 날짜에서 지정한 날짜형식 부분만 반환

        형식: DATEPART(날짜형식, 날짜)

        년/월/일/시/분/초/요일을 숫자 형식으로 ...
       
        SELECT DATEPART(yy, GETDATE())
        2009

        SELECT DATEPART(mm, GETDATE())
        2

        SELECT DATEPART(dd, GETDATE())
        17

        SELECT DATEPART(hour, GETDATE())
        11

        SELECT DATEPART(mi, GETDATE())
        50

        SELECT DATEPART(ss, GETDATE())
        58

        SELECT DATEPART(dw, GETDATE())
        3

 4 . YEAR() , MONTH() , DAY() 함수    ~~  해당 년,월,일을 각각 반환
        형식: YEAR(날짜) , MONTH(날짜) , DAY(날짜)

        SELECT YEAR(GETDATE())
        2009

        SELECT MONTH(GETDATE())
        2

        SELECT DAY(GETDATE())
        17

 5 . DATEADD() 함수  ~~  DATEADD함수는 날짜에 지정한 만큼을 ADD
        형식: DATEADD(날짜형식, 더할 값, 날짜)

        SELECT DATEADD(mm,20,GETDATE())
        2010-10-17 11:52:22.920 ~~ 현재날짜에 월에 20을 더한 날짜를 반환        
       
        SELECT DATEADD(dd,100,GETDATE())
        2009-05-28 11:52:31.653 ~~오늘부터 100일 후의 날짜를 반환      


  6 . DATEDIFF() 함수   ~~   DATEDIFF함수는 두 날짜사이의 날짜형식에 지정된 부분을 반환
        형식: DATEDIFF(날짜형식, 시작 날자, 끝 날짜)

        SELECT DATEDIFF(dd,GETDATE(),'3000.1.1') ~~ 현재날짜와 3000.1.1일 일수 반환
        361908

         SELECT DATEDIFF(MM,GETDATE(),'2010.1.1') ~~ 현재날짜와 2010.1.1일 일수 반환
        -11

 7 . DATENAME() 함수  ~~  DATENAME함수는 지정한 날짜의 날자형식의 이름으로 반환
        형식: DATENAME(날짜형식, 날짜)   

        SELECT DATENAME(mm,GETDATE())
        02

        SELECT DATENAME(dd,GETDATE())
        17

        SELECT DATENAME(dw,GETDATE())
        화요일


Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2010.03.03 11:32 붉은바람  댓글주소  수정/삭제  댓글쓰기

    좋은 정보 감사합니다.

  2. 2010.03.04 13:42 β┖υΕJini.κR  댓글주소  수정/삭제  댓글쓰기

    ^^ 도움이 되셨다면 다행이네요.

 http://technet.microsoft.com/ko-kr/library/ms345408.aspx

2005에서는 특별히 resource 데이터베이스에도 신경을 써야 한다.


SQL Server 2008에서 리소스 데이터베이스의 기본 위치는 <drive>:\Program Files\Microsoft SQL Server\MSSQL10.<instance_name>\Binn\입니다. 데이터베이스를 이동할 수 있지만 다음과 같은 두 가지 이유로 이동하지 않는 것이 좋습니다.

SQL Server 서비스 팩 및 핫픽스를 적용하면 데이터베이스를 \Binn 위치로 복원합니다.

장애 조치(failover) 클러스터 환경의 리소스 데이터베이스를 비클러스터형 위치로 이동하면 장애 조치 클러스터 오류가 발생합니다.

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요


우선 매일 D:\BACKUP\DailyBackup\날짜 디렉토리로 특정 날짜의 디렉토리가 누적 생성이 되며

각 DB 서버에서 SSIS 를 이용 하여 D:\BACKUP\DailyBackup 디렉토리로  파일이 전송 된다.

이렇게 모인 모든  데이터중  일 데이터만 백업을 하기 위해서

D:\TapeBackUp\날짜 디렉토리를  생성하여

그 날짜 데이터만을 복사 하여 일 데이터만 가지고 있게 구현 하여 보았다.


Option Explicit
On Error Resume Next
  
Dim objFSO
Dim TempFolder
Dim strPath
Dim SubDir
Dim sd
Const OverwriteExisting = TRUE

Set objFSO = CreateObject("Scripting.FileSystemObject") #파일 관련 비베 객체 생성

TempFolder = "D:\TapeBackUp"  #하루치 데이터만 가지고 있을 폴더 정의

objFSO.DeleteFolder TempFolder  #전날에 데이터를 지우기 위해 TempFolder  삭제

objFSO.CreateFolder TempFolder #금일 데이터를 복사 하기 위한 TempFolder 생성

if Month(Now) < 10 then
    if Day(Now) < 10 then
        TempFolder = "D:\TapeBackUp\" & Year(Now) & "-0" & Month(Now) & "-0" & Day(Now)
 strPath = "D:\BACKUP\DailyBackup\BAK_" & Year(Now) & "0" & Month(Now) & "0" & Day(Now)
    else
        TempFolder = "D:\TapeBackUp\" & Year(Now) & "-0" & Month(Now) & "-" & Day(Now)
 strPath = "D:\BACKUP\DailyBackup\BAK_" & Year(Now) & "0" & Month(Now) & Day(Now)
    end if
else
    if Day(Now) < 10 then
        TempFolder = "D:\TapeBackUp\" & Year(Now) & "-" & Month(Now) & "-0" & Day(Now)
 strPath = "D:\BACKUP\DailyBackup\BAK_" & Year(Now) & Month(Now) & "0" & Day(Now)
    else
        TempFolder = "D:\TapeBackUp\" & Year(Now) & "-" & Month(Now) & "-" & Day(Now)
 strPath = "D:\BACKUP\DailyBackup\BAK_" & Year(Now) & Month(Now) & Day(Now)
    end if
end if

objFSO.CreateFolder TempFolder  #금일 데이터를 복사할 폴더 생성

Set SubDir = objFSO.GetFolder(strPath)  #복사 대상 폴더 정의
For Each sd In SubDir.Files #복사 대상 폴더 하위의 파일을 배열로 정의
 objFSO.CopyFile strPath & "\" & sd.name , TempFolder & "\", OverwriteExisting
Next


각 회사의 정책에 따라 다르겠지만... 매일매일 그날의 데이터만 테입 백업을 해야 한다면

이런식으로 데이터를 옮겨 D:\TapeBackUp 디렉토리를 테입백업 스케쥴러에 걸어 사용 한다면

하루치 데이터만 테입 백업을 할수 있게 된다.
 

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

  1. 2014.03.21 10:27 장민욱  댓글주소  수정/삭제  댓글쓰기

    a라는 컴퓨터에서 서버의 특정폴더를 예약작업으로 자동 복사하려고 하던중에 우연하게 이글을 보게 되었는데요
    이건 확장자가 vbs로 저장해야 하나요? 그리고 복사 대상폳더 정의를 할때
    예를들어 Set SubDir = objFSO.GetFolder(strPath = "\\10.111.25.121\test\data\";)
    이렇게 입력하면 되나요?
    제가 초보여서요 부탁좀 드립니다.



Microsoft 보안 공지 MS09-004 – 중요
Microsoft SQL Server의 취약점으로 인한 원격 코드 실행 문제점 (959420)
게시 날짜: 2009년 2월 11일


요약: 이 보안 업데이트는 비공개적으로 보고된 Microsoft SQL Server의 취약점을 해결합니다.

신뢰할 수 없는 사용자가 영향을 받는 시스템에 액세스하거나 영향을 받는

시스템에 SQL 주입 공격이 발생할 경우 이 취약점으로 인해 원격 코드가 실행될 수 있습니다.

SQL Server 7.0 서비스 팩 4, SQL Server 2005 서비스 팩 3 SQL Server 2008이 설치된 시스템은 이 문제의 영향을 받지 않습니다.

이트는 확장 저장 프로시저에 전달되는 입력 매개 변수의 유효성을 검사하여 취약점을 해결합니다.


심각도:

중요 - SQL Server 2000, SQL Server 2005, SQL Server 2000 Desktop Engine (WMSDE), Windows Internal Database (WYukon)

 

취약점으로 인한 영향: 원격 코드 실행

 

취약점 고유번호와 악용 가능성:

SQL Server sp_replwritetovarbin 제한된 메모리 덮어쓰기 취약점(CVE-2008-

5416) - 일관적인 악용 코드 가능

 

영향을 받는 소프트웨어: SQL Server 2000, SQL Server 2005, SQL Server 2000 Desktop Engine (WMSDE), Windows Internal Database (WYukon) (아래 링크에서 영향을 받는 소프트웨어와 다운로드 위치를 확인하십시오)

 

시스템 재시작: 보안 업데이트 적용 후 시스템을 재시작해야 할 수도 있습니다.

 

이번 업데이트로 대체되는 보안 공지: MS08-040 MS08-052

 

Microsoft 보안 공지 : MS09-004 패치 필요

http://www.microsoft.com/downloads/details.aspx?familyid=a93f3cfe-18c9-4218-a551-13bf415e418a&displaylang=ko



SQL 2005 보안 패치 정보

Microsoft SQL Server SP3 설치 필요

http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=ae7387c3-348c-4faa-8ae5-949fdfbe59c4


Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요

사용자 삽입 이미지



나도 한때 개발자 일때가 있었다.

개발을 하면서 나름 오랬동안 MS-SQL 을 사용해 왔다. 그로 인해 나름 데이터 베이스에

대해서 자신감 나도 나름대로 DB 좀 한다^^라는 생각을 가지고 있었다. 하지만 정원혁 강사님의

강의를 들은후 자심감이 아니라 자만감 이었구나 느끼게 되었다. 현재 많은 개발자들이

SQL 의 기본만 배우고 개발에 뛰어 들고 있다. 그래서 DBA 가 존재 하는지도 모른다.

개발자 들이라면 한번 읽어 봤으면 하는 내용이 웹서핑중에 있어 옮겨 보았다.


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))

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. 프로시져 생성시 주의사항

항상 주석처리할 것 (최초만든자,수정일,수정자,사용예등..)_차후 SP 수정시에도 주석수정


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


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


9. 저장프로시져를 사용하는가?

- 저장프로시져를 적절하게 리컴파일 하면서 사용하는가?

- 프로시저의명칭에 적당한 접두어 규칙을 사용하는가?

(EX:사용자 프로시져는 up_로 시작하는가? 테이블은 tb_로 시작하는가 등)

- 프로시져나 뷰등을 생성 할 때 소유자를 DBO로 지정해 주고 있는가?

- 모든 소유자는 dbo로 통일하는 것을 권장합니다.(소유권 체인 문제 발생 예방)

- SP를 만들 때도 항상 CREATE PROC DBO.SP이름 형식으로 만드는가?


10. 잠금관련 권고사항

    - 트랜잭션은 가능한 짧게 만들었는가?

    - 데드락을 피하기 위해 같은 방향으로 트랜잭션을 진행하는가?

- 잠금수준을 내려서 불필요한 잠금을 없애고 있는가?.(read uncommitted)

    - 트리거를 사용하지 않습니다.

    - 대규모 데이터 변경시에만 커서를 사용합니다.




12. SET NOCOUNT ON 을 사용하는가?

- 프로시저를 작성할 때 SET NOCOUNT ON과 같은 환경설정은 먼저 실행해 두고

프로시저를 작성하는가

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


14. 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


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


16. 쿼리가 인덱스를 사용하고 있는지 확인 하였는가?

- 많이 사용 하는 쿼리가 밑의 방식대로 확인을 했는데 Index Scan라고 인덱스를 생성 해야

한다.

-> 확인 방법 : 쿼리를 작성 후 CTRL + L를 클릭 하여 실행 계획을 인덱스를 사용 하고

있는지를 확인 한다. Clustered Index Seek이나 index Seek은 인덱스를 정상적으로

사용 하는 것이지만 Scan으로 되어 있다면 인덱스를 사용 하지 않는 것이다.


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


18. 현재 프로그램에 하드코딩된 쿼리를 SP로 만들어 사용 할 수는 없는 것들인가?

- 생각 중? à 사용 할 수 없다면 그 이유는 무엇인가? -> DBA와 협의


19. 동적 쿼리를 사용시 EXEC (@str)이 아니고 EXEC sp_executesql을
          사용 하고 있는가?

- EXEC (@str)이 것은 한번 사용한 실행계획을 계속 사용 할 수가 없고 매번 다시 만들게

되므로 성능 저하의 원인이 된다. 그러므로 실행 계획을 재 사용 할 수 있는

EXEC sp_executesql을 사용 할 것을 권장 한다.


20. 변수 사용해서 값을 비교 시 WHERE 절에서 문자열 함수를 사용하고 있는 것은
         아닌가?

        (예: convert(varchar(10),date1,120) = @층, Left(date1,1,8))


21. 다른 서버에서 정보를 가져 올 때 연결된 서버를 이용할 때 4Part name방식 말고

OPENQUERY를 사용하고 있는가?

(예 : SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source=192.168.168.1;User ID=sa;Password=password').PUBS.DBO.titles )


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


23. 서브쿼리 사용시 주의 사항들

- 서브쿼리보다는 조인을 사용하자


24. cursor사용시 주의 사항들

- 클라이언트 측 커서를 사용하자 (커서를 자제 해야 하지만 사용해야 한다면)

: 서버의 커서를 사용할 때에는 가능한 작은 결과 셋을 가져오도록 한다

: 커서를 다 사용한 후에는 그냥 닫지만 말고(close) 말고 반드시 해제(deallocate) 시켜

야 한다.


25. select 성능향상지침 
- Distinct, Order by 를 사용 할 때는 주의 해야 한다.

- 중복 값을 제거하지 않아도 된다면 UNION대신 UNION ALL을 사용하자.


26. insert 성능향상지침

- SELECT … INTO 는 각 로우들의 입력 과정이 로그로 기록 되지 않으므로 로그로 기록

되는 INSERT보다는 가끔 몇 배나 빨리 처리 된다. 그렇지만 이 명령은 시스템 테이블에

락을 걸어 둘 수 있으므로 주의 하여 사용해야 한다.


27. DATA Type의 정의

- 컬럼에 필요한 데이터를 저장할 수 있는 데이터 타입 가운데 항상 가장 작은 데이터 타입

  을 선택한다.

- 컬럼에 저장되는 텍스트 데이터의 길이가 매우 가변적이라면 CHAR 대신 VARCHAR 데이

터 타입을 사용하는 것이 좋다.

- 16비트 문자(유니코드) 데이터를 저장할 계획이 아니라면 NVARCHAR 또는 NCHAR 데이터

타입을 사용하지 않는 것이 좋다.

- 긴 문자열을 저장할 때, 문자열의 길이가 8000자 이하라면 TEXT 대신 VARCHAR 데이터 타입을 사용하는 편이 좋다.

- 숫자만을 저장하는 컬럼은 VARCHAR 또는 CHAR 대신 INTEGER와 같은 숫자 데이터 타입을 사용하는 것이 좋다.

Posted by ㏈ª ☞ β┖υΕJini.κR

댓글을 달아 주세요