본문 바로가기

DBMS

(116)
[SQL Server] 가장 조각이 많이 난 인덱스 TOP 10 지속적인 데이터 변경 작업이나 데이터 입력에 따른 반복되는 페이지 분할과 같은 문제로 인해 인덱스에 조각화가 발생하고, 이는 당연히 인덱스를 통한 조회 성능이 저하되는 결과를 가져온다. 이런 경우 인덱스를 다시 구성(조각모음)하거나 다시 작성해서 조각화를 제거할 수 있다. sys.dm_db_index_physical_stats 동적 관리 함수를 조회해서 조각화가 심한 인덱스를 확인할 수 있다. -- 가장 조각이 많이 난 인덱스 TOP 10 SELECT TOP 10 DB_NAME() AS 'DatabaseName' , OBJECT_NAME(S.OBJECT_ID) AS 'TableName' , I.NAME AS 'IndexName' , ROUND(AVG_FRAGMENTATION_IN_PERCENT, 2) A..
[SQL Server] 별칭(Alias)을 지정하는 여러가지 방법 별칭(Alias)은 조인을 할 때 복잡한 테이블명을 간략화 할 수 있고, Self 조인을 할 때 한 테이블에 각각의 별칭을 주어 두개의 테이블처럼 조인을 할 수 있다. SUM, AVG, MAX, MIN과 같은 집계함수를 사용하면 컬럼명이 (열 이름없음)으로 나오게 되는데 별칭을 사용해서 컬럼명을 명확히 할 수 있다. 이처럼 테이블명과 컬럼명에 별칭을 지정하여 사용할 수 있다. 컬럼명에 별칭을 지정하는 방법은 여러가지가 있고, 아래와 같다. SELECT 1 AS NUMBER , 1 "NUMBER" , 1 'NUMBER' , 1NUMBER , 1"NUMBER" , 1'NUMBER' , 1 AS "NUMBER" , 1 AS 'NUMBER' , 1.NUMBER , 1."NUMBER" , 1.'NUMBER' , ..
[SQL Server] SELECT INTO 구문 사용시 복사되지 않는 것 SELECT INTO 구문은 새 테이블을 만든 후 쿼리의 결과 행을 새로 만든 테이블에 삽입한다. 주로 테이블의 데이터를 수정, 삭제할 경우 백업의 용도로 사용한다. 테이블을 복사할 때 제약조건, NULL, IDENTITY 등도 같이 복사되는지 확인해보자. USE TEMPDB GO CREATE TABLE TEST_1 ( IDX INT IDENTITY , NAME CHAR(6) NOT NULL , AGE TINYINT NOT NULL , GENDER TINYINT DEFAULT 1 -- 1:남, 2:여 , CONSTRAINT PK_TEST PRIMARY KEY(IDX) ) GO INSERT INTO TEST_1 VALUES ('박보영', 15, 2) , ('유인나', 20, 2) , ('신보라', 25, ..
[SQL Server] 한 테이블에 생성할 수 있는 인덱스의 최대 개수 한 테이블에 Clustered Index는 한 개만 생성할 수 있다는 것을 잘 알고 있다. 그렇다면 Nonclustered Index는 한 테이블에 몇 개까지 생성할 수 있을까? SQL Server 2005 버전까지는 149개, SQL Server 2008 버전 이후로는 999개의 Nonclustered Index를 생성할 수 있다. 내가 관리하는 DB들은 한 테이블에 인덱스가 10개를 넘는적을 못봤는데 한 테이블에 249개의 Nonclustered Index를 사용하는 경우가 있을까? 버전이 올라가면서 999개를 생성할 수 있도록 하였는데 필요에 의해 증가된 것일까? 1 Clustered Index + 249 Nonclustered Index = 250 Inde..
[SQL Server] GO 명령의 깜찍한 기능 Transact-SQL 문의 스크립트를 작성할 때 GO를 사용하며 일괄 처리의 끝을 알린다. 이 기능 외에 GO 명령 옆에 숫자를 적으면 그 숫자 횟수만큼 실행된다. 구문 GO [count] 인수 count 양의 정수입니다. GO 앞의 일괄 처리가 지정된 횟수만큼 실행됩니다. CREATE TABLE DBO.TEST_TBL ( COL1 INT , COL2 INT ) GO -- 지정된 횟수인 10번 만큼 INSERT 문을 실행한다. INSERT INTO DBO.TEST_TBL VALUES (1,2) GO 10 -- INSERT 문이 10번 실행되었는지 확인 SELECT * FROM DBO.TEST_TBL -- 2번의 SELECT 문을 실행한다. SELECT * FROM DBO.TEST_TBL GO 2 깜찍한..
[SQL Server] DELETE, TRUNCATE의 IDENTITY 초기화 여부 테이블의 구조는 남기고 모든 데이터를 지워야 할 경우 DELETE와 TRUNCATE를 사용할 수 있다. 이 때 테이블에 IDENTITY 속성이 있고 데이터는 지우되 다시 데이터를 입력할 때 이전에 사용하던 IDENTITY 값을 이어서 사용하고 싶으면 어떤 것을 사용해야할까? CREATE TABLE TEST_1 ( NUM INT IDENTITY (1,1) , NAME CHAR(6) ) GO CREATE TABLE TEST_2 ( NUM INT IDENTITY (1,1) , NAME CHAR(6) ) GO INSERT INTO TEST_1 VALUES ('아이유'), ('배수지'), ('강민경') INSERT INTO TEST_2 VALUES ('아이유'), ('배수지'), ('강민경') GO -- IDEN..
[SQL Server] NULL의 크기 SQL Server에서 NULL의 크기는 가장 큰 값일까 가장 작은 값일까? 테이블에 NULL 값을 넣고 정렬을 통해 NULL의 크기를 알아보자. CREATE TABLE TEST_NULL ( TEST INT ) GO INSERT INTO TEST_NULL VALUES (1), (10), (15), (90), (100), (NULL), (150) GO -- TEST 컬럼 오름차순으로 정렬 SELECT * FROM TEST_NULL ORDER BY TEST ASC NULL 값이 저장된 컬럼을 오름차순으로 정렬해 보았다. 결과에서 보는바와 같이 SQL Server에서의 NULL 값은 가장 작은 값임을 확인할 수 있다. 반대로 오라클에서는 NULL이 가장 큰 값이다.
[SQL Server] 유일한 값을 찾는 다양한 방법 가끔 여러 개의 값들 중 중복된 값을 제외한 유일한 값을 찾아야 할 때가 있다. 이 경우 DISTINCT 키워드를 주로 사용한다. 그러나 유일한 값을 찾는 방법은 많다. -- 테스트를 위해 테이블 생성 CREATE TABLE #SALES_DETAILS ( SALES_ID INT IDENTITY(1,1) , ITEM_ID INT NOT NULL , QTY INT NOT NULL , UNIT_PRICE DECIMAL(12,2) NOT NULL , SALES_DATE DATETIME NOT NULL ) GO -- 데이터 삽입 INSERT INTO #SALES_DETAILS (ITEM_ID,QTY,UNIT_PRICE,SALES_DATE) SELECT 1001,5,200,'2012-09-03 11:16:28' U..