본문 바로가기

SQL Server

(81)
[Sequel Safe / update] 개발 DB에서 SQL Agent에 의한 DDL문 실행 오류 수정 http://purumae.tistory.com/64 글에 피드 백 주신 "싸울아비"님께 감사드립니다. 현상 : 개발 DB에서 SQL Agent에 의해 DDL 문이 실행되는 경우, [DBAs] 테이블에 등록되지 않은 Login이므로 DDL문이 롤 백 해결 : SQL Agent에 의한 DDL 작업은 형상 관리 대상으로 보기 어려우므로, APP_NAME()을 확인하여 트리거 실행을 중단하도록 수정하였습니다. 이후 SQL Agent로 실행되는 작업에 포함된 DDL문은 차단되거나, 수집되지 않습니다. 아래 첨부한 DevDB_Trigger_20091023.sql을 각 개발 DB에서 실행하시기 바랍니다.
MERGE 응용 - 2. CTE를 사용한 성능 최적화 MERGE 문의 기본 형태 MERGE [타겟 테이블] AS T USING [소스 테이블] AS S ON T.[컬럼] = S.[컬럼] WHEN MATCHED THEN UPDATE SET ~~~ WHEN NOT MATCHED BY TARGET THEN INSERT ~~~ WHEN NOT MATCHED BY SOURCE THEN DELETE; WHEN NOT MATCHED BY SOURCE THEN DELETE; 지난 번에 다룬 UPSERT에 한 가지 동작이 추가되었습니다. 이 동작을 수행하되 타겟 테이블의 일부만 가져와서 MERGE하는 경우를 생각해 봅시다. IF OBJECT_ID(N'dbo.MergeTest', N'U') IS NOT NULL DROP TABLE dbo.MergeTest; GO CREATE..
MERGE 응용 - 1. UPSERT UPSERT ??? 조건을 만족하는 행이 있으면 UPDATE하고, 그렇지 않으면 INSERT하는 구문입니다. 하지만, SQL Server에서는 UPSERT문을 지원하지 않습니다. SQL Server 2008 - MERGE 문 SQL Server 2008에 추가된 MERGE 문을 사용하면 하나의 문에서 여러 INSERT, UPDATE 및 DELETE 작업을 수행할 수 있습니다. 단, MERGE문을 잘 못 작성하면 악성 쿼리로 전락하거나, 예기치 않은 동작으로 데이터의 손실을 유발할 수 있으니 익숙하게 사용할 수 있도록 테스트 구문을 많이 작성해 보시기 바랍니다. MERGE 문으로 UPSERT를 구현 지금까지 SQL Server에서 UPSERT를 수행하려면, UPDATE 후 @@ROWCOUNT를 확인해 다시..
Windows 7에서 ER/Studio 8.0.3 build 6051 한글 깨짐 오늘 Vista에서 Windows 7으로 OS를 업그레이드 했습니다. 1시간 30분에 걸친 업그레이드 끝에 부팅... 사용하던 프로그램을 하나씩 띄어보고 이상 없구나 생각하던 찰라... ER/Studio에서 한글 입력이 안되는 문제를 발견했습니다. ㅠㅠ Embarcadero 홈피에 업데이트 버전이 있나 확인해 봤지만 여전히 최신 버전은 8.0.3으로 제 PC에 설치한 버전과 동일했습니다. OTL 꽁수로... Windows XP Mode의 Auto Publish를 통해 사용하기로 결심하고 부랴 부랴 설치했습니다. 그런데... 잘 생각해보니... 빌드 넘버는 조금 올라가 있더군요. (설치 : 6051 / 최신 : 6063) 혹시나해서 6063빌드를 다운 받아 업데이트 해봤습니다. 결과는... 잘 됩니다. 언..
12 Essential Steps After Installing SQL Server http://www.sql-server-performance.com/articles/dba/post_installation_steps_p1.aspx By : Sadequl Hussain Jul 13, 2009 Step1: Install the Service Pack, Hotfixes and Cumulative Updates Step 2: Configure SQL Services Step 3: Configure Default Directories Step 4: Configure Default Database Properties Step 5: Configure tempdb Database Step 6: Configure Server Properties and Features Step 7: Configure ..
SPARSE 컬럼 테이블에서 NULL 값을 허용하는 컬럼에 사용하는 옵션으로 SPARSE 가 있습니다. [SQL Server 2008] SPARSE 컬럼에 NULL 값이 입력되면 저장 공간을 전혀 차지 하지 않지만, NULL이 아닌 값이 저장될 경우에는 4byte의 추가 공간을 필요로합니다. BOL에서는 SPARSE 컬럼의 사용으로 인해 20% ~ 40% 정도의 공간이 절약될 수 있다면 SPARSE 컬럼을 사용하라고 권고하는군요. 아래 표는 SPARSE 컬럼을 사용했을 때 40%의 공간을 절약하기 위해 필요한 NULL 값 비율을 데이터 타입 별로 나타내고 있습니다. 데이터 타입 NULL 비율 bit 98% tinyint 86% smallint 76% int 64% bigint 52% real 64% float 52% sm..
계륵 같은 SNAPSHOT 격리 수준 - SET TRANSACTION ISOLATION LEVEL SNAPSHOT SNAPSHOT 격리 수준에서는 행 버전이 관리되기 때문에 Lock을 걸지 않고도 commit된 버전의 행을 읽어 올 수 있습니다. 읽은 데이터의 일관성을 유지 할 수 있을 뿐더러... 읽기 작업에 Lock이 사용되지 않기 때문에 동시성이 좋아집니다. 하지만 행 버전을 관리하기 위한 오버헤드 (tempdb 사용, 데이터에 행 버전 정보 추가 등)도 무시할 순 없습니다. 결국 데이터베이스의 사용 패턴에 따라 선택해줘야 할 사항이 하나 늘었달까요? ^^ SNAPSHOT 격리 수준을 사용하려면 아래와 같이 데이터베이스를 세팅 해 주어야 합니다. ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION ON; 재미있는 것은 기존의 READ COMMITTED 격리 수준에서도 Lock 대신 행..
hierarchyid의 method 정리 휴... hierarchyid 공부 끝 ^^; 알고보면 기존 버전에서 계층형 설계에 사용하던 materialized path 개념과 같지만... 코드 작성은 훨씬 편해졌습니다. 이제 개념은 잡았으니... 메서드 목록만 적어 놓으면 될 듯... GetAncestor() 현재 항목의 n번째 상위 항목을 나타내는 hierarchyid를 반환합니다. child.GetAncestor(n) GetDescendant() 부모의 자식 노드를 반환합니다. parent.GetDescendant (child1, child2) parent가 NULL인 경우 NULL을 반환합니다. parent가 NULL이 아니고 child1과 child2가 모두 NULL인 경우 부모의 자식을 반환합니다. parent와 child1이 NULL이..