2017. 7. 12. 09:25

‘A time-out occurred while waiting for buffer latch’


출처: https://mssqlwiki.com/tag/a-time-out-occurred-while-waiting-for-buffer-latch/


에러 메시지 :

           A time-out occurred while waiting for buffer latch -- type 2, bp 000000C959C8B640, page 3:1524485, stat 0x40d, database id: 48, allocation unit Id: 536870912/281475513581568, task 0x0000000008059468 : 8, waittime 300 seconds, flags 0x3a, owning task 0x0000000006875468. Not continuing to wait.

 

 

유형

현재 래치 획득 요구의 래치 모드다음 매핑을 사용하는 숫자 값입니다. 0 - NL (사용되지 않음); 1 - KP; 2 - SH; 3 - UP; 4 - EX; 5 - DT.

 

 

이유 :

           We would end up with data or data structure inconsistency. To avoid inconsistency SQL Server uses Synchronization Mechanisms like Locks,Latches and Spinlocks.

 

에러 이후 :  Latch 대기 시간 기다리다가 작업이 중지 됨 (복원,패키지 등. )

5분이상 지속 될 경우 모든 스래드가 포함된 미디 덤프가 발생 한다.

 

 

래치 유형은 sysprocesses 의 대기 유형에서 식별 할 수 있음.

 

PAGEIOLATCH_ * : sysprocesses의이 waittype SQL Server가 버퍼 풀 페이지의 물리적 I / O가 완료 될 때까지 기다리고 있음을 나타냅니다

                                 1. PAGEIOLATCH_ *는 일반적으로 과도한 IO를 수행하는 쿼리를 조정하여 해결됩니다 (보통 물리적 IO의 양을 줄이기 위해 인덱스 (또는) 통계를 추가, 변경 및 제거 함).

                                 2. 디스크 병목 현상이 있는지 확인하고 수정하십시오 (Pageiolatch 대기 시간 (ex> 30 ms)).

 

PAGELATCH_ * : sysprocesses의이 waittype SQL Server가 데이터베이스 페이지에 대한 액세스를 기다리고 있지만 페이지가 실제 IO를 수행하지 않음을 나타냅니다

1.        이 문제는 대개 같은 시간에 동일한 물리적 페이지에 액세스하려고 시도하는 다수의 세션으로 인해 발생합니다우리는 spid의 대기 리소스를 봐야합니다. wait_resource는 페이지 번호입니다 (형식은 dbid : file : pageno).

          액세스 중입니다

2. 우리는 DBCC PAGE를 사용하여 우리가 논쟁의 대상이되는 페이지의 객체 또는 유형을 식별 할 수 있습니다또한 할당, 데이터 또는 텍스트에 대한 경합인지 여부를 결정하는 데 도움이됩니다.

 -> 매번 다르고 디비도 다르고 테이블도 다름.

3.        SQL Server에서 가장 자주 대기하는 페이지가 tempdb 데이터베이스에 있으면 dbid 2의 페이지 번호에 대한 대기 리소스 열을 확인합니다   http://support.microsoft.com 언급 된 tempdb 할당 래치 경합이 발생할 수 있습니다 . / kb / 328551

4. 페이지가 사용자 데이터베이스에 있으면 테이블 끝의 동일한 페이지에 대해 모든 스레드가 경합하는 ID와 같은 단조 키에 클러스터형 인덱스가 있는지 확인하십시오이 경우 우리는 다른 것을 선택해야합니다.

          다른 페이지에 작업을 분산시키기 위해 클러스터 된 인덱스 키.

 

LATCH_ * :    buf 래치 대기는 여러 가지로 인해 발생할 수 있습니다. sysprocesses wait resource 열을 사용하여 관련된 래치 유형을 결정할 수 있습니다 (KB 822101). 

1.        매우 일반적인 LATCH_EX 대기는 프로파일 러 추적 또는 sp_trace_getdata 실행으로 인한 것 입니다자세한 내용은 KB 929728을 참조하십시오 .

2.        자동 성장 및 자동 축소.

 

 

 

 

***********   참고  ***********************

 

Types of the Latch:

Buffer (BUF) Latch

Used to synchronize access to BUF structures and their associated database pages.

 

Buffer “IO” Latch

A subset of BUF latches used when the BUF and associated data/index page is in the middle of an IO operation (Reading page from disk or writing page to disk).

 

Non-Buffer (Non-BUF) Latch

These are latches that are used to synchronize general in-memory data structures generally used by queries/tasks executed by parallel threads, auto grow operations , shrink operations etc. 

 

Latch modes

 

Keep (KP) Latches

Used to ensure that the page is not released from memory while it is in use. 

Shared (SH) Latches

Used for read-only access to data structures and prevent write access by others threads.

This mode allows shared access. 

SH is compatible with KP, SH, and UP.  It should be noted that although in general SH implies read-only access, it is not always the case. For buffer latches SH is the minimum mode required in order to read a data page.

Update (UP) Latches

Allows read access to the data structure(Compatible with SH and KP), but prevents other EX-latch access. 

Used for write operations when torn page detection is off and when AWE is not enabled.

Exclusive (EX) Latches

Prevents any read activity from occurring on the latched structure. EX is only compatible with KP.

Used during read IO during write IO when torn page detection is on or AWE is enabled.

Destroy (DT) Latches

Used when removing BUFs from the buffer pool, either by adding them to the free list or unmapping AWE buffers. 

 

 

Latch compatibility

 

KP

SH

UP

EX

DT

KP

Y

Y

Y

Y

N

SH

Y

Y

Y

N

N

UP

Y

Y

N

N

N

EX

Y

N

N

N

N

DT

N

N

N

N

N


'Error Case' 카테고리의 다른 글

Server Broker Error Case  (0) 2011.03.11
에러::SSIS 연결끊기는 현상  (1) 2010.06.03
에러::Agent  (1) 2010.06.03
에러::64bit 버퍼 풀 페이징  (0) 2010.06.03
2017. 4. 10. 10:52

[알림] SQL 업그레이드 패치 후 CDC 버그 - SQL 2012, SQL 2014, SQL2016 버전


일부 버전에서 CU 버전 으로 업그레이드 후 CDC의 변경 테이블에 업데이트 행의 순서대로 정렬되어야 하는데 잘 못 정렬이 되어 데이터 변경 반영이 잘 못 될 수 있는 버그가 발견 되었습니다.

해당 버그는 2017.03.22일에 최종 패치가 되었으며 관련 하여모든 누적 패치 파일이 수정되었습니다

 

현재는 CDC를 사용하고 있지 않지만.  사용하는 서버가 있다면 예전에 받아 업그레이 된 버전이 잘 못 된 것이기 때문에  추가로 누적 업데이트 버전을 설치해야 문제가 해결 됩니다

관련 설명 :

https://blogs.msdn.microsoft.com/sql_server_team/cdc-functionality-may-break-after-upgrading-to-the-latest-cu-for-sql-server-2012-2014-and-2016/?utm_source=Brent+Ozar+Unlimited%C2%AE+List&utm_campaign=228cf805e8-Weekly_Links_2017_04_09&utm_medium=email&utm_term=0_8e3e861dd9-228cf805e8-296468997&goal=0_8e3e861dd9-228cf805e8-296468997&mc_cid=228cf805e8&mc_eid=00ebe8618a

 


조짐

Microsoft SQL Server 2012, 2014 또는 2016 데이터베이스에 대해 변경 데이터 캡처  사용하도록 설정 하면 변경 테이블  __ $ 작업 열이 업데이트 된 행에 대해 잘못 정렬 될 수 있습니다행을 업데이트하면 변경 테이블에 __ $ 작업 에 대한 삭제 및 삽입과 함께 두 개의 행이 있습니다 . 그러나 삽입 작업이 예기치 않게 삭제 작업 전에 나타날 수 있습니다응용 프로그램이 기본 키 제약 조건을 사용하여 행을 다른 테이블에 다시 적용하면 다음 기본 키 위반이 발생할 수 있습니다.
 

메시지 2627, 수준 14, 상태 1,  6 PRIMARY KEY 제약 조건 ' Primary_Key_name '. ' table_name ' 개체에 중복 키를 삽입 할 수 없습니다 . 중복 키 값은 (  )입니다.

 

 

https://support.microsoft.com/en-us/help/3030352/fix-the-change-table-is-ordered-incorrectly-for-updated-rows-after-you

 

 

 


2017. 2. 24. 14:24

MS-SQL 2016 New Features

 


 

1.    SQL Server 2016 (데이터베이스 엔진의 새로운 기능

-       Automatic Soft NUMA

n  SQL Server 2016에서는 한 NUMA 노드에 8개 이상의 processor가 있을 경우 자동으로 Soft-NUMA를 구성해 확장성을 높여줌

-       Dynamic Memory Object (CMemThread) Partitioning

n  CMemThread 병목 발생시 자동으로 per NUMA or per CPU Partitioning으로 변경해 CMemThread 대기 완화

-       Multiple Log Writers

n  인스턴스당 4개까지(one per H/W NUMA node) Log Writer thread 생성

-       Parallel Recovery

n  Database Recovery 단계 중 Redo에 대해 병렬 처리

-       SOS_RWLock

n  RWLock Internal Structure에 대한 일관성을 위해 사용되는 동기화 개체로 SQL Server 2014까지는 내부적으로 spinlock이 사용되었습니다.

n  SQL Server 2016에서는 불필요한 spinlock 대기를 없애도록 re-design되어 scalability를 높임

-       DBCC CHECK* 성능 향상

n  1TB 데이터베이스에 대한 내부 테스트 결과 7배 성능 향상



-       In-direct Checkpoint 기본

n  In-direct checkpoint SQL Server 2014에서 추가된 기능이며, SQL Server 2016에서는 Default 설정으로 적용됩니다.

-       Larger Data Writes

n  2016 이전은 한번에 최대 32 Data Pages (256KB) Write하였으며, SQL 2016에서는 최대 128 pages (1MB)로 대량 쓰기 성능 향상됨

(LazyWriter, Checkpoint, Bulk Insert 등에 사용)

 

-       OPTION (USE HINT('<hint1>', '<hint2>')) 같은 보다 일반적인 쿼리 힌트 모델에 대한 지원이 추가 ( SP1 , https://support.microsoft.com/ko-kr/help/3189813/update-introduces-use-hint-query-hint-argument-in-sql-server-2016)

n  use hint 모양이 추가됨보다 직관 적인 힌트 형태가 사용 되어짐.

SELECT * FROM Person.Address 

WHERE City = 'SEATTLE' AND PostalCode = 98104

OPTION (RECOMPILE, USE HINT ('ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES', 'DISABLE_PARAMETER_SNIFFING'));

GO 

-       sys.dm_exec_valid_use_hints DMV가 추가됨 – 모든 힌트 목록을 확인 할 수 있음

-       sys.dm_exec_query_statistics_xml DMV이 추가되어 실행 계획 XML 임시 통계 추가 :  기존에 query plan을 수집하기 위해 했던 작업이 간소화 해 짐.

-       estimated_read_row_count 열이 sys.dm_exec_query_profiles에 추가 (SQL2014에서도 있음 )

n  DMV를 사용하여 느리게 실행되는 쿼리 부분을 결정

n  타임스탬프 열을 사용하여 이 DMV를 다른 성능 카운터(성능 모니터, xperf)와 조인

-       UTF-8에 대한 지원

-       메모리 액세스에 최적화된 테이블에 대한 Transact-SQL 개선 사항

n  UNIQUE 제약 조건 및 인덱스가 지원됩니다.

n  메모리 액세스에 최적화된 테이블 간의 FOREIGN KEY 참조가 지원

n  비고유 인덱스에서 해당 키에 NULL 값을 허용할 수 있음

n  TRIGGER가 메모리 액세스에 최적화된 테이블에서 지원 ( insteadof 트리거는 지원되지 않음)

n  스키마 변경합니다(열 추가/삭제/변경제약 조건 추가/삭제).

-       프로시저 LOB를 허용

n  본 프로시저에서 문자열 함수(: LTrim 또는 Substring)에 전달된 매개 변수 가능

-       통계의 업데이트에 대해 선형 폭이 강조되는 임계값

n  대형 테이블에서 통계의 자동 업데이트가 한층 더 강화되었습니다(호환성 수준 130). 대형 테이블의 경우 SQL Server 2016부터 통계 자동 업데이트를 트리거하는 임계값이 20%가 되어 임계값이 테이블에서 행이 증가한 수만큼 줄어든 상태로 시작됩니다(백분율로 표시). 임계값을 줄이기 위해 2371 추적 플래그를 설정하지 않아도 됩니다.

n  대형 테이블일 경우 20% 가 크게 느껴질 수 있는데 조정 가능 해서 성능 향상에 도움이 됨.

-        Live Query Statistics

n  Management Studio는 활성 쿼리의 활성 실행 계획을 보는 기능을 제공합니다이 활성 쿼리 계획을 통해 제어권이 한 쿼리 계획 연산자에서 다른 연산자로 흘러갈 때 쿼리 실행 프로세스를 실시간으로 파악할 수 있습니다.

-        Monitoring Performance By Using the Query Store (https://msdn.microsoft.com/ko-kr/dn817826)

n  쿼리 저장소는 DBA에게 쿼리 계획 선택 및 성능에 대한 정보를 제공하는 새로운 기능입니다쿼리 계획 변경으로 인해 발생하는 성능 차이를 신속하게 찾을 수 있도록 하여 성능 문제 해결을 간소화합니다이 기능은 쿼리계획 및 런타임 통계의 기록을 자동으로 캡처하고 검토할 수 있도록 이 기록을 유지합니다. 

-      TempDB 데이터베이스

n  Tempdb에 대한 추적 플래그 1117  1118이 필요하지 않습니다. Tempdb 데이터베이스가 여러 개 있을 경우 모든 파일은 증가 설정에 따라 동시에 크기가 증가

n  기본적으로 설치 시 CPU 개수 또는 8개 중 적은 수만큼 tempdb 파일이 추가

n  Tempdb 데이터베이스 파일에 대해 여러 볼륨을 지정할 수 있습니다여러 디렉터리가 지정된 경우 tempdb 데이터 파일은 라운드 로빈 방식으로 여러 디렉터리에 분배됩니다.

-       기본 제공 JSON 지원

-       PolyBase 제공 - Hadoop 또는 Azure Blob Storage에 저장된 데이터에 액세스하고 임시 방식으로 데이터를 쿼리할 수 있습니다

-       Stretch Database -스트레치 데이터베이스는 기록 데이터를 Microsoft Azure 클라우드에 투명하고 안전하게 마이그레이션하는 SQL Server 2016의 새로운 기능입니다

-       이제 TRUNCATE TABLE 문은 지정된 파티션의 잘림을 허용합니다

-       Azure SQL 데이터베이스 복제가 지원됨

-      향상된 고가용성 기능 – Always ON

n  Always On 가용성 그룹은 Windows Server 2016에서 분산 트랜잭션 및 DTC를 지원

n  이제 데이터베이스가 오프라인으로 전환될 때 장애 조치(failover)하도록 Always On 가용성 그룹 을 구성할 수 있습니다.

n  이제 Always On은 암호화된 데이터베이스를 지원합니다

n  가용성 그룹의 동기화 처리량은 주 복제본에서 로그 블록의 병렬 및 빠른 압축최적화된 동기화 프로토콜보조 복제본에서 로그 레코드 다시 실행 및 병렬 압축 풀기를 통해 10배까지 증가되었습니다따라서 읽기 가능한 보조 복제본의 새로 고침이 증가되고 장애 조치(failover) 시 데이터베이스 복구 시간이 줄어듭니다. 

'ETC' 카테고리의 다른 글

SQL Server 2012 Certification upgrade info  (0) 2015.05.20
메모리 dump 분석 예 ( 정확하지 않음 )  (0) 2014.11.06
Windbg 명령어 & 설치  (0) 2014.11.06
Window 서비스 등록/삭제 방법  (0) 2011.10.20
2016. 12. 6. 02:09

Character Set

. Character set :

한글만 입력한다면  KO16MSWIN949 로 설정

한글과 다른 언어를 혼용 해서 사용 한다면 AL32UTF8 설정 하는 것을 권고. 해당 셋이 정렬도 완벽하다.

그리고 꼭 해야 하는 한글 입력 시 ORA-01756: quoted string not properly terminated 발생 하면 클라이언트의 NS_LANG 설정이

잘 먹히지 않은 것.

. .bash_profile 적용 하기.  --> 이 부분 이 잘 안 된 것 같음.

 

 

Database Configuration Assistant - Create Database 
Initialization Parameters 
- step 10 of 14 
DATABASE 
Database Operation 
Creation Mode 
Database Template 
Database Identification 
Management Options 
Database Credentials 
Netuork Configuration 
Storage Locations 
Database Options 
InitializMion Parameters 
Creation Options 
Pre Requisite Checks 
Sum m arg 
Progress Page 
Character Sets 
o 
Use the default 
The default character set for this database IS based on the language setting of this operating 
system: WE8MSWlN1252 
o 
Use Unicode (AL32UTF8) 
Setting character set to Unicode (AL 321JTF8) enables you to store multiple language groups 
Choose from the list of character sets 
Database Character Set 
National Character Set 
Default Language 
Default Territoru 
@ Shourecommended character sets only 
AL161JTF16 - Unicode UT F-16 Universal character set 
American 
United States 
All Initialization Parameters 
< Back 
Next > 
Cancel

SQL> col value$ format a40

SQL> set line 150

SQL> col name format a25

SQL> col value$ format a40

SQL> col comment$ format a40

SQL> select * from sys.props$ where name like '%CHARACTER%';

 

NAME                          VALUE$                                   COMMENT$

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

NLS_NCHAR_CHARACTERSET          AL16UTF16                                   NCHAR Character set

NLS_CHARACTERSET          KO16MSWIN949                                   Character set

NLS_NUMERIC_CHARACTERS          .,                                           Numeric characters

 

SQL> select * from sys.props$ where name like 'NLS_%';

 

NAME                          VALUE$                                   COMMENT$

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

NLS_RDBMS_VERSION          12.1.0.2.0                                   RDBMS version for NLS parameters

NLS_NCHAR_CHARACTERSET          AL16UTF16                                   NCHAR Character set

NLS_NCHAR_CONV_EXCP          FALSE                                    NLS conversion exception

NLS_LENGTH_SEMANTICS          BYTE                                           NLS length semantics

NLS_COMP                  BINARY                                   NLS comparison

NLS_DUAL_CURRENCY          $                                           Dual currency symbol

NLS_TIMESTAMP_TZ_FORMAT   DD-MON-RR HH.MI.SSXFF AM TZR                   Timestamp with timezone format

NLS_TIME_TZ_FORMAT          HH.MI.SSXFF AM TZR                           Time with timezone format

NLS_TIMESTAMP_FORMAT          DD-MON-RR HH.MI.SSXFF AM                   Time stamp format

NLS_TIME_FORMAT           HH.MI.SSXFF AM                           Time format

 

 

NAME                          VALUE$                                   COMMENT$

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

NLS_DATE_LANGUAGE          AMERICAN                                   Date language

NLS_DATE_FORMAT           DD-MON-RR                                   Date format

NLS_CALENDAR                  GREGORIAN                                   Calendar system

NLS_CHARACTERSET          KO16MSWIN949                                   Character set

NLS_NUMERIC_CHARACTERS          .,                                           Numeric characters

NLS_ISO_CURRENCY          AMERICA                                   ISO currency

NLS_CURRENCY                  $                                           Local currency

NLS_TERRITORY                  AMERICA                                   Territory

NLS_LANGUAGE                  AMERICAN                                   Language

 

20 rows selected.

 

 

SQL> set pagesize 30

SQL> col parameter for a30

SQL> col value for a30

SQL>

 

 

SQL> select * from v$nls_parameters;

 

PARAMETER                       VALUE                                  CON_ID

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

NLS_LANGUAGE                       AMERICAN                                0

NLS_TERRITORY                       AMERICA                                       0

NLS_CURRENCY                       $                                       0

NLS_ISO_CURRENCY               AMERICA                                       0

NLS_NUMERIC_CHARACTERS               .,                                       0

NLS_CALENDAR                       GREGORIAN                               0

NLS_DATE_FORMAT                DD-MON-RR                               0

NLS_DATE_LANGUAGE               AMERICAN                                0

NLS_CHARACTERSET               KO16MSWIN949                               0

NLS_SORT                       BINARY                                       0

NLS_TIME_FORMAT                HH.MI.SSXFF AM                               0

NLS_TIMESTAMP_FORMAT               DD-MON-RR HH.MI.SSXFF AM                0

NLS_TIME_TZ_FORMAT               HH.MI.SSXFF AM TZR                       0

NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR               0

NLS_DUAL_CURRENCY               $                                       0

NLS_NCHAR_CHARACTERSET               AL16UTF16                               0

NLS_COMP                       BINARY                                       0

NLS_LENGTH_SEMANTICS               BYTE                                       0

NLS_NCHAR_CONV_EXCP               FALSE                                       0

 

19 rows selected.

 

SQL> select  '보라' d from dual;

ERROR:

ORA-01756: quoted string not properly terminated

 

 

 

 

export NLS_LANG=American_America.KO16MSWIN949

export LANG=C

export EDITOR=vi

'Oracle' 카테고리의 다른 글

오라클 vs MS SQL 함수 비교.  (0) 2016.12.06
아키텍처 기반 튜닝 원리- SQL 전문가 가이드  (0) 2015.09.19
SQL 기본 및 활용  (0) 2015.09.19
2016. 12. 6. 02:04

오라클 vs MS SQL 함수 비교.

오라클 vs MS SQL 함수 비교

수식/수치 연산 함수

다음은 Oracle에서 지원하는 수식/수치 연산 함수와 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

절대 값

ABS

ABS

아크 코사인

ACOS

ACOS

아크 사인

ASIN

ASIN

n의 아크 탄젠트

ATAN

ATAN

n m의 아크 탄젠트

ATAN2

ATN2

최소 정수 >=

CEIL

CEILING

코사인

COS

COS

쌍곡선 코사인

COSH

COT

지수 값

EXP

EXP

최대 정수 <=

FLOOR

FLOOR

자연 로그

LN

LOG

밑이 n인 로그

LOG(N)

해당 없음

상용 로그

LOG(10)

LOG10

나머지 연산자

MOD

USE MODULO (%) OPERATOR

거듭제곱

POWER

POWER

난수

해당 없음

RAND

반올림

ROUND

ROUND

숫자 부호 표시

SIGN

SIGN

사인

SIN

SIN

쌍곡선 사인

SINH

해당 없음

제곱근

SQRT

SQRT

탄젠트

TAN

TAN

쌍곡선 탄젠트

TANH

해당 없음

잘라내기

TRUNC

해당 없음

목록의 최대값

GREATEST

해당 없음

목록의 최소값

LEAST

해당 없음

NULL일 때 숫자 변환

NVL

ISNULL

문자열 함수

다음은 Oracle에서 지원하는 문자열 함수 및 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

문자를 ASCII로 변환

ASCII

ASCII

문자열 연결

CONCAT

( + )

ASCII를 문자로 변환

CHR

CHAR

문자열의 문자 시작 위치 반환(왼쪽부터)

INSTR

CHARINDEX

소문자로 변환

LOWER

LOWER

대문자로 변환

UPPER

UPPER

문자열의 왼쪽 채우기

LPAD

해당 없음

선행 공백 제거

LTRIM

LTRIM

후행 공백 제거

RTRIM

RTRIM

문자열의 패턴 시작 위치

INSTR

PATINDEX

문자열을 여러 번 반복

RPAD

REPLICATE

문자열의 발음 기호

SOUNDEX

SOUNDEX

반복되는 공백 문자열

RPAD

SPACE

수치 데이터에서 변환된 문자 데이터

TO_CHAR

STR

부분 문자열

SUBSTR

SUBSTRING

문자 바꾸기

REPLACE

STUFF

문자열에서 각 단어의 첫 문자를 대문자로 만들기

INITCAP

해당 없음

문자열 번역

TRANSLATE

해당 없음

문자열 길이

LENGTH

DATELENGTH 또는 LEN

목록에서 가장 큰 문자열

GREATEST

해당 없음

목록에서 가장 작은 문자열

LEAST

해당 없음

NULL일 때 문자열 변환

NVL

ISNULL

날짜 함수

다음은 Oracle에서 지원하는 날짜 함수 및 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

날짜 추가

(날짜 열의 +/- ) 또는 ADD_MONTHS

DATEADD

날짜 차이

(날짜 열의 +/- ) 또는 MONTHS_BETWEEN

DATEDIFF

현재 날짜와 시간

SYSDATE

GETDATE()

달의 마지막 날

LAST_DAY

해당 없음

표준 시간대 변환

NEW_TIME

해당 없음

다음 날의 요일

NEXT_DAY

해당 없음

날짜의 문자열 표시

TO_CHAR

DATENAME

날짜의 정수 표시

TO_NUMBER(TO_CHAR))

DATEPART

날짜 반올림

ROUND

CONVERT

날짜 잘라내기

TRUNC

CONVERT

문자열을 날짜로

TO_DATE

CONVERT

NULL일 때 날짜 변환

NVL

ISNULL

변환 함수

다음은 Oracle에서 지원하는 변환 함수 및 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

숫자를 문자로

TO_CHAR

CONVERT

문자를 숫자로

TO_NUMBER

CONVERT

날짜를 문자로

TO_CHAR

CONVERT

문자를 날짜로

TO_DATE

CONVERT

16진수를 이진수로

HEX_TO_RAW

CONVERT

이진수를 16진수로

RAW_TO_HEX

CONVERT

기타 행 수준 함수

다음은 Oracle에서 지원하는 기타 행 수준 함수 및 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

NULL이 아닌 첫째 식 반환

DECODE

COALESCE

현재 시퀀스 값

CURRVAL

해당 없음

다음 시퀀스 값

NEXTVAL

해당 없음

1 = 2일 때 NULL 반환

DECODE

NULLIF

사용자의 로그인 ID 번호

UID

SUSER_ID

사용자의 로그인 이름

USER

SUSER_NAME

사용자의 데이터베이스 ID 번호

UID

USER_ID

사용자의 데이터베이스 이름

USER

USER_NAME

현재 사용자

CURRENT_USER

CURRENT_USER

사용자 환경(감사 추적)

USERENV

해당 없음

CONNECT BY 절의 수준

LEVEL

해당 없음

집계 함수

다음은 Oracle에서 지원하는 집계 함수 및 그에 상응하는 Microsoft SQL Server의 함수를 정리한 표입니다.

함수 설명

Oracle

Microsoft SQL Server

평균

AVG

AVG

개수

COUNT

COUNT

최대값

MAX

MAX

최소값

MIN

MIN

표준 편차

STDDEV

STDEV 또는 STDEVP

합계

SUM

SUM

분산

VARIANCE

VAR 또는 VARP


'Oracle' 카테고리의 다른 글

Character Set  (0) 2016.12.06
아키텍처 기반 튜닝 원리- SQL 전문가 가이드  (0) 2015.09.19
SQL 기본 및 활용  (0) 2015.09.19
2016. 11. 29. 14:47

Check Point 와 활성 로그

MSDN에 참고 


  • https://msdn.microsoft.com/en-us/library/ms189573(v=sql.105).aspx


Database Checkpoints (SQL Server)

  • https://msdn.microsoft.com/en-us/library/ms189573.aspx

CHECKPOINT vs LAZY WRITER

  • http://blog.sqlxdetails.com/checkpoint-vs-lazy-writer/


2016. 9. 2. 18:05

Admin::Mini dump 추출 방법

미니 덤프의 추출을 요청 드리며, 해당 방법에 대하여 다음과 같이 안내 드립니다.

A.      CTRL + ALT + DELETE를 눌러서 작업 관리자를 open

B.      프로세스 Tab을 선택

C.      모든 사용자의 프로세스 표시를 선택 하고, 보기 메뉴에서 열 선택에서 PID(프로세스 식별자)를 선택

D.     sqlservr.exe application process ID를 확인

1)     * SQL Errorlog에서 확인 하는 방법은 다음과 같습니다.

2016-08-13 08:03:24.49 spid257     (c) Microsoft Corporation.

2016-08-13 08:03:24.49 spid257     All rights reserved.

2016-08-13 08:03:24.49 spid257     Server process ID is 9136.

 

E.      cmd 창에서 다음 폴더로 이동.

F.      SQLServerInstallDrive:\Program Files\Microsoft SQL Server\100\Shared

G.      해당 폴더에 sqldumper.exe, dbghelp.dll 파일이 있는지 확인.

H.     다음의 명령어를 실행.

Mini dump 수집일 경우 : Sqldumper.exe ProcessID 0 0x0120:40

 

Ex) process ID 9136일 경우 다음과 같이 실행합니다.

Sqldumper.exe 9136  0 0x0120:40

I.       같은 폴더에 현재 날짜로 만들 어진 .mdmp 파일을 보내 주시면 됩니다


2015. 12. 28. 15:26

성능 Counter - Disk Transfers/sec (Disk Reads/sec, Disk Writes/sec)


 SQL Performance Baseline Template v0.docx



1.     성능 Counter

http://blogs.technet.com/b/askcore/archive/2012/03/16/windows-performance-monitor-disk-counters-explained.aspx

 

Disk Transfers/sec (Disk Reads/sec, Disk Writes/sec) 


Perfmon captures the total number of individual disk IO requests completed over a period of one second.

If the Perfmon capture interval is set for anything greater than one second, the average of the values captured is presented. 
Disk Reads/sec and Disk Writes/sec are calculated in the same way, but break down the results in read requests only or write requests only, respectively.

 

1 기간에 걸쳐 요청에 대한 완료된 개별 Disk I/O 수집 간격이 설정되어 있지 않으면 평균을 이미 한다.

디스크 초당 읽기, 쓰기도 같은 방법이다.

 

Avg. Disk Bytes/Transfer (Avg. Disk Bytes/Read, Avg. Disk Bytes/Write) 
Displays the average size of the individual disk requests (IO size) in bytes, for the capture interval.

Example: If the system had ninety nine IO requests of 8K and one IO request of 2048K, the average will be 28.4K. Calculation = (8k*99) + (1*2048k) / 100 
The Avg. Disk Bytes/Read and Avg. Disk Bytes/Write counters break down the results showing the average size for only read requests or only write requests, respectively. 

 

수집된 간격의 바이트의 개발 디스크 요청의 평균 크기이다.

) 8K 99번의 요청과  2048K 하나의 IO 요청이 있었다면

(8k*99) + (1*1024) /100 =    부근에 있다.




Avg. Disk sec/Transfer (Avg. Disk sec/Read, Avg. Disk sec/Write) 
Displays the average time the disk transfers took to complete, in seconds.

Although the scale is seconds, the counter has millisecond precision, meaning a value of 0.004 indicates the average time for disk transfers to complete was 4 milliseconds. 
This is the counter in Perfmon used to measure IO latency. 
I wrote a blog specifically about measuring latency with Perfmon. For details got to “Measuring Disk Latency with Windows Performance Monitor”. 

 

           디스크에 전송하는데 완료한 초에 대한 평균 시간이다.

          스케일은 초 이지만 카운터의 값이 0.004의 값을 완료 하는데 4밀리초로 하였고, 완료하기 까지 평균 시간을 갖는다.

           이 카운터는 IO 대기 시간을 측정하는데 사용된다.

 

디스크 지연에 대한 블로깅 : http://blogs.technet.com/b/askcore/archive/2012/02/07/measuring-disk-latency-with-windows-performance-monitor-perfmon.aspx

 

SQLServer:Buffer Manager\Readahead pages/sec

 미리 읽기 수 , 디스크에서 읽어서 Buffer pool로 미리 읽어 오는 작업

(SQL 서버의 저장소 엔진은 성능 최적화 메커니즘라는 이름의 미리 읽기 (짧은 RA)를 지원합니다. 그 목적은 쿼리 실행 계획을 이행하는 데 필요한 데이터 및 인덱스 페이지를 예상하고 실제로 쿼리에 의해 사용되기 전에 버퍼 풀 (캐시)에 해당 페이지를 가져오고있다. 이 계산을 할 수 있습니다 및 I / O CPU와 디스크를 모두 최대한 활용 하기 위해 )

 

 이 수치가 높으면 디스크 액세스 속도를 개선 하여 성능을 향상 시킬 수 있습니다필요 한 것 보다 더 많이 읽지 않도록 성능을 개선 할 수 있다.

테이블 스캔을 줄이기 위해 인덱스를 다시 생성 한다.

 

SQL Server:Buffer Manager

Readahead/sec

Number of pages read in anticipation of use. If this value is makes up

even a sizeable minority of total Page Reads/sec

(say, greater than 20% of total page reads), you may have too many physical reads occurring.

< 20% of

Page Reads/

sec

 

         참고 ) http://www.sqlshack.com/

http://blogs.technet.com/b/askcore/archive/2012/03/16/windows-performance-monitor-disk-counters-explained.aspx

 

Disk Transfers/sec (Disk Reads/sec, Disk Writes/sec) 
Perfmon captures the total number of individual disk IO requests completed over a period of one second.

If the Perfmon capture interval is set for anything greater than one second, the average of the values captured is presented. 
Disk Reads/sec and Disk Writes/sec are calculated in the same way, but break down the results in read requests only or write requests only, respectively.

 

1 기간에 걸쳐 요청에 대한 완료된 개별 Disk I/O 수집 간격이 설정되어 있지 않으면 평균을 이미 한다.

디스크 초당 읽기, 쓰기도 같은 방법이다.

 

Avg. Disk Bytes/Transfer (Avg. Disk Bytes/Read, Avg. Disk Bytes/Write) 
Displays the average size of the individual disk requests (IO size) in bytes, for the capture interval.

Example: If the system had ninety nine IO requests of 8K and one IO request of 2048K, the average will be 28.4K. Calculation = (8k*99) + (1*2048k) / 100 
The Avg. Disk Bytes/Read and Avg. Disk Bytes/Write counters break down the results showing the average size for only read requests or only write requests, respectively. 

 

수집된 간격의 바이트의 개발 디스크 요청의 평균 크기이다.

) 8K 99번의 요청과  2048K 하나의 IO 요청이 있었다면

(8k*99) + (1*1024) /100 =    부근에 있다.




Avg. Disk sec/Transfer (Avg. Disk sec/Read, Avg. Disk sec/Write) 
Displays the average time the disk transfers took to complete, in seconds.

Although the scale is seconds, the counter has millisecond precision, meaning a value of 0.004 indicates the average time for disk transfers to complete was 4 milliseconds. 
This is the counter in Perfmon used to measure IO latency. 
I wrote a blog specifically about measuring latency with Perfmon. For details got to “Measuring Disk Latency with Windows Performance Monitor”. 

 

           디스크에 전송하는데 완료한 초에 대한 평균 시간이다.

          스케일은 초 이지만 카운터의 값이 0.004의 값을 완료 하는데 4밀리초로 하였고, 완료하기 까지 평균 시간을 갖는다.

           이 카운터는 IO 대기 시간을 측정하는데 사용된다.

 

디스크 지연에 대한 블로깅 : http://blogs.technet.com/b/askcore/archive/2012/02/07/measuring-disk-latency-with-windows-performance-monitor-perfmon.aspx

 

SQLServer:Buffer Manager\Readahead pages/sec

 미리 읽기 수 , 디스크에서 읽어서 Buffer pool로 미리 읽어 오는 작업

(SQL 서버의 저장소 엔진은 성능 최적화 메커니즘라는 이름의 미리 읽기 (짧은 RA)를 지원합니다. 그 목적은 쿼리 실행 계획을 이행하는 데 필요한 데이터 및 인덱스 페이지를 예상하고 실제로 쿼리에 의해 사용되기 전에 버퍼 풀 (캐시)에 해당 페이지를 가져오고있다. 이 계산을 할 수 있습니다 및 I / O CPU와 디스크를 모두 최대한 활용 하기 위해 )

 

 이 수치가 높으면 디스크 액세스 속도를 개선 하여 성능을 향상 시킬 수 있습니다필요 한 것 보다 더 많이 읽지 않도록 성능을 개선 할 수 있다.

테이블 스캔을 줄이기 위해 인덱스를 다시 생성 한다.

 

SQL Server:Buffer Manager

Readahead/sec

Number of pages read in anticipation of use. If this value is makes up

even a sizeable minority of total Page Reads/sec

(say, greater than 20% of total page reads), you may have too many physical reads occurring.

< 20% of

Page Reads/

sec

 

         참고 ) http://www.sqlshack.com/

'Common Admin' 카테고리의 다른 글

Check Point 와 활성 로그  (0) 2016.11.29
Admin::Mini dump 추출 방법  (0) 2016.09.02
TokenAndPermUserStore  (0) 2015.05.18
Database Landscape map – February 2013  (0) 2013.03.13
2015. 9. 19. 23:45

아키텍처 기반 튜닝 원리- SQL 전문가 가이드

출처 : SQL 전문가 가이드  요약 정리 


데이터베이스 성능 튜닝의 3대 핵심 요소 

  1. SQL 부하 해소 
  2. 데이터 베이스 Call 최소화 
  3. I/O 효율화 
--> 성능 요소를 해결 하는데 90% 이상은 개발팀 역량에 달렸다. 
어플리케이션으로 부터 발생하는 일량을 근본 적으로 줄여야 한다. 

정의

데이터베이스 : 물리적인 디스크에 저장된 데이터집합(데이터파일, 리두로그파일, 컨트롤파일)
인스턴스 : 공유메모리(SGA)와 이를 엑세스하는 프로세스 집합

★하나의 인스턴스는 하나의 데이터베이스를 엑세스(Single), 여러개의 인스턴스는 하나의 데이터베이스를 엑세스(RAC)

나.SQL Server 아키텍처
정의

하나의 인스턴스당 최고 32,767개의 데이터베이스를 정의해서 사용
기본적으로 시스템데이터베이스가 만들어지면, 사용자데이터베이스를 추가하여 생성하는 구조

시스템데이터베이스 : mster, model, msdb, tempdb 등
사용자데이터베이스 : 데이터파일(mdf), 트랜잭션로그파일(ldf), 보조데이터파일(ndf)


백그라운드프로세스
ORACLE SQL Server설명 
SMON(System Monitor)Database cleanup / Shrinking Thread장애가 발생한 시스템을 재기동할 때 인스턴스 복구를 수행하고, 임시 세그먼트와 익스텐트를 모니터링한다
PMON(Process Minitor)Open Data Services(OPS) 이상이 생긴 프로세스가 사용하던 리소스를 복구한다
DBWn(Database Writers) Lazywriter Thread버퍼 캐시에 있는 더티 버퍼를 데이터 파일에 기록
LGWR (Log Writer)Log writer Thread로그 버퍼 엔트리를 redo 로그 파일에 기록한다
ARCn(Archiver)N/A꽉찬 리두로그가 덮어 쓰여지기 전에 archive로그 디렉토리로 백업한다
CKPT(Checkpoint) Database Checkpoint Threadcheckpoint 프로시스는 이전의 checkpoint 가 일어났던 마지막 시점 이후의 데이터베이스 변경 사항을 데이터파일에 기록하도록 트리거링하고, 기록이 완료되면 현재 어디까지 기록했는지를 컨트롤 파일과 데이터 파일 헤더에 기록한다. 좀더 자세히 설명하면 wirte Ahead Logging 방식을 사용하는 DBMS는 리두로그에 기록해 둔 버퍼 블록에 대한 변경사항 중 현재 어디까지를 데이터 파일에 기록했는지 체크 포인트정보를 관리해야 한다. 이는 버퍼캐시와 데이터 파일이 동기화된 시점을 가리키며, 장애가 발생하면 마지막 체크포인트 이후 로그 데이터만 디스크에 기록함으로써 인스턴스를 복구할수 있도록 하는 용도로 사용된다.이 정보를 갱신하는 주기가 길수록 장애 발생시 인스턴스 복구 시간도길어진다.
RECO(Recoverer)Distributed Transaction Coordinator(DTC)분산 트랜잭션 과정에 발생한 문제를 해결한다

파일구조

가.데이터파일

1) 블록(=페이지)

  • 대부분의 DBMS에서는 I/O 블록단위로 이루어짐
  • 데이터를 읽고 쓸때의 논리적인 단위
  • SQL 성능을 좌우하는 가장 중요한 성능지표
  • 옵티마이저의 판단에 가장 큰 영향을 미치는 요소
항목오라클SQL Server
명칭블록페이지
블록크기2KB,4KB, 8KB, 16KB, 32KB, 64KB8KB

2)익스텐트(Extent)

  • 테이블스페이스로부터 공간을 할당하는 단위
항목오라클SQL Server
크기다양한크기의 익스텐트항상 64KB(페이지크기가 8KB이므로)
오브젝트단일오브젝트사용2개이상의오브젝트
  • 균일익스텐트(Uniform) : 64KB 이상의 공간을 필요로 하는 테이블이나 인덱스를 위해 사용됨
    8개 페이지 단위로 할당된 익스텐트를 단일 오브젝트가 모두 사용
  • 혼합익스텐트(Mixed) : 한 익스텐트에 할당된 8페이지를 여러 오브젝트가 나누어 사용
    모든 테이블이 처음에는 혼합 익스텐트로 시작하지만 64KB가 넘으면서 두번째부터는 균일익스텐트 사용

3)세그먼트(Segment)

  • 테이블, 인덱스,Undo 처럼 저장공간을 필요로하는 데이터베이스 오브젝트 (한개 이상의 익스테트 사용)
  • 파티션은 오브젝트와 세그먼트가 1:M (파티션을 만들면 내부적으로 여러개의 세그먼트가 만들어짐)
  • 한 세그먼트에 할당된 엑스텐트가 여러 데이터파일에 흩어져 저장됨(디스크 경합감소.I/O 분산효과)
오라클SQL Server
세그먼트힙구조 또는 인덱스구조 오브젝트

4) 테이블스페이스(Tablespace) 

  • 세그먼트를 담는 콘테이너로서 여러개의 데이터파일로 구성됨
  • 사용자는 데이터파일을 직접 선택할수 없으므로 실제 파일을 선택하고 익스텐트를 할당하는것은 DBMS의 몫
오라클SQL Server
테이블스페이스파일그룹

'Oracle' 카테고리의 다른 글

Character Set  (0) 2016.12.06
오라클 vs MS SQL 함수 비교.  (0) 2016.12.06
SQL 기본 및 활용  (0) 2015.09.19
2015. 9. 19. 23:24

SQL 기본 및 활용

출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26743834&

그루비 지식 창고

수정 없이 정리 목적으로 필요한 부분가 가져왔습니다. 



DUAL 테이블 특징

 - 사용자 SYS가 소유하며 모든 사용자가 액세스 가능한 테이블이다.
- SELECT ~ FROM ~ 의 형식을 갖추기 위한 일종의 DUMMY 테이블이다.
- DUMMY라는 문자열 유형의 칼럼에 'X'라는 값이 들어 있는 행을 1건 포함하고 있다.


날짜형 함수
  날짜형 함수는 DATE 타입의 값을 연산하는 함수이다.
  Oracle의 TO_NUMBER(TO_CHAR( )) 함수의 경우 변환형 함수로 구분할 수도 있으나 SQL Server의 YEAR, MONTH,DAY 함수와 매핑하기 위하여 날짜형 함수에서 설명한다. 


변환함수
변환형 함수는 특정 데이터 타입을 다양한 형식으로 출력하고 싶을 경우에 사용되는 함수이다.  

암시적 데이터 유형 변환의 경우 성능 저하가 발생할 수 있으며, 자동적으로 데이터베이스가 알아서 계산하지 않는 경우가 있어 에러를 발생할 수 있으므로 명시적인 데이터 유형 변환 방법을 사용하는 것이 바람직하다. 

명시적 데이터 유형 변환에 사용되는 대표적인 변환형 함수는 다음과 같다. 


CASE 표현
IF-THEN-ELSE 논리와 유사한 방식으로 표현식을 작성해서 SQL의 비교 연산 기능을 보완하는 역할을 한다.  

 


집계 함수와 NULL

  리포트의 빈칸을 NULL이 아닌 ZERO로 표현하기 위해 NVL(Oracle)/ISNULL(SQL Server) 함수를 사용하는 경우가 많은데, 다중 행 함수를 사용하는 경우는 오히려 불필요한 부하가 발생하므로 굳이 NVL 함수를 다중 행 함수 안에 사용할 필요가 없다.
다중 행 함수는 입력 값으로 전체 건수가 NULL 값인 경우만 함수의 결과가 NULL이 나오고 전체 건수 중에서 일부만 NULL인 경우는 NULL인 행을 다중 행 함수의 대상에서 제외한다.
   SUM(CASE MONTH WHEN 1 THEN SAL ELSE 0 END)처럼 ELSE 절에서 0(Zero)을 지정하면 불필요하게 0이 SUM 연산에 사용되므로 자원의 사용이 많아진다.
하나가 Oracle의 SUM(NVL(SAL,0)), SQL Server의 SUM(ISNULL (SAL,0)) 연산이다. 개별 데이터의 급여(SAL)가 NULL인 경우는 NULL의 특성으로 자동적으로 SUM 연산에서 빠지는 데, 불필요하게 NVL/ISNULL 함수를 사용해 0(Zero)으로 변환시켜 데이터 건수만큼의 연산이 일어나게 하는 것은 시스템의 자원을 낭비하는 일이다.

[예제] SIMPLE_CASE_EXPRESSION 조건  
SELECT TEAM_ID
              , NVL(SUM(CASE POSITION WHEN 'FW' THEN 1 ELSE 0 END),0) FW -- 불필요한 연산이 일어남
              , NVL(SUM(CASE POSITION WHEN 'MF' THEN 1 END),0) MF   -- SUM은 NULL을 제외 하고 합산 하므로 SUM안이 아닌 밖에 NVL를 사용 하여 건수들 만큼 자원의 낭비를 줄임
              , NVL(SUM(CASE POSITION WHEN 'DF' THEN 1 END),0) DF   -- SQL SERVER로 변경 하고자 할 경우 ISNULL(SUM(CASE POSITION WHEN 'DF' THEN 1 END),0) DF
              , NVL(SUM(CASE POSITION WHEN 'GK' THEN 1 END),0) GK  -- SEARCHED_CASE_EXPRESSION 표현 NVL(SUM(CASE POSITION = 'GK' THEN 1 END),0) GK
              , COUNT                                                                                 SUM
FROM PLAYER
GROUP BY TEAM_ID;  


NATURAL JOIN

NATURAL JOIN은 두 테이블 간의 동일한 이름을 갖는 모든 칼럼들에 대해 EQUI(=) JOIN을 수행한다. NATURAL JOIN이 명시되면, 추가로 USING 조건절, ON 조건절, WHERE 절에서 JOIN 조건을 정의할 수 없다. 그리고, SQL Server에서는 지원하지 않는 기능이다. 

SELECT DEPTNO, EMPNO, ENAME, DNAME
FROM   EMP NATURAL JOIN DEPT ;

NATURAL은 식별자를 가질 수 없다. 또한 동일한 열에 대해서는 생략된다. 
USING 조건절

NATURAL JOIN에서는 모든 일치되는 칼럼들에 대해 JOIN이 이루어지지만, FROM 절의 USING 조건절을 이용하면 같은 이름을 가진 칼럼들 중에서 원하는 칼럼에 대해서만 선택적으로 EQUI JOIN을 할 수가 있다. 다만, 이 기능은 SQL Server에서는 지원하지 않는다. 

SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (DEPTNO);

SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (LOC, DEPTNO);

USING절에 명시된 컬럼이 기준이 되어 동일한 열들을 조인한다. 명시된 데이터가 앞에 나온다. 

SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (DEPTNO);

SELECT *
FROM DEPT JOIN DEPT_TEMP
USING (LOC, DEPTNO);

USING절에 명시된 컬럼이 기준이 되어 동일한 열들을 조인한다. 명시된 데이터가 앞에 나온다. 

  • natural join 에선 using 절 사용 불가하지
  • using 절은 Inner join 에서만 사용하는 구문
  • Inner Join 에서 On 절 또는 Using 절 필수
  • Inner Join 에서 On 절 사용결과 와 Using 절 결과가 다름(Select * 시 조회 컬럼수가 다름)
  • Inner Join 에서 On 절 사용 : 모든 항목이 조회됨
  • Inner Join 에서 Using 절 사용 : 조인키 항목은 한번만 조회됨
계층형 질의

테이블에 계층형 데이터가 존재하는 경우 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다. 
계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다. 

그림은 사원에 대한 순환관계 데이터 모델을 표현한 것이다. 
(2)계층형 구조에서 A의 하위 사원은 B, C이고 B 밑에는 하위 사원이 없고 C의 하위 사원은 D, E가 있다. 
계층형 구조를 데이터로 표현한 것이 (3)샘플 데이터이다. 

Oracle 계층형 질의
SELECT ...
FROM   TABLE
WHERE  CONDITION AND CONDITION
START WITH CONDITION
CONNECT BY [NOCYCLE] CONDITION AND CONDITION
[ORDER SIBLINGS BY COLUMN, COLUMN......]
  • START WITH절은 계층 구조 전개의 시작 위치를 지정하는 구문이다. 즉, 루트 데이터를 지정한다.(액세스)
  • CONNECT BY절은 다음에 전개될 자식 데이터를 지정하는 구문이다. 자식 데이터는 CONNECT BY절에 주어진 조건을 만족해야 한다.(조인)
  • PRIOR : CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정한다. PRIOR 자식 = 부모 형태를 사용하면 계층구조에서 자식 데이터에서 부모 데이터(자식 → 부모) 방향으로 전개하는 순방향 전개를 한다. 그리고 PRIOR 부모 = 자식 형태를 사용하면 반대로 부모 데이터에서 자식 데이터(부모 → 자식) 방향으로 전개하는 역방향 전개를 한다.
  • NOCYCLE : 데이터를 전개하면서 이미 나타났던 동일한 데이터가 전개 중에 다시 나타난다면 이것을 가리켜 사이클(Cycle)이 형성되었다라고 말한다. 사이클이 발생한 데이터는 런타임 오류가 발생한다. 그렇지만 NOCYCLE를 추가하면 사이클이 발생한 이후의 데이터는 전개하지 않는다.
  • ORDER SIBLINGS BY : 형제 노드(동일 LEVEL) 사이에서 정렬을 수행한다.
  • WHERE : 모든 전개를 수행한 후에 지정된 조건을 만족하는 데이터만 추출한다.(필터링)

Oracle은 계층형 질의를 사용할 때 다음과 같은 가상 칼럼(Pseudo Column)을 제공한다. 

가상 컬럼설명
LEVEL루트 데이터이면 1, 그 하위 데이터이면 2이다. 리프(Leaf) 데이터까지 1씩 증가한다.
CONNECT_BY_ISLEAF전개 과정에서 해당 데이터가 리프 데이터이면 1, 그렇지 않으면 0이다.
CONNECT_BY_ISCYCLE전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로서 존재하면 1, 그렇지 않으면 0이다. 여기서 조상이란 자신으로부터 루트까지의 경로에 존재하는 데이터를 말한다. CYCLE 옵션을 사용했을 때만 사용할 수 있다.

다음은 그림의 (3)샘플 데이터를 계층


조인의 이해 

http://wiki.gurubee.net/pages/viewpage.action?pageId=26744589




'Oracle' 카테고리의 다른 글

Character Set  (0) 2016.12.06
오라클 vs MS SQL 함수 비교.  (0) 2016.12.06
아키텍처 기반 튜닝 원리- SQL 전문가 가이드  (0) 2015.09.19
2015. 9. 14. 10:58

Index IGNORE_DUP_KEY 옵션 TEST

No

방법

문제점

1

클러스터 Key IGNORE_DUP_KEY 옵션

온라인 Reindex가 되지 않음 -DBA 상에서 관리 이슈 있음
성능 이슈 -  Data 비교를 하기 때문에 일반 보다는 비용이 더 소요 됨
성능 TEST No1 참고

2

유니크 Index를 생성하고 IGNORE_DUP_KEY 옵션

No 1의 문제점 해결
동일 Key Index가 더 생성되는 것이며,  No1 번과 마찬가지로
데이터 입력시 Sort 비용,  Semi Join 비용,  Buffer Pool 공간 사용 비용이 증가하여
기본 예상 비용 보다  3배 정도 초과 운영됨

데이터를 삽입 하는 동안 정합성을 유지 하기 위해  입력 Data Range 에 대한 Shared range, Update Lock를 발생 함

동시 변경시 문제가 있을 수 있고,  SQL 아키텍쳐상 Lock  Escalation 될 수 있으므로 Table Lock으로 발전 될 수 있는 가능 성 있음

성능 Test No2 참고

3

쿼리 문을 수정 하는 방법

Insert 문을 수정해서 입력 하는 방법
- EXCEPT
방식, Merage 방식

-- Insert 문 수정  with except

INSERT dbo.PKDUP (pk)

select  i from dbo.DUMP_INSERT

where i between 10000 and 130000

except select pk from dbo.PKDUP

 

-- merge 문 사용

MERGE dbo.PKDUP  AS b

USING (SELECT i FROM dbo.DUMP_INSERT WHERE i BETWEEN 10000 AND 130000) AS s

ON s.i = b.pk

WHEN NOT MATCHED THEN

INSERT (pk) VALUES (s.i);


성능 TEST No3 참고

4

INSTEAD OF trigger 사용 방법

3번 으로 하면 가장 좋으나 대량의 bulk 성으로 입력을 해야 하는 경우 대안이 될 수 있을 것 같음

해당 트리거는 테이블당 하나만 생성 할 수 있고
INSTEAD
트리거가 제약 조건에 위배 되면 AFTER이 실행 되지 않음을 알아야 함

성능 Test No4 참고



CREATE TABLE dbo.PK_DUP

(

    pk int NOT NULL,  CONSTRAINT PK_PK_DUP PRIMARY KEY (pk) WITH (IGNORE_DUP_KEY = ON)

);

GO

select * from sys.indexes where object_id = object_id ('PK_DUP')

-- Unique values

INSERT dbo.PK_DUP (pk)

VALUES (1), (3), (5);

GO

-- key 3 already exists

INSERT dbo.PK_DUP (pk)

VALUES (2), (3), (4);

/*

중복 키가 무시되었습니다.

(2개 행이 영향을 받음)

*/

select * from PK_DUP

/*

pk

1

2

3

4

5

*/

/**  Problem 1 :  Rebild를 할  수 없다. **/

ALTER INDEX PK_PK_DUP ON dbo.PK_DUP

REBUILD WITH (FILLFACTOR = 90, ALLOW_ROW_LOCKS = OFF, ONLINE = ON, IGNORE_DUP_KEY = ON);

GO

/*

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

인덱스 옵션 ignore_dup_key PRIMARY KEY 또는 UNIQUE 제약 조건을 적용하므로 이 인덱스 옵션을 사용하여 인덱스 'PK_PK_DUP'() 변경할 수 없습니다.

*/


[성능 TEST No2]

-- 새로운 Idea

-- 유니크 key를 만들어서 처리 한다.

CREATE TABLE dbo.PKDUP (pk int NOT NULL CONSTRAINT PK_PKDUP PRIMARY KEY);

GO

INSERT dbo.PKDUP (pk) VALUES (1), (2), (3);

GO

-- New constraint (or index) with IGNORE_DUP_KEY, added ONLINE

ALTER TABLE dbo.PKDUP  ADD CONSTRAINT UIDX_PKDUP  UNIQUE NONCLUSTERED (pk) WITH (IGNORE_DUP_KEY = ON, ONLINE = ON);

select * from sys.indexes where object_id = object_id ('PKDUP')

 

-- key 3을 입력 한다.

INSERT dbo.PKDUP (pk) VALUES (3), (4), (5);

GO

/*중복 키가 무시되었습니다. */

SELECT pk FROM dbo.PKDUP;

/*

pk

1

2

3

4

5

*/

-- Problem 1 해결

ALTER INDEX PK_PKDUP ON dbo.PKDUP

REBUILD WITH (FILLFACTOR = 90, ALLOW_ROW_LOCKS = OFF, ONLINE = ON);

GO

ALTER INDEX UIDX_PKDUP ON dbo.PKDUP

REBUILD WITH (FILLFACTOR = 100, ALLOW_ROW_LOCKS = OFF, ONLINE = ON);

GO


No1의 문제는 해결 되나  성능 상의 이슈로  입력 하는 데이터와 기존 데이터를 비교 하는 추가 적인 작업 단계가 늘어나면서

예상 비용이 3배 정도 증가 함





[성능 TEST No3]


CREATE TABLE DUMP_INSERT ( i int )

set nocount on

declare @i int 

set @i =1

while (@i < 10000 )

begin

             insert into DUMP_INSERT  values ( @i )

             set @i = @i + 1

end

insert into PKDUP

select * from DUMP_INSERT

set nocount on

declare @i int 

set @i =90000

while (@i < 110001 )

begin

             insert into DUMP_INSERT  values ( @i )

             set @i = @i + 1

end

-- 유니크 Index 삭제

alter table dbo.PKDUP

drop constraint  UIDX_PKDUP

set nocount on

declare @i int 

set @i =120001

while (@i < 150001 )

begin

             insert into DUMP_INSERT  values ( @i )

             set @i = @i + 1

end

 

 

-- Insert 문 수정  with except

INSERT dbo.PKDUP (pk)

select  i from dbo.DUMP_INSERT

where i between 10000 and 130000

except select pk from dbo.PKDUP

 

n  여전히  Buffer pool 공간은 사용 하지만 예상 비용은 0.96

 

 


 

 

-- merge 문 사용

MERGE dbo.PKDUP  AS b

USING (SELECT i FROM dbo.DUMP_INSERT WHERE i BETWEEN 10000 AND 130000) AS s

ON s.i = b.pk

WHEN NOT MATCHED THEN

INSERT (pk) VALUES (s.i);

 

-    비용은 증가하나 Buffer pool 공간은 사용하지 않음

 


 

 


성능 TEST No4]

-- INSTEAD OF trigger

-- INSTEAD OF 트리거는 트리거 문의 표준 동작을 무시합니다.

-- 따라서 이 트리거를 사용하여 하나 이상의 열에서 오류나 값을 확인하고 행을 삽입, 업데이트 또는 삭제하기 전에 추가 동작을 수행할 수 있습니다.

-- INSTEAD OF 트리거가 제약 조건을 위한 하면 AFTER 트리거는 실행되지 않습니다.

CREATE TRIGGER  tI_PKDUP ON DBO.PKDUP

INSTEAD OF INSERT

AS

BEGIN

             SET NOCOUNT ON

             INSERT dbo.PKDUP (pk)

             SELECT PK FROM INSERTED

             except select pk from dbo.PKDUP

END

GO

INSERT dbo.PKDUP (pk)

SELECT i FROM dbo.DUMP_INSERT WHERE i BETWEEN 10000 AND 130000

 



-    Mearge랑 비슷한 예상 비용이 발생 함. 트리거 사용을 권하지는 않지만 대량 데이터 입력으로 인해 No3 번이 불가능 할 때 고려해 볼 만 함.

 

 


'Peformance Tuning' 카테고리의 다른 글

파티션 테이블 - 문제점, 주의 사항  (0) 2012.11.19
query plan의 실행 옵션 보기  (0) 2012.01.29
Dynamic Management Views  (0) 2012.01.22
Hash Join 제약.  (0) 2011.10.10
2015. 5. 20. 13:03

SQL Server 2012 Certification upgrade info



1.     SQL 2008이 있는 경우  - 아래 두개의 시험을 봐야 MCSA가 됩니다Admin 기준


70-457: Transition Your MCTS on SQL Server 2008 to MCSA: SQL Server 2012, Part 1

70-458: Transition Your MCTS on SQL Server 2008 to MCSA: SQL Server 2012, Part 2                                                    


MCSE: Data Platform involves

·   A pass in Microsoft Certified IT Professional (MCITP) Database Administrator 2008 or Database Developer 2008 (70-450 or 70-451)

    • Exam 70-457: Transition your MCTS on SQL Server 2008 to MCSA: SQL Server 2012 – Part 1
    • Exam 70-458: Transition your MCTS on SQL Server 2008 to MCSA: SQL Server 2012 – Part 2
    • Exam 70-459: Transition your MCITP: Database Administrator 2008 or MCITP: Database Developer 2008 to MCSE:Data Platform

MCSE: Business Intelligence involves

A pass in Microsoft Certified IT Professional (MCITP) Business Intelligence 2008 (70-452)

·         Exam 70-457: Transition your MCTS on SQL Server 2008 to MCSA: SQL Server 2012 – Part 1

·         Exam 70-458: Transition your MCTS on SQL Server 2008 to MCSA: SQL Server 2012 – Part 2

·         Exam 70-460: Transition your MCITP: Business Intelligence Developer 2008 to MCSE: Business Intelligence 



2.     처음 부터 SQL 2012를 취득 하고 자 한다면 



'ETC' 카테고리의 다른 글

MS-SQL 2016 New Features  (0) 2017.02.24
메모리 dump 분석 예 ( 정확하지 않음 )  (0) 2014.11.06
Windbg 명령어 & 설치  (0) 2014.11.06
Window 서비스 등록/삭제 방법  (0) 2011.10.20
2015. 5. 18. 13:55

TokenAndPermUserStore


SpinLock , 많은 로그인 생성 등으로 쿼리가 늦어 지는 경우 발생
사이즈 조사하여  작업을 해 줄 필요가 있다.
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
GO


SELECT

[type],

[name],

cache_address,

buckets_count,

buckets_in_use_count

FROM sys.dm_os_memory_cache_hash_tables

WHERE [type] = 'TokenAndPermUserStore';

 

-- SQL 2012

SELECT

[name],

sum(pages_kb)/1024 MB

FROM sys.dm_os_memory_clerks

WHERE type = 'USERSTORE_TOKENPERM' and pages_kb > 8

GROUP BY name;

 

-- SQL 2008

SELECT SUM(single_pages_kb + multi_pages_kb) AS "CurrentSizeOfTokenCache(kb)"

FROM sys.dm_os_memory_clerks

WHERE name = 'TokenAndPermUserStore'

 

-- 어떤 내용들이 있는지 

SELECT COUNT(*) as TokenCount, *

FROM

(SELECT

x.value('(//@name)[1]', 'varchar (100)') AS [Token Name],

x.value('(//@class)[1]', 'bigint') AS [Class],

x.value('(//@subclass)[1]', 'int') AS [SubClass]

FROM

(SELECT CAST (entry_data as xml)

FROM sys.dm_os_memory_cache_entries

WHERE type = 'USERSTORE_TOKENPERM')

AS R(x)

) a

GROUP BY [Token Name],[Class],[SubClass]

2015. 4. 1. 09:07

master SP 생성 -> DB별 view 인식 하게 하기


master에 Sp를 생성하고 모든 DB의 객체 view를 인식 할 수 있게 하는 방법. 

이렇게 하면  동적 쿼리를 사용하지 않아도 됨. 


exec sys.sp_MS_marksystemobject '{procedure name}'


어떤 사용자도 호출 할 수 있게 하려면 public에 권한 부여

grant execute on object to [public]



등록을 해지 하고 싶다면 ?

[SQL 2005 이전 버전 ]

sp_configure 'allow updates', 1
GO
RECONFIGURE WITH OVERRIDE

 

update sysobjects
set status = 1610612737,
    base_schema_ver = 0
where name = '{procedure name}'

 

sp_configure 'allow updates', 0
GO
RECONFIGURE WITH OVERRIDE


[SQL 2005 이후 버전 ]

- sqlservr -m"SQLCMD" -s<<instance name>>

sqlcmd -A -S.\MSSQL2005


use <<databasename>>
go
update sys.sysschobjs set status = 917504 where name = <<table name>>
go


2014. 11. 6. 14:30

메모리 dump 분석 예 ( 정확하지 않음 )

1.  메모리 덤프를 crash dump 파일 방식으로 실행 합니다.

2.  명령 창에 관련 symbols 파일을 받습니다.  ( 파일 열어 보면 명령창 입력 하는 부분이 있습니다. )

sympath srv*C:\PublicSymbols*http://msdl.microsoft.com/download/symbols;  <- C 밑에 받게 설정.

3.  Symbols 파일을 내려 받습니다.

.reload /f sqlservr.exe  ß--  sql 지정해 주지 않으면 모든 실행파일에 대한 받습니다 오래 걸립니다.   허나 컴이 2012 설치되어 있어서 서버 버전과 같은 sql 있어야 같은 느낌 입니다.

4.  문제되는 스래드 파악 봅니다. ^^

~~[스래드번호]s  

아래 노란색이 스래드 번호 입니다.

 

2014-10-31 07:07:06.960 서버           Process 0:0:0 (0x3318) Worker 0x000000002A7EA1A0 appears to be non-yielding on Scheduler 22. Thread creation time: 13059177216471. Approx Thread CPU Used: kernel 0 ms, user 70543 ms. Process Utilization 30%. System Idle 68%.

5.     자세한 내역을 봅니다

kL100

 

15번 파일을 그런 단계로 본 내역입니다.  Call site 값으로 세부적으로 뭔가 봐야 하는데 그 다음 명령을 모르겠습니다.

 




 

6.     참고로

.cxr sqlservr!CXStmtQuery::ErsqExecuteQuery+0x602    이 노란색이 call site 값인 것 같은데요..

 

7.     아래 부분 처럼

du 0x00000101`c21ae200 L100    이게 쿼리 내역을 보는 법인 것 같습니다.  RetAddr 값 일까요???  ㅋㅋ.

 

답변 받은 분도 명령창 번호가 같은걸로 봐서는  15번 덤프 파일을 가지고 분석 했습니다

 

참고로 ) 여러가지 원인이 있다는 Non-yielding Scheduler  dump 내역 입니다.

http://technet.microsoft.com/en-us/library/cc917684.aspx#XSLTsection129121120120

 


 

'ETC' 카테고리의 다른 글

MS-SQL 2016 New Features  (0) 2017.02.24
SQL Server 2012 Certification upgrade info  (0) 2015.05.20
Windbg 명령어 & 설치  (0) 2014.11.06
Window 서비스 등록/삭제 방법  (0) 2011.10.20