전체 글 1383

활성 트랜잭션 찾기

활성 트랜잭션 찾기 현재 활성되어 있는 트랜잭션에서 오래된 트랜잭션은 어떤 것이 있을가? 그리고 누가 이 트랜잭션을 발생 시켰을까? 다음 스크립트를 이용해서 찾아 보도록 합니다. SELECT A.SESSION_ID, DATEDIFF(MINUTE, B.LAST_REQUEST_END_TIME, GETDATE()) AS [LOCKING MINUTS], B.LOGIN_TIME, B.HOST_NAME, B.PROGRAM_NAME, B.CLIENT_INTERFACE_NAME, B.LOGIN_NAME, B.STATUS, B.LAST_REQUEST_START_TIME, B.LAST_REQUEST_END_TIME, TEXT FROM SYS.DM_TRAN_SESSION_TRANSACTIONS AS A INNER JOIN ..

Forwarded Record (행 이동에 대한 포워드)

Forwarded Record (행 이동에 대한 포워드) 가변 컬럼(varcahr, nvarchar)에서 컬럼이 값이 현재 저장되어 있는 값 보다 큰 값으로 수정 되면 어떻게 될까? 결론부터 말하면 이 때에는 기존 페이지에는 더 큰 값으로 수정된 행의 값에 대한 공간이 없어서 새로운 값을 넣을 수 없어 새로운 행을 다른 페이지에서 할당 받아 값을 넣고 기존의 행에서 새로운 행으로 포워딩 하게 됩니다. 포워드 된 행은 Record Type에 FORWARDING_STUB로 표시 됩니다. 다음 실습을 통해서 알아 보도록 하겠습니다. 전체 코드 BEGIN TRY DROP TABLE TBL_X END TRY BEGIN CATCH END CATCH GO CREATE TABLE TBL_X (NUM INT, NAME ..

인덱스 생성 순서에 따른 내부 작업 변화

인덱스 생성 순서에 따른 내부 작업 변화 인덱스에는 여러 종류가 있지만 가장 많이 사용하는 부분이 클러스터 인덱스와 넌-클러스터 인덱스 이지 않을까 생각 합니다. 그렇다면 클러스터 인덱스와 넌-클러스터 인덱스가 있을 때 인덱스 생성 순서에 따라 성능 문제가 발생할까? 입니다. 좀더 정확히 말하면 인덱스 생성순서에 따라 내부적으론 어떻게 작동할까 입니다. 결론부터 말하면 넌-클러스터 인덱스가 있는 상태에서 클러스터형 인덱스를 추가하면 RID 값 대신 클러스터형 인덱스의 키 값을 기존 인덱스가 내부적으로 재구성 됩니다. 다음 예제를 통해서 알아 보도록 하겠습니다. 전체 코드 BEGIN TRY DROP TABLE TBL_X END TRY BEGIN CATCH END CATCH GO CREATE TABLE TB..

Ghost Record(인덱스에서 행 삭제시 발생)

Ghost Record(인덱스에서 행 삭제시 발생) 인덱스가 있는 행을 삭제 할 경우 인덱스의 효율성을 높이기 위해서 인덱스의 리프-레벨에 삭제할려는 행에 대해서는 우선 고스트 레코드(Ghost Record )로 마크해 놓고 주기적인 삭제 작업이 실행 됩니다. 즉 삭제 행에 대해서 즉시 삭제가 이루어지지 않습니다. 인덱스 리프-레벨 페이지의 레코드가 삭제될 때 고스트 레코드로 변경되고 레코드가 포함된 페이지게 고스트 레코드 개수가 설정 됩니다. 이 고스트 레코드를 삭제하는 프로세스를 Ghost CleanUp또는 House Keeping 이라고 합니다. [Ghost Record 살펴 보기] 전체 코드 BEGIN TRY DROP TABLE TBL_X END TRY BEGIN CATCH END CATCH GO..

프로시저, 함수, 트리거 생성 정보 보기

프로시저, 함수, 트리거 생성 정보 보기 현재의 SP가 언제 수정 되었을까? 사용자 스토어드 프로시저, 함수, 트리거의 생성시간 및 수정 시간 그리고 텍스트를 한번에 볼 수 있는 방법을 찾아 보자. -- P : SQL_STORED_PROCEDURE -- FN : SQL_SCALAR_FUNCTION -- TR : SQL_TRIGGER SELECT DB_NAME() AS [DBNAME], A.NAME AS [SP_NAME], A.TYPE_DESC AS [SP_TYPE], A.CREATE_DATE, A.MODIFY_DATE, B.DEFINITION AS [SP_TEXT] FROM SYS.OBJECTS AS A INNER JOIN SYS.SQL_MODULES AS B ON A.OBJECT_ID = B.OBJEC..

힙테이블에서 행을 삭제하면 어떻게 처리 될까?

힙테이블에서 행을 삭제하면 어떻게 처리 될까? 힙테이블(Heap Table)에서 행을 삭제하면 실제로 데이터가 삭제 될까? 사실은 실제 데이터가 삭제되지 않고 삭제 된 것처럼 오프셋의 값만 초기화 시킵니다. 테이블을 생성하여 데이터를 입력하고 삭제함으로써 데이터 페이지에는 어떤 변화가 일어나는지 살펴봅니다. [전체 코드] CREATE TABLE TBL_X (COL1 CHAR(5), COL2 CHAR(5)) GO INSERT INTO TBL_X VALUES ('A', 'B') INSERT INTO TBL_X VALUES ('C', 'D') GO SELECT * FROM TBL_X GO SELECT * FROM SYS.SYSINDEXES WHERE ID = OBJECT_ID('TBL_X') DBCC TRAC..

SSMS의 디자이너에서 테이블 수정 시 발생하는 영향

SSMS의 디자이너에서 테이블 수정 시 발생하는 영향 많은 분들이 컬럼의 순서 및 컬럼명을 변경하려고 합니다. 사실 RDB에서는 컬럼의 순서가 크게 상관이 없습니다. (왜 굳이 컬럼을 순서대로 맞추려고 하는건지…아마도 시인성 때문이겠죠.) 그래서 많은 분들이 SSMS에서 테이블 디자이너에서 수정을 합니다. 이 때 내부적으로는 어떤 작업이 일어나는지 알아 보도록 하겠습니다. 한 내부적으로 발생하는 작업을 살펴 왜 성능에 문제가 되는지 확인 할 수 있습니다. SSMS를 실행하여 마우스 오른쪽을 클릭하여 디자이너를 실행 합니다. [테이블 생성] 다음과 같이 Col1, Col2, Col3를 생성하고 저장 합니다. 프로파일러를 통하여 테이블 생성시 어떤 작업이 호출 되는지 확인해 봅니다. 일반적으로 테이블 생성문..

SQL Server를 활용한 Perfmon 로그 저장

SQL Server를 활용한 Perfmon 로그 저장 시스템의 성능을 분석하기 위하여 성능 모니터를 많이 사용하는데 이번에는 성능모니터의 로그를 SQL Server를 활용하여 테이블에 저장하여 사용하는 방법을 알아 보겠습니다. 성능 모니터 정보를 저장할 데이터베이스를 생성 합니다. 실습에서는 Perfmon 이라는 데이터베이스를 생성합니다. 이 때 데이터베이스의크기는 충분히 늘려줍니다. 운영을 하다 보면 생각보다 성능 카운터의 로그가 많이 쌓이는 것을 알 수있습니다. [시작] – [관리도구] – [데이터 원본(ODBC)]를 선택 합니다. [ODBC 데이터 원본 관리자]에서 [시스템 DSN]탭에서 [추가] 버튼을 클릭합니다. [SQL Server]를 선택 합니다. [SQL Server에 새로운 데이터 원본 ..

VLF 환경과 성능

VLF 환경과 성능 SQL Server에서 로그파일은 데이터 파일처럼 익스텐트로 구성되지 않고 가상 로그 파일(Virtual Log File 이하 VLF)로 구성되어 있습니다. VLF는 로그 파일의 크기에 따라 가변적으로 변하며 SQL Server에 의해 정해 집니다. VLF의 최소 단위는 256K이며 트랜잭션 로그가 가장 작은 512K일 때 두 개의 VLF가 생성 됩니다. 데이터베이스에 물리적인 로그 파일이 둘 이상 있으면 로그의 끝이 물리적 파일의 가상 로그 파일을 돌아 다시 첫 번째의 물리적인 파일의 첫 번째 가상로그 파일로 데이터를 기록 하게 됩니다. (가상로그 파일의 순서대로 순환 한다고 생각하면 됩니다.) 실습을 위하여 SSMS를 실행하여 다음과 같은 쿼리문을 이용하여 데이터베이스를 생성 합니..

Block 모니터링.

Block 모니터링. 데드락(DeadLock)에 관해서는 지난 아티클에서 알아 보았습니다. 데드락 관련 링크 : http://blog.naver.com/jevida/140164120810 이번에는 블로킹 모니터링을 하도록 하겠습니다. [SP_Lock]이라는 시스템 저장프로시저는 잠금과 관련된 정보를 제공합니다. 하지만 블로킹이 발생 하였을 때 블로킹 하는 프로세스와 블로킹 당하는 프로세스의 관계를 파악하기에는 불편함이 있습니다. Sysprocess 와 inpubuffer를 통하여 블로킹의 관계와 최근 수행된 이벤트 정보를 확인해 보도록 하겠습니다. BEGIN TRY DROP TABLE #TEMP END TRY BEGIN CATCH END CATCH GO BEGIN TRY DROP TABLE #TEMP2 ..