안녕하세요. 이번 시간에는 SQL Server의 Sparse Column에 대해서 살펴보도록 하겠습니다. 실무에서는 많이 사용되고 있지는 않은 것 같아서 SQL Server의 경험이 있는 분들도 Sparse 칼럼이 생소할 수도 있을 것 같습니다. Spase 칼럼에 대해서 MS 공식 문서의 소개 문장은 아래와 같이 적혀 있습니다. "Null 값을 저장할 때 최적화 된 칼럼" 설명을 더 자세히 읽어보면 Sparse 칼럼을 사용할 때 Null 값에 대해서 약 20% ~ 40%의 공간을 절약할 수 있다고 하는데, 직접 테스트를 진행해서 확인해보도록 하겠습니다. * Sparse 칼럼은 Null이 아닌 값들에 대해서는 일반 칼럼보다 오히려 더 많은 공간을 소비하기 때문에 사용에 주의해야 합니다. ▶ Sparse 칼..
안녕하세요. 이번 시간에는 정렬되어 있는 인덱스를 사용할 경우 그렇지 않은 경우와 어떤 차이가 있는지 비교해보도록 하겠습니다. 인덱스의 정렬이 중요한 이유는 데이터가 인덱스 키 칼럼 순서로 정렬이 되어 있고, 동일한 순서의 ORDER BY 동작을 포함하는 쿼리를 수행할 때 실행 계획에서 SORT 동작이 생략되기 때문에 조회 성능을 높일 수 있기 때문입니다. ▶ 정렬 된 인덱스 성능 비교 테스트 먼저, 사용할 수 있는 인덱스가 없는 상태에서 ORDER BY 쿼리를 실행해보도록 하겠습니다. 1 2 3 4 SELECT RejectedQty, ((RejectedQty/OrderQty)*100) AS RejectionRate, ProductID, DueDate FROM Purchasing.PurchaseOrder..
안녕하세요. 이번 시간에는 SQL Server 인덱스의 Included Column 개념에 대해서 알아보도록 하겠습니다. SQL Server의 기본적인 인덱스로 사용되는 클러스터형 인덱스와 비클러스터형 인덱스에 대해서는 인덱스에 대해서 살펴본 지난 포스팅 글을 참고해주세요. ▶클러스터형 인덱스(Clustered Index) 참고 포스팅 [SQL Server] 클러스터형 인덱스(Clustered Index)와 비클러스터형 인덱스(Non Clustered Index) 비교 - 2: 비클 안녕하세요. SQL Server 인덱스의 핵심적인 두 분류인 클러스터형 인덱스(Clustered Index)와 비클러스터형(NonClustered Index) 인덱스에 대해서 알아보는 두 번째 시간으로 이번 포스팅에서는 비클..
안녕하세요. SQL Server 인덱스의 핵심적인 두 분류인 클러스터형 인덱스(Clustered Index)와 비클러스터형(NonClustered Index) 인덱스에 대해서 알아보는 두 번째 시간으로 이번 포스팅에서는 비클러스터형 인덱스에 대해서 살펴보도록 하겠습니다. 클러스터형 인덱스에 대한 내용은 아래의 지난 포스팅을 참고해주세요. [SQL Server] 클러스터형 인덱스(Clustered Index)와 비클러스터형 인덱스(Non Clustered Index) 비교 - 1: 클러 안녕하세요. SQL Server의 클러스터형 인덱스(Clustered Index)와 비클러스터형 인덱스(Non Clustered Index)를 비교하면서 알아보도록 하겠습니다. SQL Server의 인덱스는 크게 클러스터형..
안녕하세요. SQL Server의 클러스터형 인덱스(Clustered Index)와 비클러스터형 인덱스(Non Clustered Index)를 비교하면서 알아보도록 하겠습니다. SQL Server의 인덱스는 크게 클러스터형 인덱스와 비클러스터형 인덱스로 나누어진다고 볼 수 있고, 이번 포스팅에서는 먼저 클러스터형 인덱스에 대해서 살펴보도록 하겠습니다. 본격적으로 클러스터형 인덱스에 대해 살펴보기 전에 먼저 인덱스에 대해서 간단하게 말하자면, 인덱스는 책의 앞 부분에 있는 목차라고 생각하시면 좋습니다. 목차가 없다면 찾으려고 하는 내용을 만날 때까지 책을 한 장씩 넘겨가면서 모두 읽어야겠지만, 목차가 있기 때문에 책의 어느 위치에 원하는 내용이 있는지 알고 쉽게 찾을 수 있는 것이죠. 이와 같이 데이터베이..
안녕하세요. 이번 시간에는 SQL Server의 인덱스 재구성(Reorganize)과 리빌드(Rebuild)의 차이에 대해서 알아보도록 하겠습니다. 지난 포스팅에서 I/O의 단위가 되는 페이지에 새로운 데이터가 추가될 수 없는 경우 Page Split이 발생하게 되고 Page Split은 인덱스의 조각화(index fragmentation)을 야기해서 성능을 저하시킬 수 있다는 내용을 살펴보았습니다. 관련 내용은 아래의 포스팅을 참고해주세요. ▶ SQL Server Page Split 관련 포스팅 [SQL Server] Page Split(페이지 분할) 이해하기 안녕하세요. 이번 시간에는 SQL Server의 Page Split에 대해 알아보는 시간을 가지도록 하겠습니다. Page란, SQL Server..
안녕하세요. 이번 시간에는 SQL Server의 Page Split에 대해 알아보는 시간을 가지도록 하겠습니다. Page란, SQL Server 기본 I/O 단위로써, 하나의 Page에 8KB의 크기를 가지는데 데이터는 Page에 저장되게 됩니다. Page Split이란, 테이블에 Insert 혹은 Update 동작이 발생했을 때 새로운 데이터를 페이지에 추가할 수 있는 여유 공간이 없어서 페이지에 변화가 일어나는 것을 의미합니다. ▶ Page Split 예제 그럼 간단한 예제를 통해서 Page Split이 어떻게 발생하게 되는지 살펴보겠습니다. 먼저 다음과 같이 테이블을 생성하고 클러스터형 인덱스를 설정하겠습니다. SQL Server의 페이지 단위는 8KB라는 사실을 다시 기억해야 합니다. 그리고 페이..
안녕하세요. SQL Server를 사용 할 때에 데이터베이스의 테이블 간의 관계도를 확인하기 위해서 다이어그램을 생성하는 경우가 있습니다. 새로운 데이터베이스 다이어그램을 생성하려고 할 때 아래와 같은 오류가 발생하면서 생성이 안 되는 상황이 발생할 수 있습니다. ▶ 데이터베이스 다이어그램 생성 실패 오류 이 오류가 발생하는 경우는 다른 데이터베이스 서버에서 내려 받은 백업 파일 등으로 데이터베이스를 복원한 경우에 기존에 사용하던 해당 권한이 없어서 발생할 수 있는 오류입니다. 이 경우에는 직접 데이터베이스의 소유자를 명시해줌으로써 해결할 수 있습니다. ▶ 오류 해결 방법(데이터베이스 소유자 추가) 데이터베이스 우 클릭 -> 속성 -> 파일 -> 소유자 소유자에 'sa'를 추가합니다. 이렇게 데이터베이스..
안녕하십니까. 운영중인 SQL Server에서 사용하고 있는 모든 데이터베이스의 크기를 확인하기 위해서는 아래의 쿼리를 이용할 수 있습니다. ▶ 모든 데이터베이스 크기 확인하는 쿼리 1 2 3 4 5 6 7 8 9 10 USE master GO SELECT sys.databases.name , CONVERT(VARCHAR,SUM(size)*8/1024) +' MB' AS [Total disk space] FROM sys.databases JOIN sys.master_files ON sys.databases.database_id = sys.master_files.database_id GROUP BY sys.databases.name ORDER BY sys.databases.name 위의 쿼리를 실행하면 다..
안녕하세요. 이번 시간에는 자동증가 설정(Identity)이 걸려 있는 칼럼의 자동증가 숫자가 꼬였을 때 초기화 할 수 있는 방법을 살펴보려고 합니다. 자동증가로 설정되어 있는 열인 Id 열의 일련 번호의 일부분이 아래의 결과 화면처럼 지워져 버린 상황(5 이하의 숫자가 삭제되어 있음)에서 새롭게 레코드를 추가하면 비어 있는 Id인 1번부터 다시 순차적으로 입력되는 것이 아닌 테이블에 저장되어 있는 가장 마지막 숫자인 18의 다음 숫자인 19부터 Id 값이 부여되면서 레코드가 추가되게 됩니다. 이런 경우에 Id가 1번부터 다시 채워지면서 비어 있는 1~4의 숫자가 입력되게 하려면 다음의 쿼리를 사용해서 테이블의 자동증가 설정을 초기화 할 수 있습니다. ▶ 자동증가 값 초기화 쿼리 1 2 DBCC CHEC..
안녕하세요. SQL Server에서 각 테이블의 행 개수와 크기를 조회하고 싶은 경우에는 아래의 쿼리를 이용해서 한 번에 조회하는 것이 가능합니다. ▶ 모든 테이블 행 개수와 크기 조회하는 쿼리 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 SELECT s.Name AS SchemaName, t.Name AS TableName, p.rows AS RowCounts, CAST(ROUND((SUM(a.used_pages) / 128.00), 2) AS NUMERIC(36, 2)) AS Used_MB, CAST(ROUND((SUM(a.total_pages) - SUM(a.used_pages)) / 128.00, 2) AS NUMERIC(36, 2)) AS Unused_MB, CAST(ROUN..
안녕하세요. SQL Server에서 파티션 함수와 관련된 스크립트는 어떤 것들이 있는지 살펴보도록 하겠습니다. 데이터가 파티션에 나눠서 관리될 수 있도록 범위를 지정하는 역할을 파티션 함수(Partition Function)에서 설정하기 때문에 파티션함수에 대하여 기본적으로 알아두면 좋은 쿼리는 파티션 함수 생성, 삭제, 분할, 병합입니다. ▶ 파티션 함수 생성하기 1 2 3 4 --파티션 함수 생성 CREATE PARTITION FUNCTION myPartitionFunction (datetime) AS RANGE LEFT FOR VALUES (N'2012-05-31T00:00:00.000', N'2013-05-31T00:00:00.000', N'2014-05-31T00:00:00.000', N'201..