본문 바로가기

데이터베이스

Merge 우선 테이블 Target, Source라고 명칭 붙어진 2개의 테이블이 있다고 가정한다. Target에 테이블에 데이터들을 Source 테이블 데이터들과 차이점을 비교하여 Target 테이블 내에 데이터들이 변경된다. 변경의 유형은 아래와 같이 3가지다. 1. Insert Source 테이블에는 있지만 Target 테이블에는 없는 행들은 Target 테이블에 Insert가 수행될 수 있다. 2. Delete Insert와 반대의 경우다. Target 테이블에는 있지만 Source 테이블에는 없는 행들은 Target 테이블에서 Delete가 수행될 수 있다. 3. Update Source 테이블과 Target 테이블의 키값이 같다. 하지만 키외의 컬럼에 값이 다르다면 Target 테이블에 이 행들에 대해 .. 더보기
Multi-statement table-valued functions in Sql Server Multi-statement table-valued function(MSTVFs)은 테이블을 반환 값으로 돌려준다. 그리고 이 반환되는 테이블의 구조는 사용자에 의해서 정의가 된다. MSTVFs는 하나 이상의 Statement를 포함할 수 있다. # MSTVFs Syntax Create Function Multistatement_TableValued_Function_Name ( @param1 DataType, @param2 DataType, .............. @paramN DataType ) Returns @OutputTable Table ( @Column1 DataTypeForColumn1, @Column2 DataTypeForColumn2 ) As Begin -- Function Body r.. 더보기
클러스터 인덱스, 비 클러스터형인데스 차이 # 클러스터 인덱스, 비 클러스터형 인데스 차이 구분 클러스터형 비클러스터형 사용목적 테이블 속 레코드들을 물리적으로 정렬하여 메모리에 저장 비클러스터형 인덱스는 데이터행의 논리적 순서를 만듦. 또 그 행에 접근하는 포인터를 가짐 저장방법 데이터 페이지를 리프노드 인덱스에 저장 리프노드 인덱스에 데이터 페이지 저장 안함 크기 큼 상대적으로 작음 접근속도 빠름 상대적으로 느림 추가디스크공간 필요없음 인덱스 저장을 위한 별도 공간 필요 키타입 디폴트로 테이블의 기본키가 클러스터형 인덱스가 됨 테이블에 독특한 제약조건 사용되고 복합키로 역할을 한다. 참고로 복합키는 각 튜플을 식별할 수 있는 두 개 이상의 속성들로 구성된 후보키 큰특징 클러스터 인덱스는 데이터 조회 성능을 향상시켜줌 조인에 사용되는 컬럼들을 .. 더보기
스칼라 함수(Scalar Function) 스칼라 함수(Scalar function)는 0개 이상의 파라메터를 받아 단 하나의 값을 반환하는 함수이다. 여러 쿼리에서 공통으로 사용되는 복잡한 연산이 있다고 하자. 그리고 이 연산의 결과는 하나의 값이다. 각 쿼리마다 이 연산을 코딩을 한다면 굉장히 번거로울 것이다. 물론 관리도 비효율적이다. 연산을 변경할때 이것을 사용하는 쿼리를 모두 찾아서 바꾸어 주어야 하니 정말 막노동이다. 하지만 이것을 스칼라 함수를 사용해서 처리토록하면 어떨까? 필요한 곳에 이 함수를 호출해서 결과만 받으면 된다. 스칼라 함수를 만들어 보자. Create Function [schema_name.]function_name (parameter_list) Returns data_type AS Begin statements re.. 더보기
테이블 반환 함수(table-valued function) 테이블 반환 함수란? 테이블 반환 함수는 테이블 데이터를 반환하는 사용자 정의함수이다. 테이블 반환 함수의 반환 타입이 테이블이므로 이 함수를 마치 테이블처럼 사용할 수도 있다. 테이블 반환 함수 만들기 # Products 테이블 생성 Create Table Products ( product_name nvarchar(100), model_year int , list_price money ) # 테이블에 데이터 입력 insert into Products values ('Sonata', 2020, 1000) , ('Avante', 2019, 700) , ('Santafe', 2020, 1200) # 테이블 반환 함수 생성 Create Function Fn_ProductInYear ( @Model_year i.. 더보기
반환 상태가 있는 저장 프로시저 사용 저장 프로시저(Stored Procedure) 내에서 반환값(Return Value)은 저장 프로시져의 실행 결과를 프로시저를 호출한 프로그램에게 알려주기 위한 용도로 사용되어 진다. 예를 들어 사용자로부터 이름을 받아 UserTable에 추가(Insert)하는 프로시저 UsingExistsStoredProcedure가 있다. 이 프로시저는 UserTable 내에 추가하고자 하는 값이 중복되는지 확인한 후, 중복값이 있을 경우 추가할 수 없으므로 처리 결과값으로 0을 그 반대의 경우는 추가 가능함으로 결과값 1을 되돌려 준다. 먼저 UserTable을 만들어 보자. create table UserTable ( UserID int IDENTITY(1,1) not null, UserName nvarchar(.. 더보기
Non clustered Index 비클러스터형 인덱스는 클러스터형 인덱스와 다르게 테이블 내에 데이터를 실제로 정렬하지는 않는다. 비클러스터형 인덱스는 인덱스와 데이터는 서로 다른 곳에 저장이 된다. 이러한 특징으로 비클러스터형 인덱스는 테이블 당 2개 이상의 비클러스터형 인덱스가 허용된다. 클러스터형 인덱스가 테이블당 하나의 인덱스가 있는 것과 다르게 비클러스터형 인덱스는 하나의 테이블에 여러 개의 인덱스를 만들 수 있다. 여기서 중요한 사실 하나는 테이블 내의 데이터가 클러스터형 인덱스 순서로 정렬이 되는 반면 비클러스터형 인덱스의 데이터는 어떤 특정한 순서로 정렬이 된다. 비클러스터형 인덱스는 컬럼에 값들과 그 컬럼값이 속하는 레코드의 주소가 포함된다. 인덱스를 생성한 컬럼에 대한 쿼리로 실행되면 데이터베이스는 먼저 인덱스로 이동하.. 더보기
Custom Clustered Index 이번에는 사용자가 정의한 클러스터 인덱스를 보자. Clustered Index와 같지만 사용자가 인덱스를 만드는데 정의되는 컬럼을 정한다는 것에서 그냥 Custom이라고 이름을 붙였으니 기존 Clustered Index와 다른 건가? 하고 생각하지 않았으면 좋겠다. 앞선 글에서 본 Student 테이블을 가지고 계속진행하겠다. Create Table Student ( Stud_id int Primary Key, Name nvarchar(10) not null, Dept_Cd nvarchar(10) not null, Mobile_Num nvarchar(13) not null, ) 우선 Student 테이블에 있던 인덱스는 삭제를 하겠다. SELECT name FROM sys.key_constraints W.. 더보기