1. 문장 끝에 ; 대신 \G 를 사용하면 결과를 세로로 볼 수 있다.
2. select  문장 앞에 explain  키워드를 사용하면  플랜을 볼 수 있다.
explain
select * from User \G 

I. plan 결과 설명
    ※ http://dev.mysql.com/doc/refman/5.5/en/using-explain.html

    1. select_type 값
        - SIMPLE
           . 평범한 SELECT 문장
        - PRIMARY
           . 하위 쿼리나  UNION을 사용할 때 외부(첫 번째) 쿼리
        - UNION
           . UNION 두 번째나 다음 번 쿼리
        - DEPENDENT UNION
           . UNION에서 첫 번째 쿼리에 따른 두 번째나 다음 번 쿼리
        - UNION RESULT
           . UNION 겨로가
        - SUBQUERY
           . 내부 하위 쿼리
        - DEPENDENT SUBQUERY
           . 첫 번째 쿼리에 따른 내부 하위 쿼리(즉, 상관 하위 쿼리)
        - DERIVED
           . FROM 절에서 사용한 하위 쿼리
        - UNCACHEABLE SUBQUERY
           . 그 결과가 캐쉬될 수 없으며 각 행마다 다시 계산되어야 하는 하위 쿼리
        - UNCACHEABLE UNION
           . UNCACHEABLE SUBQUERY에 속한 UNION에서 두 번째나 그 이후의 SELECT

    2. table
        - 쿼리에 응답하는 테이블 명

    3. type
        - 쿼리에서 테이블이 어떻게 조인되는지 설명
        - const 또는 system
           . 테이블이 한 번만 읽어온다. 테이블에 row가 단 하나만 있을 때 일어날 수 있다.
        - eq_ref
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 이 테이블에서 한 row씩 읽는다.
             테이블의 인덱스를 사용할 때 조인이 사용되며 인덱스는 UNIQUE하거나 기본 키이다.
        - fulltext
           . fulltext 인덱스를 사용하여 조인한다.
        - ref
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 이 테이블에서 대응되는 row 집합을 읽어온다.
             조인 조건에 따라서는 한 행만 선택할 수 없을 때, 조인에서 키의 일부분만이 사용되었을 때,
             혹은 키가 UNIQUE 하지 않거나 기본 키가 아닐 때
        - ref_or_null
           . ref 쿼리와 비슷하지만 NULL 인 row 도 찾아본다. (하위 쿼리에서 가장 많이 사용된다)
        - index_merge
           . Index Merge 라는 특별한 최적화 기법이 사용되었다.
        - unique_subquery
           . 유일한 한 줄이 리턴될 때 IN 하위 쿼리에서 ref를 대신하여 사용할 수 있다.
        - index_subquery
           . unique_subquery 와 비숫하지만 인덱스된 유일하지 않은 하위 쿼리에서 사용한다.
        - range
           . 조인하는 테이블에서 row 집합마다 이 테이블 중 특정 범위에 들어가는 row들을 읽어온다.
        - index
           . 모든 인덱스를 읽는다.
        - ALL
           . 이 테이블의 모든 행을 읽는다.

    4. rows
        - 조인을 실행하기 위해 테이블마다 읽어야 하는 row의 수를 대충 계산
          쿼리가 사용하는 총 row의 수를 얻기 위해서는 값들을 곱해야 한다.

    5. possible_keys
        - 테이블을 조인하기 위해 사용할 수 있는 키
        - PRIMARY 는 테이블마다 일반적으로 있기 때문에 대부분 나온다. 

    6. key
        - row 을 조인할 때 실제로 사용하고 있는 키
        - NULL 은 키를 사용하고 있지 않다는 뜻이다.

    7. key_len
        - 사용된 키의 길이를 나타낸다.

    8. ref
        - 테이블에서 row를 선택할 때 사용한 키를 나타낸다.

    9. Extra
        - 어떻게 조인을 실행하는가에 대한 정보
        - Distinct
           . 처음으로 일치하는 줄이 발견되면 끝난다.
        - Not exists
           . LEFT JOIN 을 사용하여 쿼리가 최적화되어 있다.
        - Range checked for each record
           . 조인하는 테이블에서 row 집합을 읽어올 때마다 사용할 수 있는 인덱스를 찾는다.
        - Using filesort
           . 테이터를 정렬하려면 두 번 읽어야 한다. (따라서 시간도 두 배 걸린다)
        - Using index
           . 테이블에 있는 모든 정보를 인덱스에서 얻어왔다. 따라서 실제 row는 읽지 않았다.
        - Using join buffer
           . 조인 버퍼를 사용하여 테이블을 부분적으로 읽어 들인다. 그 후 쿼리를 수행할 때 버퍼에서 각 행을 추출한다.
        - Using temporary
           . 이 쿼리를 실행하는 동안 임시 테이블을 사용하였다.
        - Using where
           . 행을 선택하는 데 where 절을 사용하였다.

II. sql 쿼리 튜닝
    1. 조인 최적화를 위해 키 분배를 검사
        - myisamchk 유틸리티 사용
            #>myisamchk --analyze <pathtomysqldatabase/table명>
            #>myisamchk --analyze <pathtomysqldatabase/*.MYI>
            #>myisamchk --analyze <pathtomysqldatadirectory/*/*.MYI>
        - Analyze Table 문을 사용
            sql>analyze table customers, orders, order_items, books;

    2. 테이블 최적화
        - 테이블의 단편화를 없앤다.
            sql>optimize table <table명>;
            #>myisamchk -r table
        - 테이블의 인덱스를 정렬하고 인덱스에 맞게 데이터를 재배치 한다.
            #>myisamchk --sort-index --sort-records=1 <pathtomysqldatadirectory/*/*.MYI>

SQL Server 2005에서는 소유자 스키마를 소유하고 스키마 오브젝트를 소유합니다.

> 기호의 벌어진 쪽이 좁혀진 쪽을 소유한다는 의미로 사용했을 , 다음과 같이 표현할 있습니다.

소유자 > 스키마 > 오브젝트

 

따라서 소유자를 삭제할 경우에는 삭제할 소유자가 소유한 스키마의 소유권을 새로운 소유자에게 이전한 기존 소유자를 삭제하면 됩니다.

다음의 쿼리를 줄씩 실행해보시면 소유자 확인 이전, 삭제의 방법을 알게 되시리라 생각합니다.

반드시 충분한 테스트를 해보시고 실전에 사용하시기 바랍니다. ^^;;;

 

 

- SQL Server 2005 경우

 

00

/*************************************************************/

01

-- 사용자와 관련 오브젝트 목록 확인 사용자 삭제 - SQL Server 2005

02

/*************************************************************/

03

USE master;

04

GO

05

 

06

/*************************************************************/

07

/**-- 테스트를 위한 사용자, 스키마, 테이블 생성--------------------------*/

08

 

09

-- 테스트 데이터 베이스 생성

10

CREATE DATABASE AccTestDB;

11

 

12

-- 로그인 생성

13

CREATE LOGIN AccountTestA WITH PASSWORD = 'test1';

14

CREATE LOGIN AccountTestB WITH PASSWORD = 'test2';

15

GO

16

 

17

-- 사용자 생성

18

USE AccTestDB;

19

GO

20

CREATE USER AccountTestA FOR LOGIN AccountTestA WITH DEFAULT_SCHEMA = AccSchema;

21

CREATE USER AccountTestB FOR LOGIN AccountTestB WITH DEFAULT_SCHEMA = AccSchema;

22

GO

23

 

24

-- 테이블 생성 권한을 위한 역할 추가

25

EXEC sp_addrolemember 'db_owner', 'AccountTestA';

26

EXEC sp_addrolemember 'db_owner', 'AccountTestB';

27

GO

28

 

29

-- 스키마 생성

30

CREATE SCHEMA AccSchema AUTHORIZATION AccountTestA;

31

 

32

-- 사용자 생성 확인

33

SELECT * FROM sys.sysusers;

34

SELECT * FROM sys.schemas;

35

 

36

-- SQL Server 2005에서는 소유자.테이블이 아닌 스키마.테이블로 테이블을 생성

37

EXECUTE AS LOGIN = 'AccountTestA';

38

GO

39

CREATE TABLE AccSchema.AccTable (Col1 int);

40

GO

41

 

42

/*************************************************************/

43

/**-- AccountTestA 소유자인 오브젝트 목록 조회-------------------------*/

44

SELECT u.name as UserName, s.name as SchemaName, o.Type as ObjectType, o.name as ObjectName

45

FROM sys.sysusers u

46

JOIN sys.schemas s ON u.uid = s.principal_id

47

JOIN sys.objects o ON s.schema_id=o.schema_id

48

WHERE u.name = 'AccountTestA'

49

 

50

/*************************************************************/

51

/**-- SQL Server 2005에서는 소유자가 스키마를 소유하고

52

스키마가 오브젝트를 소유하기 때문에

53

        소유자를 삭제할 경우에는 오브젝트를 삭제하지 않고

54

삭제할 소유자가 소유한 스키마의 소유권을 이전한 ,

55

소유자를 삭제한다. --*/

56

 

57

-- 소유자삭제

58

DROP USER AccountTestA

59

/*

60

메시지15138, 수준16, 상태1, 1

61

데이터베이스 보안 주체는 데이터베이스의 스키마을() 소유하며 삭제할 없습니다.

62

*/

63

 

64

-- AccountTestA 소유자인 테이블 목록 조회

65

SELECT u.name as UserName, s.name as SchemaName

66

FROM sys.sysusers u JOIN sys.schemas s ON u.uid = s.principal_id

67

WHERE u.name = 'AccountTestA'

68

 

69

-- 소유권 이전

70

ALTER AUTHORIZATION ON SCHEMA::AccSchema TO AccountTestB;

71

GO

72

 

73

-- 삭제하려는 소유자를 가진 테이블 삭제 , 사용자 삭제

74

DROP USER AccountTestA;

75

GO

76

SELECT * FROM sys.sysusers WHERE name = 'AccountTestA';

77

GO

78

/*

79

메시지916, 수준14, 상태1, 1

80

현재 보안 컨텍스트로는 서버 보안 주체 "AccountTestA"() 데이터베이스 "AccTestDB" 액세스 없습니다.

81

 

82

*/

83

 

84

/*************************************************************/

85

-- 데이터베이스 삭제

86

REVERT;

87

 

88

USE master;

89

DROP DATABASE AccTestDB;

90

 

91

-- 로그인 삭제

92

DROP LOGIN AccountTestA;

93

DROP LOGIN AccountTestB;

 

 

 

- SQL Server 2000 경우

 

00

/*************************************************************/

01

-- 사용자와 관련 오브젝트 목록 확인- SQL Server 2000

02

/*************************************************************/

03

USE master;

04

GO

05

 

06

/*************************************************************/

07

/**-- 테스트를 위한 사용자 테이블 생성----------------------------------------------*/

08

 

09

-- 테스트 데이터베이스 생성

10

CREATE DATABASE AccTestDB

11

GO

12

 

13

-- 로그인 생성

14

EXEC sp_addlogin 'AccountTest', 'test', 'AccTestDB'

15

 

16

-- 사용자 생성

17

USE AccTestDB

18

GO

19

EXEC sp_adduser 'AccountTest'

20

GO

21

 

22

-- 테이블 생성 권한을 위한 역할 추가

23

EXEC sp_addrolemember 'db_owner', 'AccountTest'

24

 

25

-- 사용자 생성 확인

26

SELECT * FROM sysusers WHERE name = 'AccountTest'

27

 

28

-- 실행 사용자를 AccountTest 변경

29

SETUSER 'AccountTest'

30

 

31

-- 관련 테이블 생성

32

CREATE TABLE AccTable (Col1 int)

33

 

34

 

35

/*************************************************************/

36

/**-- AccountTest 소유자인 오브젝트 목록 조회-------------------------------------*/

37

SELECT o.xType as ObjectType, u.name as UserName, o.name as ObjectName

38

FROM sysusers u JOIN sysobjects o ON u.uid=o.uid

39

WHERE u.name = 'AccountTest'

40

 

41

 

42

/*************************************************************/

43

/**-- 소유자 삭제 테스트-------------------------------------------------------------------*/

44

-- 소유자 삭제

45

EXEC sp_dropuser 'AccountTest'

46

/*

47

서버: 메시지15183, 수준16, 상태1, 프로시저sp_MScheck_uid_owns_anything, 17

48

데이터베이스의 개체를 소유하고 있으므로 사용자를 삭제할 없습니다.

49

*/

50

 

51

-- AccountTest 소유자인 테이블 목록 조회

52

SELECT u.name, o.name FROM sysusers u JOIN sysobjects o ON u.uid=o.uid

53

WHERE u.name = 'AccountTest' and o.xType='U'

54

 

55

-- 로그인 생성

56

SETUSER

57

EXEC sp_addlogin 'AccountTest2';

58

 

59

-- 사용자 생성

60

EXEC sp_adduser 'AccountTest2';

61

 

62

-- 소유자 이전

63

EXEC sp_changeobjectowner 'AccountTest.AccTable' , 'AccountTest2';

64

/*

65

주의: 개체 이름부분을 변경하면 스크립트나 저장프로시저를 손상시킬 있습니다.

66

*/

67

 

68

-- 소유자 삭제 재시도

69

EXEC sp_dropuser 'AccountTest'

70

 

71

-- 로그인 삭제

72

EXEC sp_droplogin 'AccountTest'

73

 

74

-- 확인

75

SELECT * FROM master.dbo.SYSXLOGINS

76

SELECT * FROM SYSUSERS

77

 

78

/**--테스트 완료------------------------------------------------------------------------*/

79

-- 데이터베이스 삭제

80

USE master

81

DROP DATABASE AccTestDB

82

 

83

-- 로그인 삭제

84

EXEC sp_droplogin 'AccountTest2'

85

 

86

-- 확인

87

SELECT * FROM master.dbo.SYSXLOGINS

88

SELECT * FROM SYSUSERS

 

 

[출처] [MS SQL] 사용자 계정과 관련된 오브젝트 확인 및 삭제 (서버관리 마스터 - OS, WAS, DB, Network)



 

기존 로그인 확인


sp_hleplogins -- 기존 로그인 전체를 보여줌

sp_helplogins 'sa'  -- sa 계정에 대한 로그인 정보


로그인 생성과 삭제 


----- window 계정 --------------------------------------------------------------------

exec sp_grantlogin 'testuser' -- db접근 포함, 비번필요없음

exec sp_revokelogin 'testuser'

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


----- sql server 계정 -----------------------------------------------------------------  

exec sp_addlogin 'kimes','pwd123','test' -- '계정이름', '비밀번호','디폴트DB'

exec sp_droplogin 'kimes'

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


----- 로그인 유저 확인 ----------------------------------------------------------------

select name from master.dbo.sysxlogins

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


----- 암호 변경------------------------------------------------------------------------

exec sp_password 'kimes','kimes1234','kimes' -- '기존비번','새 비번','계정이름'

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


DB에 사용자 등록 


----- DB접근 권한 -------------------------------------------------------------------

use TEST

exec sp_grantdbaccess 'kimes'      -- 사용자 'kimes'에게 TEST DB에 접근허가(등록)

exec sp_revokedbaccess 'kimes'     -- 'kimes'의 TEST DB의 접근권한을 빼앗음(제거)

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


----- 현재 DB의 사용자 확 ---------------------------------------------------------

use TEST

select name from sysusers where islogin = 1

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


권 한 


----- OBJECT 사용권한 --------------------------------------------------------------

use TEST


grant select,delete,update,insert        -- select,delete,update,insert 권한을 

   on a                                  -- TEST DB의 a 라는 테이블에

   to kimes                              -- 'kimes'에게 허락


revoke delete                            -- delete 권한 취소

    on a

    to kimes


exec sp_helprotect a,null                -- a 테이블에 대해 주어진 권한보기


grant select(id,name)                    -- id,name이라는 특정 컬럼에만 select권한 허락

   on a

   to kimes


exec sp_helprotect null,kimes            -- 특정 컬럼에만 주어진 권한보기

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


----- statement 사용권한 -----------------------------------------------------------


grant create table                         -- create table 권한을                                      

   to kimes                                -- 'kimes'에게 허락


revoke create table                        -- create table 권한 취소

    to kimes

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


역 할 


----- server 역할 -------------------------------------------------------------------


exec sp_addsrvrolemember 'kimes','sysadmin'       -- system Administrator 권한 허락                                      


exec sp_dropaddsrvrolemember 'kimes','sysadmin'   -- system Administrator 권한 취소


exec sp_helpsrvrolemember 'sysadmin'              -- 서버역할 구성원 확인 

                                                  -- sysadmin 생략하면 전체 구성원 확인

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


----- database 역할 -----------------------------------------------------------------


exec sp_addrolemember 'db_owner','kimes'          -- DB 소유자 권한 허락


exec sp_droprolemember 'db_owner','kimes'         -- DB 소유자 권한 취소


exec sp_helprolemember 'db_datawrite'             -- DB역할 구성원 확인


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


from : http://yyrooyhh.tistory.com/


DBCC 명령어

설명

DBCC CHECKALLOC

지정된 데이터베이스에 대한 디스크 공간 할당 구조의 일관성을 검사합니다.

DBCC CHECKCATALOG

지정한 데이터베이스 내의 카탈로그 일관성을 검사합니다.

DBCC CHECKCONSTRAINTS

현재 데이터베이스의 지정한 테이블에서 특정 제약 조건이나 모든 제약 조건의 무결성을 검사합니다.

DBCC CHECKDB

현재 데이터베이스에 있는 모든 테이블의 할당과 구조적 무결성을 검사합니다.

DBCC CHECKFILEGROUP

지정한 파일 그룹에서 현재 데이터베이스에 있는 모든 테이블의 할당과 구조적 무결성을 검사합니다.

DBCC CHECKIDENT

지정한 테이블의 현재 ID 값을 검사하고 필요에 따라 변경합니다.

DBCC CHECKTABLE

특정 테이블 또는 특정 인덱싱된 뷰를 구성하는 모든 페이지 구조의 무결성을 검사합니다.

DBCC DBREINDEX

지정한 데이터베이스의 테이블에 대해 하나 이상의 인덱스를 다시 작성합니다. 그렇지만 기능은 다음 버전에서 제거될 예정이므로 ALTER INDEX 사용하는 것을 권고합니다.

DBCC DROPCLEANBUFFERS

버퍼 풀에서 버퍼를 모두 제거하는 명령어입니다. DBCC DROPCLEANBUFFERS 사용하면 서버를 종료하고 다시 시작하지 않아도 완전히 버퍼 캐시를 사용하여 쿼리를 테스트할 있습니다. 성능 튜닝 테스트에 활용할 있습니다.

DBCC FREEPROCCACHE

프로시저 캐시를 비우는 명령어입니다

 

DBCC 명령어

설명

DBCC FREESESSIONCACHE

분산 쿼리에서 Microsoft SQL Server 인스턴스에 대해 사용한 분산 쿼리 연결 캐시를 플러시합니다.

DBCC FREESYSTEMCACHE

모든 캐시의 사용하지 않는 캐시 항목을 모두 해제합니다. SQL Server 2005 데이터베이스 엔진은 현재 항목에 필요한 메모리 확보를 위해 사용하지 않는 캐시 항목을 백그라운드에서 미리 정리합니다. 하지만 명령을 사용해 사용하지 않는 항목을 모든 캐시에서 직접 제거할 있습니다.

DBCC HELP

지정한 DBCC 명령의 구문 정보를 제공합니다.

DBCC INDEXDEFRAG

지정된 테이블 또는 뷰의 인덱스를 조각 모음합니다.

기능은 다음 버전에서 제거될 예정이므로, 명령어대신 ALTER INDEX 사용하는 것을 권고합니다..

DBCC INPUTBUFFER

클라이언트가 Microsoft SQL Server 2005 인스턴스로 마지막으로 전송한 SQL 문을 반환합니다.

DBCC OPENTRAN

지정한 데이터베이스에서 가장 오래된 활성 트랜잭션과 가장 오래된 분산 비분산 복제 트랜잭션에 대한 정보를 표시합니다. 활성 트랜잭션이 있거나 데이터베이스에 복제 정보가 있는 경우에만 결과가 반환됩니다.

DBCC OUTPUTBUFFER

지정한 session_id 현재 출력 버퍼를 16진수와 ASCII 형식으로 반환합니다.

DBCC PINTABLE

제거된 기능입니다. 오류 메시지는 반환하지 않지만 실제로는 효력이 없습니다. 마찬가지로 DBCC UNPINTABLE 제거되었습니다.

DBCC PROCCACHE

프로시저 캐시에 대한 정보를 테이블 형식으로 반환합니다.

DBCC SHOW_STATISTICS

지정한 테이블에서 특정 대상에 대한 현재 배포 통계를 제공합니다.

 

DBCC SHOWCONTIG

지정한 테이블의 데이터와 인덱스에 대한 조각화 정보를 제공합니다. 기능은 다음 버전에서 제거될 예정이므로 대신 sys.dm_db_index_physical_stats 사용하는 것을 권고합니다.

DBCC SHRINKDATABASE

지정한 데이터베이스의 데이터 파일의 크기를 축소합니다.

DBCC SHRINKFILE

지정한 데이터베이스에서 지정한 파일(데이터 파일이나 로그 파일) 크기를 축소합니다.

DBCC SQLPERF

모든 데이터베이스의 트랜잭션 로그 공간에 관한 통계를 제공합니다.

DBCC TRACEON

지정한 추적 플래그를 활성화합니다.

DBCC TRACEOFF

지정한 추적 플래그를 해제합니다.

DBCC TRACESTATUS

추적 플래그의 상태 정보를 제공합니다.

DBCC UPDATEUSAGE

카탈로그 뷰의 부정확한 페이지와 개수를 보고하고 수정합니다. 페이지와 개수가 부정확하면 sp_spaceused 시스템 저장 프로시저에서 반환하는 공간 사용 정보가 정확하지 않게 됩니다. SQL Server 2005 에서는 항상 정확한 값이 유지 관리되기 때문에 SQL Server 2005 에서 만든 데이터베이스에서는 개수가 부정확한 경우가 없지만 SQL Server 2005 업그레이드한 데이터베이스에는 올바르지 않은 개수가 포함될 있으므로 SQL Server 2005 업그레이드한 다음에는 DBCC UPDATEUSAGE 실행하여 올바르지 않은 개수를 수정하는 것이 좋습니다.

DBCC USEROPTIONS

현재의 연결에 설정되어 있는 SET 옵션 정보를 제공합니다.

[출처] DBCC명령어|작성자 팬더

다들 알고 계시겠지만 TRUNCATE 와 DELETE의 비교입니다.

 

TRUNCATE 명령은 WHERE 절이 없는 DELETE와 유사하나, 아래 내용들에 있어 차이를 보인다.

 

  • TRUNCATE는 테이블 크기에 관계없이 매우 빠르다. DELETE는 롤백이 발생될 경우에 대비하여 언두 정보를 생성하여 로그 파일에 기록하지만, TRUNCATE는 언두를 생성하지 않는다.

 

  • TRUNCATE는 DDL로서 다른 DDL과 마찬가지로 묵시적으로 커밋을 수행하기 때문에 롤백 할 수 없다. 커밋되지 않은 상태의 DML변경 또한 TRUNCATE 명령과 함께 커밋 될 것이다.

 

  • TRUNCATE는 테이블과 모든 인덱스의 HWM(high-water mark)을 리셋한다. 전체 테이블 스캔 및 인덱스 전체-고속 스캔(index fast-full scan)은 HWM까지의 모든 데이터 블록을 읽기 때문에 DELETE 후에는 전체 스캔 작업이 향상되지 않지만, TRUNCATE 후 이 작업은 매우 빨라진다.

 

  • TRUNCATE는 어떤 DELETE 트리거도 발생시키지 않는다.

 

  • 한 사용자가 다른 사용자의 테이블을 TRUNCATE 하도록 허용하는 객체 권한은 존재하지 않는다. 다른 스키마의 테이블을 TRUNCATE하기 위해서는 DROP ANY TABLE 시스템 권한이 요구된다.

 


1. DROP TABLE A; (DDL)

구조와 row를 모두 날린다.

 

2. DELETE FROM A; (DML)

row를 모두 날린다. 시퀀스 값을 사용하고 있다면 삭제된 이후의 번호부터 차례로 값이 증가한다. (초기화 X)

 

3. TRUNCATE TABLE A; (DDL)

row를 모두 날린다. 초기화 O

 

DML은 롤백이 가능하지만 DDL은 불가능하다.

'Database' 카테고리의 다른 글

NoSQL에 대해서 #2  (0) 2011.06.09
NoSQL에 대해서 #1  (0) 2011.06.09

Use DBNAME;
GO

alter database DBNAME set single_user;
GO

// DB 단위
dbcc checkdb(DBNAME, REPAIR_FAST | REPAIR_REBUILD | REPAIR_ALLOW_DATA_LOSS);
GO

// 테이블 단위
dbcc checktable(TABLENAME, REPAIR_FAST | REPAIR_REBUILD | REPAIR_ALLOW_DATA_LOSS);
GO

// 할당 에러를 점검
dbcc newalloc(DBNAME);
GO


alter database DBNAME set multi_user;
GO



<파라메터>

REPAIR_ALLOW_DATA_LOSS

보고된 모든 오류를 복구합니다. 이러한 복구를 수행하면 일부 데이터가 손실될 수 있습니다.

REPAIR_FAST

이전 버전과의 호환성을 위해서만 구문을 유지 관리합니다. 복구 동작은 수행되지 않습니다.

REPAIR_REBUILD

데이터 손실 가능성이 없는 복구를 수행합니다. 여기에는 비클러스터형 인덱스의 누락 행 복구와 같은 빠른 복구 작업과 인덱스 다시 작성과 같이 시간이 오래 걸리는 복구가 모두 포함됩니다.

REPAIR_REBUILD는 FILESTREAM 데이터 관련 오류를 복구하지 않습니다.



'Database > SQL-Server' 카테고리의 다른 글

MS_SQL SERVER 2000 로그인 생성, 역할 지정  (0) 2011.06.29
DBCC 명령어  (0) 2011.06.29
[MSSQL] 날짜 연산 DATEADD  (0) 2011.05.13
MSSQL dateadd() 이용하여 말일, 초일 구해보자  (0) 2011.05.13
MSSQL Date Type Convert  (0) 2011.05.13
앞의 포스팅에서 언급했듯이 NoSQL은 생겨난 이유는 비슷하지만 각각 접근 방법은 다르기 때문에 수많은 NoSQL들을 다양한 기준에 따라 분류할 수 있습니다.

CAP 이론
Consistent - Available : Postgres, MySQL같은 전통적인 RBMS
Consistent - Partition Tolerant : BitTable , Hypertable , HBase , MongoDB , Terrastore , Redis , Scalaris , MemcacheDB , BerkeleyDB
Available - Partition Tolerant : Amazon Dynamo , Cassandra , CouchDB , Amazon SimpleDB , Riak



분산형과 비분산형
분산형 : Amazon Dynamo, Amazon S3, Scalaris, Voldemort, CouchDB, Riak, MongoDB, BigTable, Cassandra, HyperTable, HBase
비분산형 : Redis, Tokyo Tyrant, MemcacheDB, Amazon SimpleDB

분산형 데이터베이스는 확장성을 위한 Data Partitioning과 Availability를 위한 복제에 대한 책임을 가지고 있고 비 분산형은 클라이언트가 이 책임들을 가지고 있습니다. 주목할만한 분산모델은 Dynamo에서 사용되었지만 Voldemort, Riak, Cassandra에서 이 모델을 카피해서 사용하고 있으며 이질적인 하드웨어간에도 효과적입니다.



데이터 모델의 풍부함(Richness)
Key-Value Store : Amazon Dynamo, Amazon S3, Redis, Scalaris, Voldemort
Document Store :
Amazon SimpleDB, Apache CouchDB, MongoDB, Riak
Column Store :
Scssandra, Google BigTable, HBase, Hypertable

이 분류에서 한쪽 끝은 Key-Value Store이고 반대쪽은 가장 부유한 Column Store입니다. 이 두 사이에는 관계형데이터베이스의 사촌정도가 되는 Document Store가 위치하고 있고 Key-Value보다는 풍부하고 이해하기가 쉽습니다.


Disk와 Memory
Memory : Scalaris, Redis
Configurable :
BigTable, Cassandra, HBase, HyperTable
Disk : CouchDB, MongoDB, Riak, Voldemort

Scalaris는 완전한 메모리 기반이고 Redis는 메모리주도적입니다. Configurable에 분류에 포함된 데이터베이스들은 많은 컨트롤을 제공하기 위해 얼마나 큰 메모리를 얻을 것인지를 설정할 수 있으며 Disk의 범주에 있는 CouchDB, MongoDB, Riak은 on-disk B+ Tree를 사용하며 Voldemort는 BDB와 MySQL을 사용하고 있습니다.






데이터 모델의 방식에 따라 주요한  NoSQL위주로 특징들을 정리했습니다.

Key-Value Store
Key-Value Store는 가장 간단하게 가능한 데이터 모델을 제공합니다. 범위쿼리는 데이터베이스에서 명백하게 지원하지 않는다면 쉽지 않습니다. 그리고 Key-Value Store상에서의 애플리케이션 모델링은 복잡성을 가질 수 있습니다.

Amazon Dynamo

  • 분산형 Key-Value Store로 값이 시스템에 불투명합니다. 타겟 오브젝트는 보통 1MB 미만으로 Amazon내부에서 사용되고 있고 외부에서는 직접 이용할 수 없습니다.
  • 일관성 해싱을 사용해서 Partitioning을 합니다.
  • 복제 - 데이터는 다중호스트에 복제됩니다.
  • 일관성 - 업데이트는 비동기적으로 복제는 전파하기 때문에 모델은 결국 일관성을 가집니다.



Amazon S3

  • 분산형 Key-Object Store로 오브젝트는 시스템에 불투명합니다. 각 오브젝트의 사이즈는 1byte ~ 5GB의 범위내에 있으며 오브젝트의 갯수는 제한이 없는 무제한 스토리지 입니다. 오브젝트는 Amazon 데이터센터 내에서 유지가 되며 오브젝트의 위치에 대한 GEO를 결정하며 저장되는 오브젝트가 크면 유용합니다.
  • 일관성 : 새로운 PUT에서 Read Your Write1를 이루고 PUT과 DELETE를 덮어써서 결과적인 일관성을 가집니다.





Document Store
Document Store는 Key-Value Store보다 한걸음 더 나아간 구조입니다. 스키마가 테이블의 형태보다 먼저 정의되어야 하는 관계형 데이터베이스와는 달라서 각 도큐먼트는 다른 스키마를 가질 수 있습니다. 그러면서도 관계형 데이터베이스처럼 레코드간의 관계를 설명하는 것이 가능합니다. 이 먼저 정의해야하는 스키마를 제외하고는 개념적으로 관계형 데이터베이스와 아주 유사합니다.

Amazon SimpleDB

  • Erlang으로 작성되었습니다.
  • 데이터는 관계된 데이터를 함께 보관하기 위한 컨테이너로써의 도메인과 도메인으로 연결하기 위한 엔티티, 아이템의 프로퍼티로써 속성과 그 값으로 모델되었습니다.
  • 기본적으로 각 아이템은 속성을 언제나 추가/삭제 가능한 Dictionary입니다.
  • 아이템이 추가될 때 속성에 기반하여 인덱스됩니다.
  • 결과적인 일관성을 갖습니다.
  • 파티셔닝 : 도메인 - 아이템 - 어트리뷰트 모델은 각 도메인의 사이즈와 도메딩당 속성의 갯수 및 도메인의 갯수에 대한 제한을 갖는다. 그러므로 확장을 위해서는 데이터를 수동으로 파티션해야 합니다.



Apache CouchDB

  • Erlang로 작성되었습니다.
  • 데이터와 스토리지 모델 :
    • 레코드는 JSON스트링(도큐먼트)의 형식으로 직렬화됩며 각 도큐먼트는 유니크한 DocId를 같습니다.
    • B+트리 를 사용하면 커밋된 데이터는 결코 덮어써지지 않고 오직 오퍼레이션만 추가합니다.
    • Append only 모델로 Read가 다중버전의 동시성 제어를 사용해서 수행됩니다.
      쓰기는 동시에 작성가능한 Blob외에는 직렬화됩니다.
    • 같은 데이터를 위한 다중 뷰를 가질 수 있습니다.
    • Design Document라고 부르는 도큐먼트의 특별한 타입에서 갑에 키를 매핑하는 Javascript함수를 사용하도록 정의되었습니다.
  • View함수는 View를 쿼리했을 때 실행되며 기본적으로 Map 함수와 Reduce 함수가 존재합니다.
  • 복제 : 다중마스터를 지원하는 마스터 슬레이브를 갖으며 오직 최신 리비전만 복제가 됩니다.
  • 멀티마스터에서의 충돌(Conflict) 핸들링 : 충돌을 탐지하고 winner를 선택하기 위해 결정론적인 알고리즘을 사용하며 여기서 winner는 기대한 것일수도 아닐 수도 있기 때문에 아닐 경우에는 애플리케이션에서 스스로 고쳐야 합니다.
  • Partitioning과 로드 밸런싱 - CouchDB Lounge 에 의해서 제공됩니다.
  • Apache 2.0 라이센스를 따릅니다.



MongoDB

  • C++로 작성되었습니다.
  • 데이터 모델
    • 컬렉션 - Amazon SimpleDB의 도메인과 유사하며 비슷한 도큐먼트들을 함께 두기 위한 Bucket입니다.
    • Key-Value는 바이너리 직렬화된 JSON(BSON - Binary Serialized JSON )입니다.
    • 한 BSON 객체는 4MB 제한이 있습니다.
    • 큰 객체는 GridFS 를 통해 지원하고 있습니다.
    • 인덱스를 위해서 B-Tree가 사용되며 필드를 파라미터로 받는 db.things.ensureIndex()함수를 사용해서 인덱스에서 필드를 열거합니다.
  • 스토리지
    • in-Place 업데이트입니다.
    • 부분적인 업데이트를 제공하기 때문에 전체 로우를 보내지 않고 값을 업데이트 할 수 있습니다.
    • Forward-only 커서를 지원합니다.
    • 단일 도큐먼트 원자적 업데이트를 지원합니다. 원자적인 배치 업데이트는 db.eval()을 통해서 가능하지만 파티션된 데이터는 지원안할 수도 있습니다.
  • 쿼리
    • 도큐먼트 내부에서 값을 선택하기 위한 Syntax기반의 JSON 스타일을 제공합니다.
    • 상황적인 Operator와 정규식 등을 지원합니다.
    • Forward-only 커서를 지원합니다.
    • 쿼리 옵티마이징은 다중 쿼리플랜을 시도하고 가장 잘 동작하는 것을 선택하는 형식입니다.
  • 배치 오퍼레이션 : 컬렉션에 Map-Reduce를 지원합니다.
  • 복제 : 마스터-슬레이브 보델로 자동적으로 마스터와 슬레이브의 역할을 이해하는 복제쌍(replica pair)입니다.
  • Partitioning
    • 알파스테이지에서 파티셔닝 됩니다.
    • 파편(Shards)는 Chunk라고 불리는 유닛에서 데이터를 다루며 Chunk는 최대 50MB의 컬렉션으루부터 인접하는 범위의 데이터입니다.
    • 데이터는 하나의 Shard에서 Chunk안의 다른 Shard로 마이그레이션 됩니다.
  • AGPL 3.0 라이센스를 따릅니다.





Column Store

BigTable

  • 구글에서 내부적으로 사용하면 Google App Engine를 통해서 공개됩니다.
    Block를 짓습니다.
    • Google File System 를 사용하여 분산 파일시스템과 Raw 스토리지를 제공합니다. 청크서버가 청크를 저장할 책임을 가지고 있으며 각 청크는 안전을 위해 3개의 머신에 복제가 됩니다. 데이터전송은 클라이언트와 청크서버 사이에서 직접 발생합니다.
    • 스토리지 파일 포맷은 정렬된 스트링 테이블로 SSTable로 불립니다.
    • 스케쥴러는 메선에서 스케쥴 잡으로 제공됩니다.
    • 분산된 Lock과 파일, 네임 매니저로 Chubby 서비스 를 사용한다.

  • 데이터 모델은 Map의 Map인 다차원 Map입니다. 데이터는 테이블로 조직화되고 테이블은 관계된 데이터를 가진 엔티티입니다.
  • Write : Write 요청이 타블렛 서버에 도달했을 때 잘 규격화 되었는지와 권한을 확인하며 유효한 변경은 커밋로그에 작성됩니다.
  • Read : Write요청과 비슷한 확인을 하며 SSTable의 순서와 Memtable의 합쳐진 View에서 실행됩니다.



Cassandra

  • BigTable의 컬럼패밀리(Column-family) 데이터 모델과 Dynamo의 분산 아키텍쳐를 합쳤습니다.
  • Java로 작성되었습니다.
  • 데이터 모델
    • BigTable같은 키에 의해 인덱스되는 다차원 맵을 사용하며 각 애클리케이션은 BigTable에서 테이블같은 Key-Space를 만듭니다. Key는 레코드를 위한 이름이고 Column은 레코드의 속성이며 타임스템프가 찍힙니다. Column-family는 컴럼의 그룹핑으로 관계형 테이블과 유사하고 Super-Column은 컬림들의 리스트입니다.
    • 소팅은 데이터의 쓰여진 시간으로 정렬되되며 컬럼들은 컬럼의 이름으로 Row내에서 정렬됩니다.
  • Partitioning : Dynamo와 유사하며 순서가 보장된 햄쉬함수를 사용하는 일관된 해시를 사용하고 Dynamo와는 다른 로드밸런싱을 위해소 Chord 접근을 사용합니다.
  • 복제 : Dynamo의 조정자 노트와 선호리스트의 건셉과 같으며 Datacenter aware Rack aware, Rack unaware같은 다양한 보제 정책들을 가지고 있습니다.
  • 퍼시스턴스 : 로컬파일 시스템에 의지하며 스토리지 구조와 접근방식은 BigTable과 유사합니다.
  • Write : Memtable에 대한 업데이트를 따르는 내구성과 복구를 위한 커밋로그를 쓰는 Bigtable의 접근과 유사하며 커밋로그를 위한 각 머신의 전용디스크는 Write를 순차적으로 만들어 쓰루풋을 최대화 합니다.
  • Read : 제공될 노드와 Read-repair를 찾는 Dynamo와 유사한 접근방식을 사용하며 스토리지 레벨에서의 접근은 BigTable과 유사한 Memtable + SSTable 시퀀스로부터 읽습니다.
    라이센스는 Apache 2를 따릅니다.
Footnote.
  1. Read-Your-Writes(RYW) 일관성은 레코드가 업데이트 되었을때 그 레코드에 대한 읽기시도는 업데이트된 값을 돌려주는 것을 보장해주는 것의 의미합니다. [Back]
2010/09/18 23:59 2010/09/18 23:59
크리에이티브 커먼즈 라이센스
Creative Commons License

'Database' 카테고리의 다른 글

DROP, DELETE, TRUNCATE의 차이점  (0) 2011.06.29
NoSQL에 대해서 #1  (0) 2011.06.09

+ Recent posts