SQL Server 818

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

프로시저, 함수, 트리거 생성 정보 보기 현재의 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 ..

추적파일을 테이블로 로드하기

추적파일을 테이블로 로드하기 SQL Server Profier를 사용하여 저장된 추적파일을 테이블로 로드하는 방법을 알아 보겠습니다. Profiler를 통하여 추적파일을 저장 합니다. 추적파일을 Profier에서 로드하니 검색에 많이 불편합니다. 추적파일을테이블로 로드하여 쿼리문을 이용하여 필요한 정보를 조회 할 수 있습니다. SELECT IDENTITY(INT, 1,1) AS NUM, * INTO TBL_PROFILER FROM ::FN_TRACE_GETTABLE('D:\SSIS_TEST\DEADLOOCK.TRC', DEFAULT) GO SELECT top 10 * FROM TBL_PROFILER GO [구문] FN_TRACE_GETTABLE('FileName', number_files)  Filen..

DeadLock(교착상태) 모니터 하기 최근 들어 서비스에서 DeadLock(교착상태) 이슈가 자주 발생 하여 이번 아티클은 DeadLock을 모니터링 하는 방법에 대해서 알아 보도록 하겠습니다.. DeadLock(교착상태)? 한 태스크에서 잠근 리소스를 다른 태스크에서 잠그려고 하여 둘 이상의 태스크가 서로 영구적으로 차단하는 현상. (서로 맞물린 상태의 차단) 순환 교착(cycle DeadLock) : 서로 다른 개체를 차단할 때 발생 변환 교착(Conversion DeadLock) : 같은 대상에 대해 둘 이상의 세션이 동시에 잠금을 변경하려고 할 때 발생 교착 상태를 일으킬 수 있는 리소스 잠금 : 개체, 페이지, 행, 메타데이터, 응용 프로그램 등의 리소스에 대한 잠금을 획득하려고 대기 하는 경..

Tempdb 경합 (동시성 강화)

Tempdb 경합 (동시성 강화) Tempdb 데이터베이스를 많이 사용하면 SQL Server에서 페이지를 할당 하려고 할때 경합이 발생 할 수 있다.  --tempdb를 많이 사용하는 예 임시 테이블(로컬 또는 전역)을 반복해서 만들고 삭제 테이블 변수 CURSORS와 관련된 작업 테이블 ORDER BY GROUP BY HASH PLANS   -- 경합 확인 방법 SELECT * FROM SYS.SYSPROCESSES 시스템 테이블 출력에서 waitresource가 2:1:1(PFS 페이지)또는 2:1:3(SGAM 페이지)로 표시되며 경합 정도에 따라 SQL Server가 응답하지 않는것 처럼 나타날 수 있다. --원인 혼합 익스텐트에서 페이지 할당의 일환으로 SQL Server는 PFS(..

LOGON 트리거

LOGON 트리거 여러명이 DB에 작업을 할 경우 로그인에 대한 이력이 필요한 상황이 있습니다. 예를 들면..누가 언제 로그인을 했는지...감사목적으로 많이 이용합니다. 이때 LOGON트리거를 사용하여 특정 계정이 로그온 할때 이력을 기록하여 살펴 볼수 있습니다. http://msdn.microsoft.com/ko-kr/library/bb326598.aspx SA로 트리거를 해보았습니다. --트리거 생성 CREATE TRIGGER connection_limit_trigger ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN IF ORIGINAL_LOGIN()= 'sa' AND (SELECT COUNT(*) FROM sys.dm_exec_sessions WHE..