본문 바로가기

SQL Server/SQL Server Tip & Tech

(58)
RDB가 왜 관계형 데이터베이스? DB관련 블로그나 아티클을 찾다보면 아직도 종종 RDB에 대한 잘못된 해석(?)이 눈에 띄곤 합니다. Relational Database 우리말로 관계형 데이터베이스 이거 대표적인 오역.. 또는 무리한 번역입니다. 많은 사람들이 "관계형 데이터베이스"라는 이름으로부터 Primary - Foreign 참조 관계를 연상하기 때문이죠. Relation과 Relationship은 서로 다른 개념인데, 모두 "관계"라는 단어로 번역했으니 이런 문제가 생깁니다. 우리에게 익숙한 참조 관계는 Relationship이 맞지만, RDB의 Relational.. 명사형으로 Relation은 그냥 릴레이션이라고 부르는게 차라리 맞겠죠. (거의 아시겠지만.. 릴레이션은 튜플의 집합입니다.) 지금이라도 릴레이션형 데이터베이스라..
How to read SQL Server graphical query execution plans How to read SQL Server graphical query execution plans Written By: Tim Ford -- 11/4/2009 http://www.mssqltips.com/tip.asp?tip=1873
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를 확인해 다시..
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이..