반응형

SQL서버에서는 VALUES를 기존 INSERT 문에서의 행의 값을 나열하는 목적 이외에 다양하게 활용이 가능한데 이 부분을 정리해 보겠습니다.

INSERT .. VALUES

가장 일반적으로 INSERT 할 데이터의 값을 나열하는 데 사용될 수 있습니다.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT', N'Feet', '20080414'); 

SQL서버 2008 이상에서는 VALUES가 다중 행의 값을 지정할 수 있습니다.
INSERT .. VALUES로 한 번에 여러 행(최대 1,000행 까지)을 삽입할 수 있습니다.

INSERT INTO Production.UnitMeasure  
VALUES (N'FT2', N'Square Feet ', '20080923'), (N'Y', N'Yards', '20080923')
    , (N'Y3', N'Cubic Yards', '20080923'); 

VALUES 다음에 하나의 행을 하나의 괄호로 묶고 쉼표로 구분해야 합니다.

VALUES의 괄호 안에 올 수 있는 값은 상수, 변수 또는 식입니다(단, 식은 EXECUTE 문을 포함할 수 없습니다).
따라서 다음과 같이 사용자 정의 함수를 사용할 수도 있습니다.

INSERT INTO MyTable
VALUES (1, dbo.MyFunc(10, 20)),
       (2, dbo.MyFunc(30, 40))

식이 가능하기 때문 다른 SELECT문이 포함될 수도 있습니다.

INSERT INTO dbo.MyProducts (Name, ListPrice)  
VALUES ('Helmet', 25.50),  
       ('Wheel', 30.00),  
       ((SELECT Name FROM Production.Product WHERE ProductID = 720),  
        (SELECT ListPrice FROM Production.Product WHERE ProductID = 720));  

SELECT .. FROM (VALUES)

INSERT뿐 아니라 SELECT의 FROM절에서도 VALUES를 사용할 수 있는데 일종의 가상 파생 테이블과 같다고 볼 수 있겠습니다.

SELECT a, b FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10) ) AS MyTable(a, b);

실행결과

앞서 INSERT .. VALUES에서 설명드린 것처럼 하나의 행을 하나의 괄호로 묶고 쉼표로 구분하면 됩니다.

CROSS APPLY (VALUES)

CROSS APPLY 의 VALUES에서 공급받은 행의 값을 이용하여 다양하게 활용할 수 있습니다.

CREATE TABLE #temp
(
    col1 int
,   col2 int
,   col3 int
,   col4 int
,   col5 int
)
INSERT #temp VALUES(1,2,3,4,5), (10,20,30,40,50)

SELECT 
    CASE WHEN a.col1 = b.col THEN b.col END AS col1,
    CASE WHEN a.col2 = b.col THEN b.col END AS col2,
    CASE WHEN a.col3 = b.col THEN b.col END AS col3,
    CASE WHEN a.col4 = b.col THEN b.col END AS col4,
    CASE WHEN a.col5 = b.col THEN b.col END AS col5
FROM #temp a
    CROSS APPLY (VALUES (a.col1),(a.col2),(a.col3),(a.col4),(a.col5)) b (col)

실행결과

MERGE .. USING (VALUES)

MERGE문의 USING에 VALUES를 통해서 파생 원본 테이블로 사용할 수 있습니다.

MERGE INTO Sales.SalesReason AS Target  
USING (VALUES ('Recommendation','Other'), ('Review', 'Marketing'), ('Internet', 'Promotion'))  
       AS Source (NewName, NewReasonType)  
ON Target.Name = Source.NewName  
WHEN MATCHED THEN  
UPDATE SET ReasonType = Source.NewReasonType  
WHEN NOT MATCHED BY TARGET THEN  
INSERT (Name, ReasonType) VALUES (NewName, NewReasonType)  
OUTPUT $action INTO @SummaryOfChanges;  

(응용) 열 데이터에 대하여 집계 함수 사용

다음과 같이 열 데이터를 행으로 전환하는데 VALUES를 이용하여 한 행의 여러 칼럼 값들에 대하여 집계 함수를 사용할 수 있습니다.

CREATE TABLE #temp
(
    col1 int
,   col2 int
,   col3 int
,   col4 int
,   col5 int
)
INSERT #temp VALUES(4,1,8,10,57), (17,21,130,12,48)

SELECT 
    col1, col2, col3, col4, col5
,   (   SELECT AVG(a) 
        FROM (VALUES (col1), (col2), (col3), (col4), (col5)) x(a)
    ) average
FROM #temp

실행결과

이 글이 도움이 되셨으면 추천과 댓글을 부탁드려요!

[참조]

INSERT(Transact-SQL)
테이블 값 생성자(Transact-SQL)

반응형
반응형

정기적으로 로그 백업을 하고 있다면 로그 파일 크기 내에서 재활용은 하겠지만, 대량의 트랜잭션이 발생하여 로그파일의 크기가 늘어나더라도 로그 백업을 통해 이미 늘어난 파일 크기가 줄어들지는 않습니다. 이로 인해서 불필요하게 디스크 공간을 차지하게 되므로 가끔씩 로그파일 크기를 줄여줄 필요가 있습니다.

현재 로그파일 크기 확인

sp_helpfile

sp_helpfile로 확인해 보면 현재 로그파일 크기가 9,024,448 KB로 나타납니다 (운영 중인 DB라 가렸습니다).

이는 탐색기에서 확인되는 사이즈와 동일합니다.

VLF 구성 확인

DBCC loginfo

DBCC loginfo로 로그파일의 VLF(가상 로그 파일)를 확인해 보면 81개로 구성되어 있음을 알 수 있습니다.

로그파일 크기 줄이기

sp_helpfile 조회 결과의 'name' 컬럼에 해당하는 이름이 로그파일명 입니다.

DBCC SHRINKFILE (로그파일명)

DBCC SHRINKFILE 명령이 정상적으로 수행되면 다음과 같이 결과를 보여 줍니다.

위에서 CurrentSize는 줄어든 후 로그파일의 페이지 수를 나타냅니다. SQL 서버에서 한 페이지는 8KB 이므로 KB로 변경하면 1,025,504 * 8 = 8,204,032 가 됩니다.

sp_helpfile로 다시 확인해보면 다음과 같습니다.

작업 직전에 로그 백업을 받고 진행하지 않아서 많이 줄어들지는 않았지만 그래도 크기가 줄어들었습니다.

DBCC loginfo로 재확인 해보면 VLF 개수가 80개로 줄었습니다.

참고로 쿼리로 로그 테이블의 초기 사이즈를 확인하기 위해서는 다음과 같이 하면 됩니다.

SELECT name, size * 8 AS init_size_KB, physical_name
FROM master.sys.master_files where database_id = DB_ID('데이터베이스명')

DBCC SHRINKFILE를 통해 줄어들 수 있는 최대치는 이 초기 사이즈이기 때문에 이하로는 줄어들지 않습니다.

[참조]

DBCC SHRINKFILE(Transact-SQL)

반응형
반응형

윈도우10의 WSL(Windows Subsystem for Linux. 리눅스용 윈도우 하위 시스템)을 버전 2로 올리는 방법 입니다.

저의 경우 WSL으로 Ubuntu가 설치되어 있어서 이를 기준으로 설명 합니다.

WSL 1과 2 차이점은 다음과 같습니다.

기능 WSL1 WSL2
Windows와 Linux 통합
빠른 부팅 시간
작은 리소스 공간
현재 버전의 VMware 및 VirtualBox에서 실행
관리 VM ×
전체 Linux 커널 ×
전체 시스템 호출 호환성 ×
OS 파일 시스템 간 성능 ×

특별히 윈도우와 WSL간에 파일 시스템을 공유할 필요가 없으면 WSL2를 사용하는 것이 성능과 Linux 호환성 측면에서 좋을 것 같습니다.

WSL 버전 확인

기존에 설치된 WSL의 버전을 확인 합니다.

wsl -l -v

WSL 기능 활성화

PowerShell에서 다음 명령을 실행 합니다 (단 PowerShell는 관리자 모드로 실행 되어야 합니다).

dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

VM기능 활성화

이어서 다음 명령을 실행 합니다.

dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

WSL2로 변환

다음 명령으로 WSL2로 변환작업을 진행 합니다. 시간이 약간 걸립니다.

wsl --set-version ubuntu 2

제대로 변환되었는지 확인하기 위해 버전을 다시 확인 해 봅니다.

사실 제 경우에는 WSL2로 변환 시 다음과 같은 오류가 발생 하였습니다.

가상 컴퓨터 플랫폼 Windows 기능을 사용하도록 설정하고 BIOS에서 가상화가 사용하도록 설정되어 있는지 확인하세요.

BIOS도 확인 했고 dism.exe 명령도 이상 없이 실행 했는데도 계속 오류가 발생 하였는데, 결국은 윈도우즈 업데이트를 하니까 해결이 되었습니다.

반응형
반응형

윈도우즈 터미널(Windows Terminal)은 윈도우 10에서 새로이 제공되는 CUI (Character User Interface) 환경입니다.

유니코드 및 UTF-8을 사용하기 때문에 다양한 언어의 이모지 및 문자 표시가 가능하고 GPU를 사용하여 텍스트를 렌더링 하므로 기존 환경보다 성능이 향상되었다고 합니다.

명령 프롬프트와 Power shell 그리고 WSL (Ubuntu 등 Windows Subsystem for Linux)을 하나의 프로그램에서 멀티탭으로 관리할 수 있고, 하나의 화면을 횡으로 종으로 분할하는 것도 가능합니다.

윈도우즈 터미널을 설치하기 위해서는 윈도우 10 버전이 2004로 업데이트 되어 있어야 합니다.

설치는 Microsoft store에서 하면 되는데 terminal로 검색하면 쉽게 찾을 수 있습니다.

 

받기를 누르면 별다른 과정 없이 곧바로 설치가 진행됩니다.

Windows 터미널을 실행하면 기본적으로 Power Shell 모드로 실행됩니다.

상단의 역 캐럿 모양을 클릭하면 명령 프롬프트, Ubuntu, Azure Cloud Shell을 새 탭으로 실행할 수 있습니다.

Alt+Shift+D 단축키를 눌러서 한 화면을 가로나 세로로 분할이 가능합니다.

설정 메뉴를 선택하면 settrings.json을 편집하는 창이 열리는데 여기서 단축키, 색상 등을 커스텀화 할 수 있습니다.

과거 IE만을 고집하며 호환성과 표준을 무시하던 마이크로소프트가 점점 오픈소스 생태계의 일원으로 개발자와 사용자를 위한 진정한 개발회사로 거듭나고 있는 것 같아서 다음 행보가 또 기대가 됩니다.

반응형

+ Recent posts