개요 MSSQL에서 스키마를 다량으로 추가/수정하는 쿼리를 테스트하려고 [BEGIN TRAN]-[ROLLBACK TRAN]을 걸고 테스트하는 도중, [ROLLBACK TRAN]이 씹히고 스키마가 모조리 변경되는 대참사가 발생한 이슈가 있어서 기록 및 제대로 이해하려는 목적으로 포스팅을 한다. GO를 사용하지 않는 트랜잭션 BEGIN TRAN SELECT @@TRANCOUNT -- : 1 CREATE TABLE [dbo].[TEST1] -- 추후에 롤백됨. ( [id] INT ); CREATE TABLE [dbo].[TEST1] -- 중복 생성으로 인한 에러가 발생하고, 트랜잭션이 롤백된 채로 이후 모든 명령어가 무시된다. ( [id] INT ); SELECT @@TRANCOUNT -- : 출력되지 않는다..
MSSQL에서 데드락 그래프를 뽑는 방법을 기록한다. 1. SSMS를 이미 설치해 놨다면, 아마도 깔려 있을 SQL Server Profiler 18을 실행한다. 2. [파일] -> [새 추적]을 누른다. 3. 접속 정보를 확인하고 연결 한다. 4. [이벤트 선택] -> [Locks] -> [Deadlock graph]를 체크한 다음 [실행]을 누른다. 5. 아래와 같이 창이 떴다면 이제 데드락을 일으켜 보자. -- 테스트 테이블 세팅 CREATE TABLE Test1 ( uid BIGINT, item1 Varchar(10), item2 Varchar(10), item3 Varchar(10), CONSTRAINT PK_TEST1 PRIMARY KEY (uid) ) GO INSERT INTO dbo.Tes..
작업 중에 MSSQL에서 현재 데이터가 어떤 페이지(물리적 페이지)에 있는지 알아야 하는 일이 있었는데, 그때 사용한 쿼리들을 정리하였다. 1. 테이블의 Page 현황 조사 쿼리 SELECT DB_NAME(PA.database_id) [DataBase], OBJECT_NAME(PA.object_id) [Table], SI.Name [Index], is_allocated, allocated_page_file_id [file_id], allocated_page_page_id [page_id], page_type_desc, page_level, previous_page_page_id [previous_page_id], next_page_page_id [next_page_id] FROM sys.dm_db_dat..
MSSQL에서 row을 임의로 삽입할 때, 가장 쉽게 생각할 수 있는 루프 문을 사용하는 방법으로 하면 몇천만 건씩 넣을 경우 매우 매우 느리다. 그래서 아래와 같은 방법으로 쿼리를 넣으면 꽤나 대량의 row도 순식간에 넣을 수 있다. -- 1000000 개의 순차적인 uid의 row를 넣는 쿼리. INSERT INTO [dbo].[Test1] SELECT TOP (1000000) Id = CONVERT(INT, ROW_NUMBER() OVER (ORDER BY s1.[object_id])), 1, 2, 3 FROM sys.all_objects AS s1 CROSS JOIN sys.all_objects AS s2